はじめに
dockerコマンドのハンズオンにてnginxはよく利用されますが、コンテナ起動時のオプションにてPオプションやpオプションの付与が求められることがあります。
本記事では初学者の方に向けて簡単なハンズオンとp/Pオプションがないと何が困るのかについて分かりやすく説明します。
尚、コンテナとはなんぞ?という方は先に以下記事に目を通しておくことをおすすめします。
環境情報
- Windows10 + DockerDesktop
nginxコンテナのハンズオン
インターネットに繋がっている環境にて
> docker image pull nginxdemos/hello
> docker run -P -d nginxdemos/hello
この状態でブラウザに以下を入力すると
http://localhost:32768
nginxのデモ画面が表示されます。
ハンズオンの解説
以下、補足します。
イメージの取得
以下コマンドでコンテナイメージをローカル端末にダウンロードしました。
> docker image pull nginxdemos/hello
inspectでイメージ名を指定すれば以下のようにイメージの詳細情報が確認できます。
> docker inspect nginxdemos/hello
[
{
"Id": "sha256:aedf47d433f18c22663722b02...
"RepoTags": [
"nginxdemos/hello:latest"
],
...
"ExposedPorts": {
"80/tcp": {}
...
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.13.8"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ADD file:... in /usr/share/nginx/html/ "
],
..
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
...
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
...
"Architecture": "amd64",
"Os": "linux",
...これを見ればnginxが80ポートを開けて待っていること、nginxのバージョンが1.13.8なことなどが分かります。
イメージからコンテナを起動
いよいよ本題です。
ハンズオンでは以下でコンテナを起動しましたがPオプションがないとブラウザからアクセスができません。
> docker run -P -d nginxdemos/hello
コンテナ起動後にpsコマンドで起動したコンテナを見てみると
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ... nginxdemos/hello "nginx -g 'daemon of…" xx xx 0.0.0.0:32768->80/tcp xx
上に記載の通り、PORTSとして32768が80に変換されています。
要は、このホスト上のポートをコンテナ内のポートとマッピングするのが「Pオプション( --publish-all)」です。
ちなみに本オプションは32768 ~ 61000の中からランダムにホスト上のポートをアサイン(Publish all exposed ports to random ports)するので、先頭の32768が割り当てられたわけです。
pオプションとPオプションの違い
ではランダムではなく指定のポートをアサインできないのでしょうか?
それを行えるのがpオプションです。
具体的には以下のように起動すれば所定のポートで待ち受けさせることができます。
> docker run -d -p 33333:80 nginxdemos/hello ... > docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES xx nginxdemos/hello "nginx -g 'daemon of…" xx 0.0.0.0:33333->80/tcp xx
このようなホスト上のポートとコンテナ内のポートのマッピングはコンテナの世界では日常茶飯事で、複数のコンテナを管理するプラットフォームであるKubernetesでも以下のように同様の考え方は存在します。
最後に、起動済みのコンテナはpsコマンドで確認したコンテナIDに対して以下コマンドで停止&削除が可能です。
> docker rm -f <ID>
終わりに
dockerコマンドのPオプションとpオプションの違いは、Pオプションはランダムにホストのポートがアサインされますがpオプションでは自在にマッピングを指定できます。よってpオプションの方が使い勝手はいいですが、特にリクエストが無ければPオプションも利用可能です。
本記事がDockerハンズオンのご参考になれば幸いです。