Dockerコンテナ間通信

Docker を使ったサービスでは、サービスを構成する各サーバプログラムをそれぞれ別のコンテナで立ち上げるのが一般的なようだ。例えばデータベース(MySQLなど)を利用する web アプリケーションであれば、つぎの3つのコンテナを立ち上げることになる:

  • データベースサーバ
  • web アプリケーションサーバ
  • HTTP サーバ

当然、これらを連携するにはコンテナ間をまたいだ通信をする必要がある。Docker にはコンテナ間通信を実現するネットワーク機能が備わっていて、各コンテナは同じ(Docker の)ネットワークに接続していれば、コンテナ名とポート番号を使って通信することができる。

今日はそのコンテナ間通信を試してみる。

題材と構成

先日作った書籍管理 web アプリと、HTTP サーバとして Nginx を前に立てる構成とする。上にはデータベースサーバが書いてあるけど、この書籍管理アプリはデータベースに Sqlite を使っているので、今回データベースサーバはなし。アプリケーションサーバと HTTP サーバ(Nginx)の2つだ。

コンテナ名は、アプリケーションサーバを bruschetta-back、HTTP サーバを nginx-c とする。この2つが Docker ネットワークで通信するわけだ。nginx-c は80番ポートをホスト側の8080ポートに接続する。ホスト側からは bruschetta-d というホスト名で nginx-c にアクセスできるようにしておく。

アプリケーションサーバ

先日作ったものなので詳細は省略。ただ、あいだに PC のリプレイスをはさんだので、イメージ名が bruschetta:1 に変わっている。内容は変更なし。

HTTPサーバ

全面に立てる HTTP サーバには、Docker Hub で公開されている Nginx こイメージをメースにして、アプリケーションサーバにつなぐための設定ファイルをコピーしたものを用意する。

Dockerfile はこう:

ROM nginx:1.17.10

COPY ./files/bruschetta-d /etc/nginx/conf.d/bruschetta-d.conf
RUN mkdir /var/log/nginx/bruschetta

CMD [ "nginx", "-g", "daemon off;" ]

この中でコピーしている Nginx の仮想ホストの設定ファイルはこうだ:

upstream uwsgi-bruschetta {
    server bruschetta-back:5000;
}

server {
    # port
    listen      80;

    # server name
    server_name bruschetta-d;

    # log files
    access_log /var/log/nginx/bruschetta/access.log combined;
    error_log  /var/log/nginx/bruschetta/error.log  warn;

    keepalive_timeout     60;
    proxy_connect_timeout 60;
    proxy_read_timeout    60;
    proxy_send_timeout    60;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://uwsgi-bruschetta;
    }

}

これで docker build した。

できたイメージの状況。

akatoh@apostrophe:docker$ docker image ls
REPOSITORY          TAG                IMAGE ID            CREATED              SIZE
nginx-c             1                  6f5be529ea6d        About a minute ago   127MB
bruschetta          1                  11afb91367ae        2 hours ago          451MB
nginx               1.17.10            9beeba249f3e        8 hours ago          127MB
ubuntu              20.04              1d622ef86b13        3 weeks ago          73.9MB

Docker ネットワークの作成

Docker ネットワークの作成は docker network create コマンドを利用する。

takatoh@apostrophe:docker$ docker network create nginx-network

これで nginx-network という名前の Docker ネットワークができた。つぎのようにすると様子が見える。

takatoh@apostrophe:docker$ docker network ls
NETWORK ID           NAME               DRIVER              SCOPE
d0c23099f6be         bridge             bridge              local
492e64e5d79d         host               host                local
7f38bac647a0         nginx-network      bridge              local
b42cbd843632         none               null                local

nginx-network 当名前が見える。ほかにもあるけど、これらはデフォルトで用意されているものらしい。詳細は調べてない。

コンテナの起動

2つのコンテナを起動する。その際、--netowork オプションで接続する Docker ネットワークの名前(今回は nginx-network)を指定する。また、HTTP サーバのコンテナの方でアプリケーションサーバの名前を bruschetta-back と指定しているので、これを間違えないようにする。

