Help us understand the problem. What is going on with this article?

Docker for Windowsでイメージからコンテナを生成/操作してみる

概要

Windows10にDocker環境を構築したのでいろいろ試してみた
今回はイメージからコンテナを生成/操作するDockerの最も基礎?となるコマンド一覧とまとめ

DockerとDockerコンテナの関連は以下を参照

 Dockerの基本機能と全体像のイメージを整理してみる

動作環境とDocker環境構築方法は以下を参照

  • Windows 10 Pro 64bit
  • Docker for Windows

 WindowsでDocker環境を試してみる

およその作業時間

1時間

参考書籍

プログラマのためのDocker教科書 第3章

わかりやすくてDockerの入門書的な良本です^^
みんな購入していて売れ行き好調なのか第2版が発売されていたのでリンク更新

【Kindle版】プログラマのためのDocker教科書

使用コマンド一覧

docker create イメージ名
docker start コンテナ名
docker run イメージ名
docker stop コンテナ名
docker rm コンテナ名
docker ps
docker exec コンテナ名 実行コマンド
docker rename 古いコンテナ名 新しいコンテナ名
docker cp コピーファイル コピー先
docker diff コンテナ名
docker commit コンテナ名 ユーザ名/イメージ:タグ名
docker export/import コンテナ名/ファイル名
docker save/load ファイル名 イメージ名
docker stats コンテナ名
docker restart コンテナ名
docker pause/unpause コンテナ名
docker attach コンテナ名
docker top コンテナ名
docker port コンテナ名
docker version
docker info

docker create イメージ名

引数で指定したイメージでコンテナを作成するコマンド
(作成だけでコンテナは起動していない状態)
--nameはオプションのため指定しなくてもいいが、後述のコマンドで扱いやすいようにコンテナ名を指定して実行

> docker create --name "test01" ubuntu
5895e42d62916323965656711815d360bf98899683fc737ad8ac2bc9671c1486

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
5895e42d6291        ubuntu              "/bin/bash"              5 seconds ago       Created                                        test01

docker ps -aでコンテナ一覧を表示して確認する
create直後はSTATUSがCreatedの状態となる

docker start コンテナ名

引数で指定したコンテナを起動するコマンド

>docker start test01
test01

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
923e87f7a1f5        ubuntu              "/bin/bash"              3 minutes ago       Exited (0) 2 seconds ago                       test01

ubuntuのイメージなど、startのみで特に何も指定していないイメージは起動してすぐに停止する

docker run イメージ名

コンテナの生成/起動を一度に行うコマンド
コンテナ上での処理実行用に様々なオプションが用意されている
いくつかコマンドサンプルを以下に記載

コンテナ内でbashを実行

-iでコンテナの標準出力、-tでtty(端末デバイス)を使う指定をすることで
"#"以降は、コンテナ内のコマンドとなるため通常のLinuxと同様のコマンドが実行可能
(exitの入力でコンテナから出るとともにコンテナが停止する)

>docker run -it --name "test01" ubuntu /bin/bash
root@a090d2d08f07:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a090d2d08f07:/#

コンテナ起動中は、docker psコマンドでコンテナの状態確認が可能
 STATUSがUpとなる

>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a090d2d08f07        ubuntu              "/bin/bash"              6 seconds ago       Up 5 seconds                                   test01

ネットワーク設定を指定して実行

-pでコンテナの80ポートをホストの8080ポートにマッピングするよう指定して実行
今回はバックグラウンド実行となるよう-dを指定したため、CONTAINER IDが返却される

>docker run -d -p 8080:80 httpd
6a790f3a798dbc9b0fe98fda0b43811424f02f47457b653598fe88fb4455e04a

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
6a790f3a798d        httpd               "httpd-foreground"   6 seconds ago       Up 4 seconds        0.0.0.0:8080->80/tcp   upbeat_hopper

CPU/メモリ/ディレクトリ共有を指定して実行

-pオプションでCPU、-mオプションでメモリを指定する
-vオプションは : の左辺がローカルフォルダ、右辺がコンテナ上のディレクリを指定する

>docker run -c=512 -m=512m -v=C:\Users\user\test01:/var/log --name "test01" ubuntu

注意

ディレクトリ共有にはShared Drivesの設定が必要
(共有するドライブにチェックを入れる)

image.png

Settingsの開き方は以下を参照
 WindowsでDocker環境を試してみる

Shared Drivesの設定で以下のエラーが出る場合は、エラーメッセージの通りfirewallの設定を見直してみる
(コマンド実行確認のためセキュリティソフトとWindowsFirewallを一時的にOFFにして実行してみたらエラーが解消された)

docker: Error response from daemon: Drive sharing seems blocked by a firewall.
See 'docker run --help'.

docker stop コンテナ名

引数で指定したコンテナを停止するコマンド

>docker stop test01
test01

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a090d2d08f07        ubuntu              "/bin/bash"              22 minutes ago      Exited (0) 7 seconds ago                       test01

docker rm コンテナ名

引数で指定したコンテナを削除するコマンド

>docker rm test01
test01

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES

docker ps

コンテナの一覧/状態を表示するコマンド

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
6a790f3a798d        httpd               "httpd-foreground"   6 seconds ago       Up 4 seconds        0.0.0.0:8080->80/tcp   upbeat_hopper

