Docker コマンドのまとめ

ただのメモです。

いろんなサイトからちょくちょくとってきました。

現在、実行しているDockerのコンテナ一覧を表示するには、docker psを利用します。 docker ps

過去に実行したコンテナの一覧を見ることができます。 docker ps -a

docker ps -aででてきたコンテナを使用するには、docker commitを実行します。 testというタグでイメージが作成。 docker commit 15cb2a03c788 centos:test

時間帯によってはアクセスが集中していて遅いです。 そんなときはimageを自作した方が早いかも docker pull centos

images を表示 docker images

作成したイメージから新たなDockerコンテナを起動するには、-t オプションの後ろにタグを指定します。 今回はbashを実行して実際にコンテナ内で作業をしてみます。この場合、-iオプションを付けて対話モードにしなければならないことに注意して下さい。

[code lang="text"] docker run -i -t REPOSITORY:TAG /bin/bash docker run -i -t centos:test /bin/bash [/code]

イメージに、リポジトリ名[タグ名]をつける docker tag IMAGE REPOSITORY[:TAG]

コンテナの終了 docker kill 65d63382ebac

コンテナの削除 docker rm

イメージの削除 docker rmi [IMAGE]

不要なイメージの削除は docker images で REPOSITORY が になっているものを削除すれば良いので、 docker rmi $(docker images | awk '/^<none>/ { print $3 }')

起動中のコンテナを綺麗さっぱり消すことができます。 docker ps -q | xargs docker stop | xargs docker rm

-d オプションでコマンドを実行しっぱなしにする。 このジョブにアタッチしてみる。 docker attach 79365b2985c4

アタッチ中の端末は Ctrl-p Ctrl-q でデタッチできる。(このとき use of closed network connection っていうエラーが出る場合 Ctrl-c で抜けるしかないっぽい。バグレポートは上がっているので、じきに直ると思う。)

コンテナをイメージとして保存する

[code lang="text"] docker commit <ID> <USERNAME/CONTAINER_NAME> [/code]

作業領域として今まで使用していたコンテナをイメージとして保存する。あとから使い回せるようになる。ユーザー名/名称 が一般的なようです。

[code lang="text"] docker commit b16 yss44/ping 2cea6b12c43f1ad1f57f47ef0cc9fde6341a87b0fb7afac4f5b2fa95ec593c40 [/code]

docker imagesコマンドで確認すると、httpdという名前のイメージができていることが確認できる。

[code lang="text"] docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE httpd latest 097a51f5048a 35 minutes ago 205.4 MB centos latest 0c752394b855 3 weeks ago 124.1 MB [/code]

同一リポジトリhttpdタグを付与して管理する場合には次のようにオプションを指定する。

[code lang="text"] docker commit default centos:httpd

docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos httpd 78620a15284f 4 seconds ago 205.4 MB centos latest 0c752394b855 3 weeks ago 124.1 MB [/code]

準備

コンテナのIDをいちいち保持しておくのは面倒,忘れるので,以下のaliasをホスト側で設定しておくと直近に起動したコンテナのIDを呼び出すことができるようになり便利 (15 Docker tips in 5 minutes).

[code lang="text"] alias dl=&#039;docker ps -l -q&#039; [/code]

コンテナ

コンテナを作成する.-dオプションでバックグラウンドで実行する.

[code lang="text"] docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" [/code]

コンテナを停止する.

[code lang="text"] docker stop dl [/code]

コンテナを起動する.

[code lang="text"] docker start dl [/code]

コンテナを再起動する.

[code lang="text"] docker restart dl [/code]

起動中のコンテナに接続する.

[code lang="text"] docker attach dl [/code]

コンテナ内のファイルをホストにコピーする.

[code lang="text"] docker cp dl:/etc/passwd . [/code]

ホストのディレクトリをコンテナにマウントする.

[code lang="text"] docker run -v /home/vagrant/test:/root/test ubuntu echo yo [/code]

コンテナを削除する.

[code lang="text"] dockr rm dl [/code]

早速コンテナを起動する。 このとき -p オプションを指定することでコンテナにポートフォワーディングでアクセスできるようになる。 この例ではコンテナを起動するホストの 8080 ポートとコンテナの 80 ポートを対応付けている。

[code lang="text"] docker run -i -p 8080:80 -t centos /bin/bash [/code]

ついでに、コンテナに付与されている IP アドレスを確認しておく。

[code lang="text"] ip addr show | grep inet inet 172.17.0.2/16 scope global eth0 inet6 fe80::2437:97ff:fe77:dd3f/64 scope link inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host [/code]

少し蛇足になるけどホスト側に戻ってネットワーク構成を確認してみる。 docker0 という Linux ブリッジがコンテナの持つ IP アドレスと同じプレフィックスが付与されて存在している。 これが怪しい。

[code lang="text"] ifconfig docker0 docker0 Link encap:Ethernet HWaddr FE:CD:1E:F7:36:8A
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::60a7:64ff:fe31:4928/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16499 errors:0 dropped:0 overruns:0 frame:0 TX packets:39474 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:706983 (690.4 KiB) TX bytes:56197495 (53.5 MiB) [/code]

接続状況を見ると、どうやら Virtual Ethernet Device が刺さっている。 この片割れがコンテナの中にあるインターフェースということか。

[code lang="text"] brctl show bridge name bridge id STP enabled interfaces docker0 8000.fecd1ef7368a no vethoBfYg0 [/code]

ひとまずコンテナの持つ IP アドレスも確認できたので wget を使ってアクセスしてみる。

[code lang="text"] wget -q -O - http://172.17.0.2/ Hello, World!! [/code]

上手くいった。 とはいえ、この IP アドレスはあくまでコンテナを起動しているホスト内に閉じたものだ。 外部からここに直接アクセスすることはできない。

ここで以前のオペレーションを思い出すと、そういえばポートフォワーディングでホストとコンテナのポートを対応付けていた。 どうせ Linux だから iptables の NAT だろ、と当たりを付けて調べてみる。

[code lang="text"] iptables -t nat -L -n | grep 80 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80 [/code]

やっぱりね。

自身の 8080 ポート宛にアクセスしてみる。

[code lang="text"] wget -q -O - http://localhost:8080/ Hello, World!! [/code]

ばっちり。 あとはコンテナを起動するホストに外部からアクセスを受け付けることのできる IP アドレスを振れば OK ということか。