kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

危機感にかられて今更Dockerを学び直す人の記録(実践編)

Dockerエンジンのインストール

OSXならばこちら → Docker Store

  • 無償のcommunity editionと、有償のenterprise edition がある
  • Dockerは、linuxカーネルの機能を使うので、macwindowsで動かす場合は、小さいLinuxVMを内部で動かしているらしい

色々動かしてみる

こちらを参考に色々やってみた

qiita.com

バージョンの確認

$ 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 : コンテナの名前

詳細はこちらも参考

docs.docker.com

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 lsCOMMAND を見ると、メインのコマンドは、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

参考

docker exec を使いこなす – ユニコーンリサーチ

qiita.com