Docker 入門
Docker はじめの一歩
Ubuntu を実行して nginx をインストール
次の例として,Docker で Ubuntu を実行し,メジャーな Web サーバの一つである nginx(エンジンエックス)をインストールしてみます.nginx の特徴についてはこちらを参照してください.まず,まだイメージがローカル環境に存在しないことを確認しておきます.
% docker image ls ⏎
REPOSITORY TAG IMAGE ID CREATED SIZE
続いて Docker リポジトリから最新 (latest) の ubuntu イメージをダウンロードします.
% docker pull ubuntu ⏎
Using default tag: latest
latest: Pulling from library/ubuntu
cc43ec4c1381: Pull complete
Digest: sha256:9cbed754112939e914291337b5e554b07ad7c392491dba6daf25eef1332a22e8
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview ubuntu
イメージがダウンロードできたことを確認します.
% docker image ls ⏎ REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest b60cb74dfa1b 2 weeks ago 101MB
イメージ ubuntu
からコンテナ名 nginx
を指定して起動し,bash にログインします.
% docker run -it --name=nginx ubuntu /bin/bash ⏎
root@cead9bcb5598:/#
Ubuntu を最新の状態にアップデートします.
root@cead9bcb5598:/# apt-get update ⏎
Get:1 http://ports.ubuntu.com/ubuntu-ports noble InRelease [256 kB]
Get:2 http://ports.ubuntu.com/ubuntu-ports noble-updates InRelease [126 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports noble-backports InRelease [126 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports noble-security InRelease [126 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports noble/multiverse arm64 Packages [274 kB]
Get:6 http://ports.ubuntu.com/ubuntu-ports noble/main arm64 Packages [1776 kB]
Get:7 http://ports.ubuntu.com/ubuntu-ports noble/restricted arm64 Packages [113 kB]
Get:8 http://ports.ubuntu.com/ubuntu-ports noble/universe arm64 Packages [19.0 MB]
Get:9 http://ports.ubuntu.com/ubuntu-ports noble-updates/universe arm64 Packages [1832 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports noble-updates/main arm64 Packages [1818 kB]
Get:11 http://ports.ubuntu.com/ubuntu-ports noble-updates/restricted arm64 Packages [3011 kB]
Get:12 http://ports.ubuntu.com/ubuntu-ports noble-updates/multiverse arm64 Packages [39.2 kB]
Get:13 http://ports.ubuntu.com/ubuntu-ports noble-backports/main arm64 Packages [48.8 kB]
Get:14 http://ports.ubuntu.com/ubuntu-ports noble-backports/universe arm64 Packages [35.6 kB]
Get:15 http://ports.ubuntu.com/ubuntu-ports noble-security/universe arm64 Packages [1110 kB]
Get:16 http://ports.ubuntu.com/ubuntu-ports noble-security/multiverse arm64 Packages [20.2 kB]
Get:17 http://ports.ubuntu.com/ubuntu-ports noble-security/main arm64 Packages [1477 kB]
Get:18 http://ports.ubuntu.com/ubuntu-ports noble-security/restricted arm64 Packages [2882 kB]
Fetched 34.1 MB in 12s (2815 kB/s)
Reading package lists... Done
root@cead9bcb5598:/#
Ubuntu に Web サーバである nginx と,Web サーバへリクエストを送信するためのツールである curl をインストールします.
root@cead9bcb5598:/# apt-get install nginx curl -y ⏎
Curl を使ってコンテナ自身にアクセスしますが,nginx がまだ起動していないので接続できませんでした.
root@cead9bcb5598:/# curl localhost ⏎
curl: (7) Failed to connect to localhost port 80 after 0 ms: Couldn't connect to server
root@cead9bcb5598:/#
nginx を起動します.
root@cead9bcb5598:/# nginx ⏎
root@cead9bcb5598:/#
もう一度 curl で接続するとトップページの HTML 文書が得られたようです.
root@cead9bcb5598:/# curl localhost ⏎
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>
root@cead9bcb5598:/#
しかしながら,現時点ではローカル環境の Web ブラウザから http://localhost/ に接続することはできません.
一旦,コンテナからログアウトします.
root@cead9bcb5598:/# exit ⏎
exit
%
イメージを一覧で表示し,起動中のコンテナがないこと,終了したコンテナ名が nginx
であることを確認します.
% docker image ls ⏎ REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest b60cb74dfa1b 2 weeks ago 101MB % docker container ls ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES % docker container ls -a ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cead9bcb5598 ubuntu "/bin/bash" 5 minutes ago Exited (0) About a minute ago nginx %
nginx をインストールした nginx
コンテナをイメージ nginx_image
として保存します.
% docker commit nginx nginx_image ⏎
sha256:574fd29fc45944fead36291b0a494af72ba0b9ed4601c5c373934f55a9cab0e7
イメージ nginx_image
が作成されたことが分かります.
% docker image ls ⏎ REPOSITORY TAG IMAGE ID CREATED SIZE nginx_image latest 574fd29fc459 11 seconds ago 172MB ubuntu latest b60cb74dfa1b 2 weeks ago 101MB
上で作成したイメージ nginx_image
からコンテナ名 web1
を指定して起動します.このとき,-d
オプションを指定することでコンテナがデーモン(バックグラウンドで動作してタスクを実行するプログラムのこと)として起動します.また,-p 8080:80
によってホスト側の 8080 番ポートをコンテナの 80 番ポートに接続します.また,docker で nginx を動かすには -g "daemon off;"
というおまじない(現時点ではその理解で十分です)も必要です.
% docker run -d -p 8080:80 --name=web1 nginx_image nginx -g "daemon off;" ⏎ d0d9b8e5e5f1fa203ffa87bf03e079991cd29af0fb6eeafea85fc80133c5f8b5 % docker container ls ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d0d9b8e5e5f1 nginx_image "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp web1
上のコマンドによってローカル環境の 8080 番ポートからコンテナに接続できるようになったはずなので,Web ブラウザから http://localhost:8080/ にアクセスします.すると次のように nginx のトップページが表示されました.
コンテナを終了させ,実際に終了していることを確認します.
% docker container stop web1 ⏎ web1 % docker container ls ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES % docker container ls -a ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d0d9b8e5e5f1 nginx_image "nginx -g 'daemon of…" 59 seconds ago Exited (0) 7 seconds ago web1 cead9bcb5598 ubuntu "/bin/bash" 7 minutes ago Exited (0) 3 minutes ago nginx
すると想像通り接続ができなくなりました.
コンテナを再び起動したり終了したりしてみます.まず,コンテナが一切起動していないことを確認します.
% docker container ls ⏎
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
終了しているコンテナの名前が web1
であることを確認します.
% docker container ls -a ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d0d9b8e5e5f1 nginx_image "nginx -g 'daemon of…" About a minute ago Exited (0) 33 seconds ago web1 cead9bcb5598 ubuntu "/bin/bash" 8 minutes ago Exited (0) 4 minutes ago nginx
コンテナ名 web1
を指定してコンテナを起動します.
% docker container start web1 ⏎
web1
コンテナが実行中であることを確認します.実行中は Web ブラウザから接続できることも確認すると良いでしょう.
% docker container ls ⏎
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0d9b8e5e5f1 nginx_image "nginx -g 'daemon of…" About a minute ago Up 3 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp web1
コンテナの実行を停止します.
% docker container stop web1 ⏎
web1