コンテナに外部からアクセス(ポートフォワード)


外部からコンテナにアクセスするにはポートフォワードを使うと聞いたので試してみました。
apacheにしようとしたけど設定が面倒そう、node.jsにしようとしたけどインストールまでが長かったので、公式サイトのnginxを利用することにしました。
https://hub.docker.com/_/nginx/

上から読むとずらずら何かが出てくるので、まずはnginxのWelcomeページを表示させてみます。
その後、マウントしてHello Worldのhtmlを表示させてみます。
最後にDockerfileのCOPYを使ってコンテナにコピーしてからHello Worldのhtmlを表示させます。

runコマンドでWelcomeページを表示

  • ひとまず下記のコマンドを打ってみる
     -pオプションで、外部からアクセスされるポート番号:コンテナ側のポート番号を指定
     -dオプションはバックグラウンドで実行

    
    $ docker run --name some-nginx -d -p 8080:80 nginx
    
  • psで確認するとPORTSのところでフォワードされている

  • $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
    013518db8609        nginx               "nginx -g 'daemon off"   28 seconds ago      Up 28 seconds       443/tcp, 0.0.0.0:8080->80/tcp   some-nginx
    
  • アクセスしてみる
    http://localhost:8080/
    ポート8080でアクセスすると、nginxのポート80にフォワードされたので、Welcomeページが表示された!

nginxのコンテナ停止

  • 一旦nginxを落とす
$ docker stop 013518db8609

Hello Worldをマウントして表示

  • 簡単にHello WorldのHTMLファイルを用意し、/home/tiffany/nginx/index.htmlに保存
index.html
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <p>Hello World!</p>
  </body>
</html>
  • nginxを起動(今度はポートを8081にしてみる)。
    -vオプションで、マウント元(ローカルディレクトリ):マウント先(コンテナ側のディレクトリ)

  • $ docker run --name hello-nginx -v /home/tiffany/nginx:/usr/share/nginx/html:ro -d -p 8081:80 nginx
    
  • アクセスしてみる
    http://localhost:8081/
    Hello Worldの表示!

DockerfileでコンテナにHello Worldをコピーして表示

  • Dockerfileの作成
Dockerfile
FROM nginx
COPY html /usr/share/nginx/html
  • はじめてのCOPYでハマった… ローカル側は絶対パスではなく、読み込むディレクトリはDockerfileから見た相対パス(コンテナ側は絶対パス)
nginx/
├── Dockerfile
└── html
   └── index.html
  • ビルド
$ docker build -t hello-nginx .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-nginx         latest              c0f13486865d        10 minutes ago      132.8 MB
  • nginxの実行し、一応ポートを8082番にしてみたけど上記同様にHello Worldが表示された
$ docker run --name hello -d -p 8082:80 hello-nginx
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
1b734082ec74        hello-nginx         "nginx -g 'daemon off"   20 minutes ago      Up 20 minutes       443/tcp, 0.0.0.0:8082->80/tcp   hello