まずはアプリケーションサーバのコンテナから。

takatoh@apostrophe:docker$ docker run --name bruschetta-back --network nginx-network -d bruschetta:1

HTTP サーバ。ポートの指定も忘れずに。

akatoh@apostrophe:docker$ docker run --name nginx-front --network nginx-network -p 8080:80 -d nginx-c:1

ホスト側から確認

起動したコンテナは bruschetta-d というホスト名で待ち受けているので、/etc/hosts ファイルに 127.0.0.1 を指すように記述を追加する。それができたら準備は完了だ。http://bruschetta-d:8080/ にブラウザでアクセスしてみる。

結果、期待通りにアプリケーションにアクセス、使用できることが確認できた。

参考ページ

新しいPCにUbuntu 20.04 LTSをインストール

メインに使っている PC を買い替えた。

先日ダウンロードしておいた Ubuntu 20.04 LTS 日本語 Remix を DVD に焼いて(この作業は別の Windows マシンでやった)、プリインストールされていた Windows 10 は起動すらせずに上書きインストールした。ホスト名は替える前と同じ apostrophe。

OS のインストールが終わったら、とりあえずすぐに使いそうなソフトウェアだけインストールした。

  • rbenv と Ruby (2.7.1)
  • pyenv と Python (3.8.2)
  • Git
  • Sublime text
  • Dropbox
  • Tweaks
  • Docker

Python はデフォルトで入っていた(コマンドとしては python3)けど、今後を考えて pyenv を使った。Tweaks というのは、参考にした web ページにあった設定ツール。デスクトップまわりの設定ができる。

Docker についてはインストール方法を書いておこう。最初は先日 16.04 にインストールしたのを参考に作業をしたんだけどダメだった。えぇっ?と思いながらググってみると、apt コマンドでインストールできるようになっていた。

takatoh@apostrophe:~$ sudo apt install -y docker.io
takatoh@apostrophe:~$ sudo systemctl start docker
takatoh@apostrophe:~$ sudo systemctl enable docker

ついでに docker-compose もインストール(今後使う予定なので)。

takatoh@apostrophe:~$ sudo apt install -y docker-compose

あとはいくつか設定をカスタマイズして、データをバックアップサーバからコピーしてきて、ひとまずは完了。のこりは必要に応じてやっていこう。

参考にしたページ:

Dockerfileを書いてDockerイメージを作る練習→解決編

先日、Dockerfile を書いてイメージをビルドしたものの、コンテナが期待通りに動いてくれない、という記事を書いた。今日はその解決編。

結論を先に書くと、問題は Dockerfile じゃなくて Python のアプリケーションサーバである uWSGI の設定ファイルにあるつぎの行だった。

daemonize = file:/usr/bruschetta/bruschetta.log

この行をつぎのように書き換えたところ、期待通りに動いてくれて web アプリにアクセス、使用できるようになった。

logger = file:/usr/bruschetta/bruschetta.log

これは、なんとか原因を見つけようとして試行錯誤しながら「docker uwsgi」で検索に引っかかったいくつかのページを見ている時に気づいた。それらのページに載っている uWSGI の設定ファイルには daemonize = ... という記述がない。この記述は uWSGI にデーモンモードで動作するように指示する記述だ。そして、Dockerfile の CMD で指定したコマンドはコンテナの中でプロセス ID 1 で動作する、というのをどこかで読んだ。

つまり、こういうことだ。

  1. コンテナが起動すると、CMD で指定されている uWSGI がプロセス ID 1 で実行される。
  2. uWSGI はデーモンモードで動作するように設定ファイルで指定されているので、デーモンをフォークして自分自身は死ぬ。
  3. プロセス ID 1 のプロセスが死ぬと、コンテナも終了する。

実際に試してみよう。これが書きなおした uWSGI の設定ファイル。

[uwsgi]
http = :5000
chdir = /usr/bruschetta
wsgi-file = /usr/bruschetta/manage.py
callable = app
master = true
pidfile = /usr/bruschetta/bruschetta.pid
logger = file:/usr/bruschetta/bruschetta.log

上述したように最後の daemonize の行を logger に書き換えてある。Dockerfile も載せておく。

FROM ubuntu:20.04

RUN apt update && apt install -y python3 python3-pip git
RUN pip3 install uwsgi
RUN git clone https://github.com/takatoh/Bruschetta.git /usr/bruschetta
RUN cd /usr/bruschetta && pip3 install -r requirements.txt
COPY files/bruschetta.ini /usr/bruschetta/
RUN cd /usr/bruschetta && python3 manage.py init_db

CMD [ "/usr/local/bin/uwsgi", "/usr/bruschetta/bruschetta.ini" ]

こちらは、書き方は先日とちょっと変わっているが、実質的に変更無し。

これでビルドしたイメージからコンテナを起動する。

takatoh@apostrophe $ docker run -it -d -p 8080:5000 --name bruschetta-5 bruschetta:5

ブラウザで localhost:8080 アクセスすると、期待どおり web アプリが動作しているのを確認できた。

ちなみに、起動中のコンテナの中に入ってプロセスを確認してみると:

takatoh@apostrophe $ docker exec -it bruschetta-5 bash
root@423460e65b10:/# ps ax
  PID TTY      STAT   TIME COMMAND
    1 pts/0    Ss+    0:01 /usr/local/bin/uwsgi /usr/bruschetta/bruschetta.ini
    8 pts/0    S+     0:00 /usr/local/bin/uwsgi /usr/bruschetta/bruschetta.ini
    9 pts/0    S+     0:00 /usr/local/bin/uwsgi /usr/bruschetta/bruschetta.ini
   10 pts/1    Ss     0:00 bash
   21 pts/1    R+     0:00 ps ax

やっぱり、uWSGI がプロセス ID 1 で動いている。

教訓:コンテナで起動するプログラムはデーモンモードにするな

Dockerを一般ユーザで使えるようにする

これまで、docker コマンドを sudo 付きで実行してきた。そうしないと、パーミッションがない、と怒られるからだけど、面倒なので一般ユーザで実行できないか調べてみた。

こたえ: ユーザを docker グループに追加すればいい

というわけで、つぎのようにした。

takatoh@apostrophe $ sudo usermod -a -G docker takatoh

これで sudo をつけずとも実行できるようになった(↓のように)。

takatoh@apostrophe $ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
b                   latest              4e366dc7de8f        5 hours ago         451MB
bruschetta          1                   197d15517e40        5 hours ago         451MB
ubuntu              20.04               1d622ef86b13        2 weeks ago         73.9MB

Dockerfileを書いてDockerイメージを作る練習→うごいてくれない

今日は練習。

題材は自作の書籍管理webアプリ(GitHub)。これを Docker コンテナで動かすことを目指す。

あと、これまで CentOS を使ってきたけど、ふだんメインに使っているのが Ubuntu なのと、先月リリースされた 20.04 LTS が使える(Docker Hub にイメージがある)ようなので、これをベースにしてみる。

さて、一応やり方を覚えたとはいえ、いきなり Dockerfile をイチからかけるわけではないので、Ubuntu:20.04 のイメージからコンテナを起動して、必要なソフトのインストール、設定ファイルのコピーなど手作業でやりながら Dockerfile を書き起こす、というやり方をした。

書き上がった Dockerfile はこう:

FROM ubuntu:20.04
RUN apt update
RUN apt install -y python3 python3-pip git
RUN pip3 install uwsgi
RUN git clone https://github.com/takatoh/Bruschetta.git /usr/bruschetta
RUN cd /usr/bruschetta && pip3 install -r requirements.txt
RUN cd /usr/bruschetta && python3 manage.py init_db
COPY files/bruschetta.ini /usr/bruschetta/
CMD [ "/usr/local/bin/uwsgi", "/usr/bruschetta/bruschetta.ini" ]

ファイル構成:

takatoh@apostrophe $ tree .
.
├── Dockerfile
└── files
      └── bruschetta.ini
1 directory, 2 files

web アプリは Python 製なので、uWSGI で動かす。./files/bruschetta.ini はその設定ファイル。

[uwsgi]
http = :5000
chdir = /usr/bruschetta
wsgi-file = /usr/bruschetta/manage.py
callable = app
master = true
pidfile = /usr/bruschetta/bruschetta.pid
daemonize = /usr/bruschetta/bruschetta.log

これで準備は OK。Docker イメージをビルドする。

takatoh@apostrophe $ sudo docker build -t bruschetta:1 .

(略)

Successfully built 197d15517e40
Successfully tagged bruschetta:1

うまくいったようだ。

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bruschetta          1                   197d15517e40        3 minutes ago       451MB
ubuntu              20.04               1d622ef86b13        2 weeks ago         73.9MB

では、いま作ったイメージ bruschetta:1 を起動。

takatoh@apostrophe $ sudo docker run -it -d -p 8080:5000 --name bruschetta-1 bruschetta:1

これで、ブラウザで localhost:8080 にアクセスすれば web アプリに繋がる……はずなんだけど、つながらない。

コンテナの状況を見てみると:

takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
1dc9e16f813a        bruschetta:1        "/usr/local/bin/uwsg…"   5 seconds ago       Exited (0) 4 seconds ago                       bruschetta-1

STATUS が Exited になっている。どういうこと?

何が起きているのかを探るために、やり方をググるとつぎのページを見つけた。

このページに従ってまずはコンテナのログを見てみる。

takatoh@apostrophe $ sudo docker logs bruschetta-1
[uWSGI] getting INI configuration from /usr/bruschetta/bruschetta.ini

うーん、ちゃんと uWSGI が起動した(ということはつまり web アプリが起動した)ように見える。

じゃあつぎ、コンテナからイメージを作って、そのイメージからコンテナを起動し、中に入って様子を見る。コンテナからイメージを作るのは docker commit コマンド。

takatoh@apostrophe $ sudo docker commit bruschetta-1 b

一時的な用途のイメージなので b というテキトーな名前をつけている。これをつぎのように起動する。

takatoh@apostrophe $ sudo docker run --rm -it -p 8080:5000 b bash

これでコンテナの中には入れたので web アプリを起動してみる。

root@2ab03bb28bc5:/# /usr/local/bin/uwsgi /usr/bruschetta/bruschetta.ini
[uWSGI] getting INI configuration from /usr/bruschetta/bruschetta.ini

この結果どうなったかというと……期待通りに web アプリが動いた!

えぇ!?どういうこと?

[追記]

CentOS 7 のイメージをもとにして作っても、同じ現象に遭遇した。

Dockerfileを使ってDockerイメージを作る

昨日は手作業で構成した Docker コンテナから Docker イメージを作った。

だけど、この方法だと同じイメージを再度作るにも手作業を行わなければならない。全く同じイメージでいいならイメージを使い回せばいいけど、ちょっと何かを付け足したいとしたら?あるいは構成するソフトウェアをバージョンアップしたいとしたら?

Docker にはイメージを構成する手順を既述したファイル(Dockerfile という名前)を使ってイメージをビルドする機能がある。Dockerfile はテキストファイルなので、変更するのも簡単だし、何より Git 等で管理することができる。これは OS 設定などを含めたインフラ構築をコード化できることを意味していて、「Infrastructure as Code (IaC)」と呼ぶ。

今日は Dockerfile を記述して、それをもとに Docker イメージを作り、コンテナを起動するまでを試してみる。

目標

昨日と同じ、CentOS 上で Tomcat が動作するコンテナを作る。

参考ページと作業前の準備

つぎのページを参考にした。

また、混乱しないように、昨日までに作ったイメージとコンテナは全て削除した。

ファイル構成

つぎの通り:

takatoh@apostrophe $ tree .
.
├── Dockerfile
└── files
      └── apache-tomcat-9.0.34.tar.gz

Dockerfile のほかに ./files/apache-tomcat-9.0.34.tar.gz があるのは、コンテナの外(ホスト側)からコピーしたいから。コンテナの中でダウンロードしてもいいのかもしれないけど、昨日までの例に従って、予めダウンロードしておいたファイルをコピーする。

で、Dockerfile はつぎのように記述した。

FROM centos:7
RUN yum install -y java
ADD files/apache-tomcat-9.0.34.tar.gz /opt/
CMD [ "/opt/apache-tomcat-9.0.34/bin/catalina.sh", "run" ]

4行ある。各行は <命令> <引数> ... となっていて、Docker はこれを1行ずつ実行してイメージを構成する。順に見ていこう。

  • FROM はベースとなる Docker イメージを指定する。Dockerfile の命令は FROM で始まる必要がある。イメージがローカルになくても Docker Hub から取ってきてくれる。
  • RUN はコンテナの中で実行するコマンドを指示する。ここでは java をインストールしている。
  • ADD はホスト側にあるファイルをコンテナ内にコピーして展開する。
  • CMD はコンテナを起動した時に実行するコマンドを指定する。

イメージの作成

準備ができたので Docker イメージを作ろう。docker build コマンドを使う。

takatoh@apostrophe $ sudo docker build -t tomcat:1 .

-t オプションはイメージ名の指定、引数の . は Dockerfile のあるディレクトリを指定している。

これでイメージができた。

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
tomcat              1                   6f24f0e76833        About a minute ago   477MB
centos              7                   b5b4d78bc90c        2 days ago           203MB

tomcat というイメージがいま作ったもの。centos はベースとするために Docker Hub から撮ってきたものだ。

起動確認

最後に、ちゃんとコンテナが起動するか、確認しよう。

takatoh@apostrophe $ sudo docker run -it -d --name tomcat-1 -p 18081:8080 tomcat:1

ブラウザで localhost:18081 にアクセスすると、期待通り Tomcat が動いているのを確認できた。

DockerコンテナからDockerイメージをつくる

昨日は Docker Hub から取ってきた CentOS のイメージをもとにしてコンテナを起動し、Tomcat をインストールして動かしてみた。

今日は、そのコンテナから Tomcat インストール済みのイメージを作ってみる。

現状確認

まずは現状の確認。イメージから。

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   b5b4d78bc90c        39 hours ago        203MB

centos という名前のイメージがある。これは昨日 Docker Hub から取ってきたもの。

takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
2a1533db2a0e        centos:7            "/bin/bash"         31 hours ago        Exited (137) 31 hours ago                       tomcat

コンテナは tomcat という名前で残っている(停止中)。これは centos イメージから作ったものだ。

コンテナからイメージを作る

コンテナからイメージを作るには docker commit コマンドを使う。今回は tomcat コンテナから tomcat-image という名前のイメージを作った。

takatoh@apostrophe $ sudo docker commit tomcat tomcat-image

イメージのリストを見ると、いま作ったイメージの名前が見える。

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat-image        latest              fa94a527ab79        24 seconds ago      488MB
centos              7                   b5b4d78bc90c        39 hours ago        203MB

作ったイメージから新しいコンテナを起動

それじゃ、作ったばかりの tomcat-image からコンテナを起動してみよう。その前にログ用のディレクトリを作っておく。

takatoh@apostrophe $ sudo mkdir /var/log/tomcat-container2

で、コンテナ起動。コンテナ名は昨日のと被らないように tomcat2 とした。ホスト側のポートも 18082 にした。

takatoh@apostrophe $ sudo docker run -it -d -p 18082:8080 -v /var/log/tomcat-container2:/share/logs --name tomcat2 tomcat-image

コンテナの確認。起動した tomcat2 という名前のコンテナがあり、元になったイメージが tomcat-image であることがわかる。

takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS                     NAMES
e2735abcaf58        tomcat-image        "/bin/bash"         28 seconds ago      Up 26 seconds               0.0.0.0:18082->8080/tcp   tomcat2
2a1533db2a0e        centos:7            "/bin/bash"         31 hours ago        Exited (137) 31 hours ago                             tomcat

コンテナの中に入って Tomcat を起動。

