Dockerエンジンのインストール
OSXならばこちら → Docker Store
- 無償のcommunity editionと、有償のenterprise edition がある
- Dockerは、linuxカーネルの機能を使うので、macやwindowsで動かす場合は、小さいLinuxVMを内部で動かしているらしい
色々動かしてみる
こちらを参考に色々やってみた
バージョンの確認
$ docker version Client: Version: 17.09.0-ce API version: 1.32 Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:40:09 2017 OS/Arch: darwin/amd64 Server: Version: 17.09.0-ce API version: 1.32 (minimum version 1.12) Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:45:38 2017 OS/Arch: linux/amd64 Experimental: true
Dockerは、クライアント・サーバモデルなので、それぞれの情報が表示される
docker run
新しいコンテナを作成して、起動するコマンド
- イメージを元に、コンテナを起動する
- イメージが無い場合、Docker Hub から探してくる
以下は、nginx
というイメージを元に webserver
というコンテナを起動している
$ docker run -d -p 80:80 --name webserver nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx bc95e04b23c0: Pull complete f3186e650f4e: Pull complete 9ac7d6621708: Pull complete Digest: sha256:b81f317384d7388708a498555c28a7cce778a8f291d90021208b3eba3fe74887 Status: Downloaded newer image for nginx:latest 8d291801fd815f6bb8112842c4c1df2d0efd96162d3a28067258502186d3b061
複数のデータレイヤをダウンロードして、イメージを作成している
コマンドの解説
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d, --detach
: バックグラウンドで実行-p, --publish
: ホストマシンとコンテナのポートを接続する。左がホスト--name
: コンテナの名前
詳細はこちらも参考
docker container ls
でコンテナの状況を確認
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8d291801fd81 nginx "nginx -g 'daemon ..." 22 seconds ago Up 21 seconds 0.0.0.0:80->80/tcp webserver
localhost:80
にアクセスしてみる
nginxのデフォルト画面が出力される
$ curl http://localhost:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
コンテナ内に入る
docker attach
で入れるのは、コンテナがメインのコマンドとしてシェルが起動している場合のみ
適当にぐぐると、 docker attach
すると言われる
しかし、docker attach
で、コンテナの中をシェルで操作できるのは、メインのコマンドでシェルが起動しているコンテナのみ
今回の nginx
イメージは、docker container ls
の COMMAND
を見ると、メインのコマンドは、nginxをデーモンとして動かしている "nginx -g 'daemon ..."
そのため、docker attach
しても、nginxデーモンの標準出力が見えるばかりで、さらにそこから ^D
して脱出しようとすると、コンテナが終了してしまう...
docker exec -it 〜 /bin/bash
でメインのコマンドがシェルでないコンテナにも入れる
docker exec
は、対象のコンテナに任意のコマンドを実行するコマンド
$ docker exec -it webserver /bin/bash root@7fec1ea5a77b:/# exit
コマンドの解説
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-i, --interactive
: デタッチされるまで標準入力を受け入れるオプション-t, --tty
: 仮想端末をコンテナに当てるオプション- ちなみに仮想でない端末とは出力を物理的にアウトプットする「テレタイプ端末」のこと
コンテナに対して、インタラクティブな状態で、 /bin/bash
を実行している
コンテナの停止
$ docker container stop webserver
停止されたことを確認
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker container ls --all
で、停止中のコンテナも確認可能
$ docker container ls --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8d291801fd81 nginx "nginx -g 'daemon ..." About a minute ago Exited (0) 6 seconds ago webserver
コンテナの再開
$ docker container start webserver
コンテナの削除
$ docker container rm webserver
imageの確認
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 9e7424e5dbae 4 days ago 108MB
imageの削除
$ docker image rm nginx Untagged: nginx:latest Untagged: nginx@sha256:b81f317384d7388708a498555c28a7cce778a8f291d90021208b3eba3fe74887 Deleted: sha256:9e7424e5dbaeb9b28fea44d8c75b41ac6104989b49b2464b7cbbed16ceeccfc3 Deleted: sha256:7fcb1f7f8194a8cd7e706d4fc8a0f864cf48bf3937384c4b0a4797af05cc54c6 Deleted: sha256:70a75f17542ef0e6d2686f6ab9f89c22a859c0fe9f9c3abaddb1a893af4f476d Deleted: sha256:cec7521cdf36a6d4ad8f2e92e41e3ac1b6fa6e05be07fa53cc84a63503bc5700
削除されたことを確認
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE