神戸学院大学 経営学部 林坂ゼミ

Docker 入門トップページ

« 戻る 次へ »

Docker 入門

Docker はじめの一歩

Dockerfile でコンテナイメージ作成を自動化

前のページではコンテナを起動後にコンテナにログインして nginx をインストールするなどの操作を行って Web サーバを構築しました.ここでは,そのような処理を自動化するために Dockerfile を利用します.

まず,任意のフォルダを作成し,そのフォルダの中に Dockerfile という名称のファイルを作成し,次のような内容を記述します.すでにローカル環境にあるイメージ ubuntu:latest を指定していますが,イメージが存在しない場合は後のビルドの際にリポジトリからダウンロードされます.また,前のページで実行した ubuntu のアップデートと nginx のインストールが実行 (RUN) される指定になっていることも注意してください.

Dockerfile
FROM ubuntu:latest
RUN apt-get update -y && apt-get install nginx -y
ENTRYPOINT /usr/sbin/nginx -g "daemon off;"

プロジェクトのディレクトリに移動し,Dockerfile がカレントディレクトリに存在することを確認します.なお,Windows の場合は ls コマンドの代わりに dir コマンドを利用してください.

% cd [ディレクトリ名] ⏎
% ls ⏎  Windows では dir コマンド
Dockerfile
%

ローカル環境にあるイメージを一覧で確認しておきます.

% docker image ls ⏎
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
nginx_image   latest    574fd29fc459   5 minutes ago   172MB
ubuntu        latest    b60cb74dfa1b   2 weeks ago     101MB

Dockerfile をビルドして新たなイメージを作成します.なお,作成するイメージ名には nginx_dockerfile を指定します.また,. はカレントディレクトリの Dockerfile を参照することを意味しています.

% docker build -t nginx_dockerfile . ⏎
[+] Building 10.5s (6/6) FINISHED                                  docker:desktop-linux
 => [internal] load build definition from Dockerfile                               0.0s
 => => transferring dockerfile: 225B                                               0.0s
 => WARN: JSONArgsRecommended: JSON arguments recommended for ENTRYPOINT to preve  0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                   0.0s
 => [internal] load .dockerignore                                                  0.0s
 => => transferring context: 2B                                                    0.0s
 => [1/2] FROM docker.io/library/ubuntu:latest                                     0.0s
 => [2/2] RUN apt-get update -y && apt-get install nginx -y                       10.3s
 => exporting to image                                                             0.1s
 => => exporting layers                                                            0.1s
 => => writing image sha256:a80290eff45512b13e63f3c1a38fbaafa53e98eb745de6722eb3a  0.0s
 => => naming to docker.io/library/nginx_dockerfile                                0.0s

 1 warning found (use docker --debug to expand):
 - JSONArgsRecommended: JSON arguments recommended for ENTRYPOINT to prevent unintended behavior related to OS signals (line 3)

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/4kwclh2leelw5x8hcfhun3b3h

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview
%

新たなイメージ nginx_dockerfile が生成されたことを確認します.

% docker image ls ⏎
REPOSITORY           TAG       IMAGE ID       CREATED          SIZE
nginx_dockerfile     latest    a80290eff455   52 seconds ago   164MB
nginx_image          latest    574fd29fc459   16 minutes ago   172MB
ubuntu               latest    b60cb74dfa1b   2 weeks ago      101MB

イメージ nginx_dockerfile からコンテナを起動します.このとき,ローカル環境の 8082 番ポートをコンテナの 80 番ポートに接続します(前のページのポート番号とは異なっていることに注意してください).またコンテナ名は web2 としています.

% docker run -d -p 8082:80 --name=web2 nginx_dockerfile ⏎
fd75ea00551751f30ed8c59a54a5ba9afc9a812da4a50479c30fbe59244b4e1d

コンテナが起動すれば,ローカル環境の Web ブラウザから http://localhost:8020/ に接続して動作を確認します.

docker-04

実行中のコンテナの状態を確認するには docker stats というコマンドを利用します.この表示は1秒ごとに更新されます.表示を終了してプロンプトに戻るには Ctrl + C を押します.

% docker stats ⏎
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O     PIDS
fd75ea005517   web2      0.00%     6.004MiB / 7.654GiB   0.08%     3.14kB / 1.7kB   0B / 8.19kB   10

コンテナが動作していましたがこれを停止します.

% docker container ls ⏎
CONTAINER ID   IMAGE              COMMAND                   CREATED         STATUS         PORTS                                     NAMES
fd75ea005517   nginx_dockerfile   "/bin/sh -c '/usr/sb…"   2 minutes ago   Up 2 minutes   0.0.0.0:8082->80/tcp, [::]:8082->80/tcp   web2
% docker container stop web2 ⏎

ここまでで 8080 番ポートを利用するコンテナ web1 と 8082 番ポートを利用するコンテナ web2 を生成しました.これら 2 個のコンテナを同時に起動してそれぞれが Web サーバとして機能していることを確認します.まず,終了中のコンテナ web1web2 があることを確認します.

% docker container ls ⏎
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
% docker container ls -a ⏎
CONTAINER ID   IMAGE              COMMAND                   CREATED          STATUS                        PORTS     NAMES
fd75ea005517   nginx_dockerfile   "/bin/sh -c '/usr/sb…"   3 minutes ago    Exited (137) 23 seconds ago             web2
d0d9b8e5e5f1   nginx_image        "nginx -g 'daemon of…"   9 minutes ago    Exited (0) 7 minutes ago                web1
cead9bcb5598   ubuntu             "/bin/bash"               16 minutes ago   Exited (0) 12 minutes ago               nginx

二つのコンテナを順番に起動します.

% docker container start web1 ⏎
web1
% docker container start web2 ⏎
web2
% docker container ls ⏎
CONTAINER ID   IMAGE              COMMAND                   CREATED          STATUS         PORTS                                     NAMES
fd75ea005517   nginx_dockerfile   "/bin/sh -c '/usr/sb…"   3 minutes ago    Up 2 seconds   0.0.0.0:8082->80/tcp, [::]:8082->80/tcp   web2
d0d9b8e5e5f1   nginx_image        "nginx -g 'daemon of…"   10 minutes ago   Up 7 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web1

コンテナが起動できれば,ローカル環境で複数の Web ブラウザを起動して http://localhost:8080/ と http://localhost:8082/ にアクセスします.どちらの Web サーバもコンテンツ(内容)は同じであるので違いが分かりにくいですが,それぞれが動作していることを確認できました.

docker-05

上の例では Web のコンテンツは nginx の標準ページでした.次のページ ではオリジナルのコンテンツを掲載したいので,まずは nginx の設定ファイルを閲覧し,コンテンツを設置するディレクトリがどこであるかを確認しておきます.コンテナ内にある「/etc/nginx/sites-available/default」というファイルの中に「root」という設定があるので,その内容を次の手順で確認します.なお,必要に応じて cat コマンドおよび grep コマンドの詳細も参照してください.その結果,「/var/www/html」がドキュメントデータを設置すべきディレクトリであることが分かりました.

% docker exec -it web1 /bin/bash ⏎
root@d0d9b8e5e5f1:/# cat -n /etc/nginx/sites-available/default | grep root ⏎
    41          root /var/www/html;
    65          # deny access to .htaccess files, if Apache's document root
    85  #       root /var/www/example.com;
root@d0d9b8e5e5f1:/#

次のページではローカル環境で作成した index.html ファイルをコンテナにコピーする方法について確認します.