takatoh@apostrophe $ sudo docker exec -it tomcat2 bash
[root@e2735abcaf58 /]# cd /opt/apache-tomcat-9.0.34
[root@e2735abcaf58 apache-tomcat-9.0.34]# ./bin/startup.sh

ホスト側のブラウザで localhost:18082 にアクセスすると、ちゃんと Tomcat が動いているのが確認できた。

今日はここまで。

DockerコンテナでTomcatを動かしてみる

Tomcat を題材にして、Docker コンテナとのやり取りを試してみる。つぎのページを参考にした。

CentOS 7 のイメージを取ってきてコンテナを起動

Docker Hub から CentOS7 のイメージを取ってくる。

takatoh@apostrophe $ sudo docker pull centos:7

後で使うので /var/log/tomcat-container ディレクトリを作っておく。

takatoh@apostrophe $ sudo mkdir /var/log/tomcat-container

コンテナを起動。-v オプションは、ホストとコンテナのディレクトリ共有のオプション(後述)。

takatoh@apostrophe $ sudo docker run -it -d -p 18080:8080 -v /var/log/tomcat-container:/share/logs --name tomcat centos:7

これで CentOS のコンテナが起動した。っていうか、Ubuntu 上で CentOS のコンテナを動かせるんだね。

Tomcatをダウンロードしてコンテナ内にコピー

公式サイトから Apache Tomcat をダウンロード。

takatoh@apostrophe $ wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz

ダウンロードしたファイルをコンテナ内にコピー。

takatoh@apostrophe $ sudo docker cp apache-tomcat-9.0.34.tar.gz tomcat:/opt/

コンテナ内に入ってJavaとTomcatをインストール

起動中のコンテナの中に入るには、docker exec コマンド。シェルに bash を指定している。

takatoh@apostrophe $ sudo docker exec -it tomcat bash

コンテナ内にて、まずは Java をインストール。

[root@f656baaeb4b8 /]# yum install -y java

つづいて Tomcat のインストール。というか、これはアーカイブファイルを展開するだけ。で、Tomcat を起動する。

[root@f656baaeb4b8 /]# cd /opt
[root@f656baaeb4b8 opt]# ls
apache-tomcat-9.0.34.tar.gz
[root@f656baaeb4b8 opt]# tar zxf apache-tomcat-9.0.34.tar.gz
[root@f656baaeb4b8 opt]# cd apache-tomcat-9.0.34
[root@f656baaeb4b8 apache-tomcat-9.0.34]# ./bin/startup.sh

これで OK。ホスト側のブラウザで http://localhost:18080/ にアクセスすると、ちゃんと Tomcat が動いているのが確認できた。

ホストとコンテナのディレクトリ共有

さて、Tomcat のログはコンテナの中にある。コンテナを停止したらログを見るためにはもう一度コンテナを起動する必要がある。さらに、コンテナを削除してしまったら、もうログを見る術はない。

ここで、ホストとコンテナのディレクトリ共有が生きてくる。docker run コマンドで指定した -v オプションだ。コンテナを起動するときに -v /var/log/tomcat-container:/share/logs と指定した。これでホストの /var/log/tomcat-container とコンテナの /share/logs が共有される。

いま、Tomcat のログファイルは、インストールしたディレクトリの下の logs ディレクトリに書きだされている(これが Tomcat のデフォルト)。そこでログファイルの出力先を /share/logs に変更する。

Tomcat をいったん停めて、設定ファイルを書き換えて、再起動。

[root@2a1533db2a0e apache-tomcat-9.0.34]# ./bin/shutdown.sh
[root@2a1533db2a0e apache-tomcat-9.0.34]# sed -i -e "s/\${catalina.base}\/logs/\/share\/logs/g" ./conf/logging.properties
[root@2a1533db2a0e apache-tomcat-9.0.34]# ./bin/startup.sh

これで、/share/logs ディレクトリにログファイルが出力されるようになった。

