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 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 サーバとして機能していることを確認します.まず,終了中のコンテナ web1
,web2
があることを確認します.
% 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 サーバもコンテンツ(内容)は同じであるので違いが分かりにくいですが,それぞれが動作していることを確認できました.
上の例では 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 ファイルをコンテナにコピーする方法について確認します.