Docker ハンズオン資料は以下の環境を前提に動作確認をしています.
Docker Community Edition をインストールします.バージョンは最新にします.
インストール後に docker コマンドを実行できるようになっていれば,正常にインストールできています.
$ which docker
/usr/local/bin/docker
$ docker -v
Docker version 18.06.0-ce, build 0ffa825
$ docker infoDocker Community Edition の動作確認も兼ねて,さっそくコンテナを実行してみましょう.今回は Docker から公式に提供されている hello-world イメージを使います.
以下のように docker run hello-world と実行します.docker run は指定したイメージを実行するコマンドです.Hello from Docker! と表示されていれば,正常に実行できています.
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
(中略)
Hello from Docker!
This message shows that your installation appears to be working correctly.
(中略)次に docker imeges と実行します.ダウンロードしたイメージを確認することができます.今回使った hello-world イメージはたった 1.85kB と非常に軽量です.
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 2cb0d9787c4d 5 weeks ago 1.85kBもう少し実践的なコンテナを実行してみましょう.次は nginx 公式の nginx イメージを使います.
少しオプションが増えました.-d はコンテナプロセスをバックグラウンド実行する場合に指定します.-p はコンテナ内部のポートに接続する場合に指定します.今回は動作環境の 8888 ポートをコンテナ内部の 80 ポートに接続しています.
$ docker run -d -p 8888:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
(中略)さっそく http://localhost:8888/ に接続してみましょう.すると nginx に接続できます.
次に docker container ls と実行します.docker container ls は実行中のコンテナを一覧するコマンドです.続けて docker container kill と実行し,コンテナを停止します.すると nginx に接続できなくなります.
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3185885edcfb nginx "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 0.0.0.0:8888->80/tcp relaxed_shaw
$ docker container kill 3185885edcfb
3185885edcfb次に nginx イメージをベースにカスタマイズをしてみましょう.具体的には任意の index.html を追加したイメージを作成します.
まず,任意のディレクトリに kakakakakku/docker-hands-on リポジトリをクローンしましょう.事前に dockerfiles/nginx ディレクトリに Dockerfile と index.html を用意しています.Dockerfile はイメージの構築手順を記述したファイルです.index.html は今回 nginx に読み込ませるファイルです.
$ git clone https://github.com/kakakakakku/docker-hands-on.git
$ cd docker-hands-on
$ ls -l dockerfiles/nginxDockerfile は非常にシンプルです.先ほど動作確認をした nginx イメージをベースに index.html をコンテナ内部の /usr/share/nginx/html/index.html に配置しています.COPY はローカルからコンテナ内部にファイルをコピーするときに使います.
FROM nginx
COPY ./index.html /usr/share/nginx/html/index.html
さっそくイメージをビルドしてみましょう.以下のように docker build コマンドを実行します.今回は docker-hands-on-nginx というコンテナ名にしましょう.すぐにイメージが作成できます.
$ docker build -t docker-hands-on-nginx dockerfiles/nginx/
(中略)
Successfully tagged docker-hands-on-nginx:latest
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-hands-on-nginx latest e5c40748c226 27 hours ago 109MBカスタマイズしたイメージをすぐに実行できます.先ほどと同じ docker run コマンドを実行しましょう.
$ docker run -d -p 8888:80 docker-hands-on-nginx改めて http://localhost:8888/ に接続すると,カスタマイズした index.html を確認できます.
作成した docker-hands-on-nginx イメージを Docker Hub に公開しましょう.最初に Docker Hub でアカウントを取得します.
取得したアカウントを環境変数に設定します(ハンズオン資料として手順を共通化するためです).
$ export DOCKER_HUB_ACCOUNT=xxxxxxxxxx
$ echo ${DOCKER_HUB_ACCOUNT}次に Docker Hub にログインをします.
$ docker login
(中略)
Login Succeeded次にイメージを Docker Hub に公開します.今回は docker tag コマンドでイメージ名にアカウント名を追加し,docker push で Docker Hub に公開しています.
$ docker tag docker-hands-on-nginx ${DOCKER_HUB_ACCOUNT}/docker-hands-on-nginx
$ docker push ${DOCKER_HUB_ACCOUNT}/docker-hands-on-nginx自分の Docker Hub を確認すると,以下のように正常にイメージが公開できています.
Docker Compose を使うと,複数コンテナを実行することができます.Docker Compose の設定ファイルは dockerfiles/composetest/docker-compose.yml です.以下のような構成になり,services 直下を見ると web コンテナと redis コンテナを実行していることがわかります.
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"さっそく実行してみましょう.Docker Composer では docker-compose up コマンドを実行します.
$ docker-compose -f dockerfiles/composetest/docker-compose.yml up -d
Starting composetest_redis_1 ... done
Starting composetest_web_1 ... doneそして http://0.0.0.0:5000/ に接続してみましょう.ブラウザをリロードすると,アクセス回数をカウントするアプリケーションを簡単に実行することができました.
アクセス回数のデータはどこに保存されているのでしょう?実行中の redis コンテナに接続してみましょう.
まず docker ps コマンドで実行中のコンテナ一覧を確認します(CONTAINER ID は異なります).次に docker exec コマンドで redis コンテナに接続をします.コンテナ内部で Redis に接続し,保存されている hits キーの値を確認することができます.このように docker exec コマンドを使うとコンテナに接続することができます.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fc29424e6d0 composetest_web "python app.py" 14 minutes ago Up 14 minutes 0.0.0.0:5000->5000/tcp composetest_web_1
f20f5ec95f34 redis:alpine "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 6379/tcp composetest_redis_1
$ docker exec -it f20f5ec95f34 /bin/sh
/data # redis-cli
127.0.0.1:6379> GET hits
"10"
127.0.0.1:6379> quit動作確認後は Docker Composer を停止しておきましょう.
$ docker-compose -f dockerfiles/composetest/docker-compose.yml stop
Stopping composetest_web_1 ... done
Stopping composetest_redis_1 ... done