[root@2a1533db2a0e apache-tomcat-9.0.34]# ls -la /share/logs
total 20
drwxr-xr-x 2 root root 4096 May 6 05:04 .
drwxr-xr-x 3 root root 4096 May 6 04:59 ..
-rw-r----- 1 root root 5883 May 6 05:04 catalina.2020-05-06.log
-rw-r----- 1 root root    0 May 6 05:04 host-manager.2020-05-06.log
-rw-r----- 1 root root  408 May 6 05:04 localhost.2020-05-06.log
-rw-r----- 1 root root    0 May 6 05:04 manager.2020-05-06.log

ディレクトリ共有しているホストの /var/log/tomcat-container にも同じログファイルがあるのがわかる。

takatoh@apostrophe $ ls -la /var/log/tomcat-container
合計 20
drwxr-xr-x  2 root root   4096 5月 6 14:04 .
drwxrwxr-x 14 root syslog 4096 5月 6 13:19 ..
-rw-r-----  1 root root   5883 5月 6 14:04 catalina.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 host-manager.2020-05-06.log
-rw-r-----  1 root root    408 5月 6 14:04 localhost.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 manager.2020-05-06.log

これらはコンテナを停止しても見ることができる。

takatoh@apostrophe $ sudo docker stop tomcat
takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
2a1533db2a0e        centos:7            "/bin/bash"         12 minutes ago      Exited (137) 9 seconds ago                       tomcat
takatoh@apostrophe $ ls -la /var/log/tomcat-container
合計 20
drwxr-xr-x  2 root root   4096 5月 6 14:04 .
drwxrwxr-x 14 root syslog 4096 5月 6 13:19 ..
-rw-r-----  1 root root   5883 5月 6 14:04 catalina.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 host-manager.2020-05-06.log
-rw-r-----  1 root root    408 5月 6 14:04 localhost.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 manager.2020-05-06.log

とりあえずここまで。

Dockerコマンド(よく使いそうなもの)

状態の確認

コンテナの状態を確認。

takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
8f048cac2336        hello-world         "/hello"            2 days ago          Exited (0) 2 days ago                       vigilant_varahamihira

一昨日のエントリで走らせた hello-world のコンテナが残っている。vigilant_varahamihira っていう名前になってるけど、これは Docker かテキトーにつけた名前だろう。

イメージの確認は docker image ls

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

docker iamges でも同じ結果が得られる。

takatoh@apostrophe $ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

Dockerイメージの取得とコンテナの起動・停止

Docker Hub からイメージを取得して、コンテナ起動してみる。

イメージの取得は docker pull

takatoh@apostrophe $ sudo docker pull nginx

これで nginx イメージの取得ができた。確認してみる。

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              602e111c06b6        11 days ago         127MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

コンテナの起動は docker run

takatoh@apostrophe $ sudo docker run -d --name nginx-container -p 8181:80 nginx

オプションの意味はつぎの通り:

  • -d コンテナをバックグラウンドで起動
  • --name コンテナ名を指定
  • -p ホストとコンテナ間のポートフォワード設定。-p <ホスト側ポート>:<コンテナ側ポート>

コンテナの状態を確認すると、nginx-container という名前で起動している(STATUS が Up になっている)のがわかる。

takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                  NAMES
fc4887604124        nginx               "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes              0.0.0.0:8181->80/tcp nginx-container
8f048cac2336        hello-world         "/hello"                 2 days ago          Exited (0) 2 days ago                          vigilant_varahamihira

ブラウザで http://localhost:8181/ にアクセスすると Nginx のデフォルトページが表示された。

コンテナの停止は docker stop

takatoh@apostrophe $ sudo docker stop nginx-container

コンテナの状態を確認すると、STATUS が Exited になっている。

takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
fc4887604124        nginx               "nginx -g 'daemon of…"   8 minutes ago       Exited (0) About a minute ago                     nginx-container
8f048cac2336        hello-world         "/hello"                 2 days ago          Exited (0) 2 days ago                             vigilant_varahamihira

コンテナとイメージの削除

コンテナを削除するには docker container rm

takatoh@apostrophe $ sudo docker container rm nginx-container

イメージを削除するには docker image rm

takatoh@apostrophe $ sudo docker image rm nginx
takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

nginx イメージが削除されている。