停止中のコンテナも表示する場合は-aを付ける

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
82b66212ca95        ubuntu              "/bin/bash"              5 seconds ago       Exited (0) 4 seconds ago                       test01

docker exec コンテナ名 実行コマンド

コンテナ上でコマンドを実行する

>docker exec -it test01 /bin/bash
root@f6b3175e3c1d:/usr/local/apache2#

例えば、バックグラウンドで起動しているコンテナにアクセスするために、bashを実行してコンテナ内で任意のコマンドを実行するために使用する

docker topコマンドを実行するとbashが起動していることが確認できる

>docker top test01
PID                 USER                TIME                COMMAND
7208                root                0:00                httpd -DFOREGROUND
7235                bin                 0:00                httpd -DFOREGROUND
7236                bin                 0:00                httpd -DFOREGROUND
7237                bin                 0:00                httpd -DFOREGROUND
7471                root                0:00                /bin/bash

docker rename 古いコンテナ名 新しいコンテナ名

コンテナ名を変更する

>docker rename test01 test02

docker cp コピーファイル コピー先

コンテナとファイルをやり取りする

  • コンテナ上のファイルをローカルに保存する
>docker cp test01:/usr/local/apache2/logs/httpd.pid C:\Users\user\Documents
  • ローカルファイルをコンテナ上にコピーする
>docker cp C:\Users\user\Documents\mod_httpd.pid test01:/usr/local/apache2/logs/

docker diff コンテナ名

イメージとコンテナとの差分を表示する

>docker diff test01
C /root
A /root/.bash_history
C /usr/local/apache2/logs
A /usr/local/apache2/logs/httpd.pid
A /usr/local/apache2/logs/mod_httpd.pid

docker commit コンテナ名 ユーザ名/イメージ:タグ名

コンテナからイメージを作成する

>docker commit test01 user/test1:0.1
sha256:e90b3d2f6a7c8473200652d53dcd2c3c18f03869639e1708dc568f37cbc557fc

>docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
user/test1                  0.1                 e90b3d2f6a7c        11 seconds ago      177MB

docker export/import コンテナ名/ファイル名

コンテナをファイル出力(export)し、ファイルからイメージを生成(import)するコマンド

>docker export test01 > test01.tar
>docker import test01.tar
sha256:021d244b9b95f8acbaf357887667b8e86df94085af1140baaa6ec037f94abd3a

>docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
<none>                      <none>              021d244b9b95        6 seconds ago       174MB

docker save/load ファイル名 イメージ名

イメージをファイル出力(save)し、ファイルからイメージを生成(load)するコマンド
export/importと違い、イメージをそのままsave/loadするためタグ名等もそのまま復元する

>docker save -o httpdsave.tar httpd
>docker load -i httpdsave.tar
540a7775e563: Loading layer [==================================================>]  3.584kB/3.584kB
f57aec6a98ba: Loading layer [==================================================>]   2.56kB/2.56kB
7e41cdcec3c2: Loading layer [==================================================>]   5.12kB/5.12kB
ab31df24cf72: Loading layer [==================================================>]  46.59MB/46.59MB
c7f490f23a8d: Loading layer [==================================================>]  10.29MB/10.29MB
25b1f3c8c9ad: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: httpd:latest

その他のコマンド

コンテナ起動時の環境指定

-eで環境変数指定
-wで作業ディレクトリ指定

> docker run -e 環境変数=値
> docker run -w ディレクトリ

コンテナ稼動確認

> docker stats コンテナ名

CONTAINER           CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
test01              0.01%               5.48MiB / 973.7MiB   0.56%               828B / 0B           2.92MB / 0B         82

Ctrl + C で停止する

コンテナ再起動

> docker restart コンテナ名

コンテナ中断/再開

> docker pause コンテナ名

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                  PORTS               NAMES
d3ef7a985ed4        httpd               "httpd-foreground"   3 minutes ago       Up 3 minutes (Paused)   80/tcp              test01

> docker unpause コンテナ名

コンテナへの接続

> docker attach コンテナ名

稼動していないと接続できない上に、docker execコマンドがあるため、いまいち使用ケースがわからない、、、

コンテナ上で実行されているプロセス確認

> docker top コンテナ名
PID                 USER                TIME                COMMAND
24488               root                0:00                httpd -DFOREGROUND
24516               bin                 0:00                httpd -DFOREGROUND
24517               bin                 0:00                httpd -DFOREGROUND
24518               bin                 0:00                httpd -DFOREGROUND

コンテナのポート転送確認

> docker port コンテナ名
80/tcp -> 0.0.0.0:8080

Dockerバージョン確認

> docker version
Client:
 Version:      17.09.1-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   19e2cf6
 Built:        Thu Dec  7 22:22:26 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.09.1-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   19e2cf6
 Built:        Thu Dec  7 22:28:28 2017
 OS/Arch:      linux/amd64
 Experimental: true

Docker実行環境確認

コンテナの状態やイメージ数を確認できる

> docker info
Containers: 6
 Running: 1
 Paused: 0
 Stopped: 5
Images: 27
~~~省略~~~
fkooo
JavaでWebアプリケーションを作る仕事をしつつ、自分の整理/伝える力の向上を目指して投稿しています(^^) 最近のテーマはいかに早く品質良く作る時のベストはなにか?です。 次のテーマを少しずつ投稿予定です。  AWS/Docker/Python/Heroku/Javaなど
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away