(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Docker】docker runコマンドのPオプションとpオプションの違い

スポンサーリンク

はじめに

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ハンズオンのご参考になれば幸いです。