Docker memo

Pocket

ただのメモです。

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

現在、実行している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オプションを付けて対話モードにしなければならないことに注意して下さい。

docker run -i -t REPOSITORY:TAG /bin/bash
docker run -i -t centos:test /bin/bash

イメージに、リポジトリ名[タグ名]をつける

docker tag IMAGE REPOSITORY[:TAG]

コンテナの終了

docker kill 65d63382ebac

コンテナの削除

docker rm `docker ps -a -q`

イメージの削除

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 で抜けるしかないっぽい。バグレポートは上がっているので、じきに直ると思う。)

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

docker commit <ID> <USERNAME/CONTAINER_NAME>

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

docker commit b16 yss44/ping
2cea6b12c43f1ad1f57f47ef0cc9fde6341a87b0fb7afac4f5b2fa95ec593c40

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

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

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

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

準備

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

alias dl='docker ps -l -q'

コンテナ

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

docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

コンテナを停止する.

docker stop `dl`

コンテナを起動する.

docker start `dl`

コンテナを再起動する.

docker restart `dl`

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

docker attach `dl`

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

docker cp `dl`:/etc/passwd .

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

docker run -v /home/vagrant/test:/root/test ubuntu echo yo

コンテナを削除する.

dockr rm `dl`

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

docker run -i -p 8080:80 -t centos /bin/bash

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

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 

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

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)

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

brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.fecd1ef7368a	no		vethoBfYg0

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

wget -q -O - http://172.17.0.2/
Hello, World!!

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

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

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 

やっぱりね。

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

wget -q -O - http://localhost:8080/
Hello, World!!

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

コメントを残す

メールアドレスが公開されることはありません。