中安拓也のブログ

プログラミングについて書くブログ

【Docker入門】とりあえずDockerでWebサーバ(Nginx)を動かしてみる

はじめに

職場の開発環境構築を自動化したいのでDockerの勉強を始めました。今回はDocker for MacのインストールからDockerを使用したNginxの起動までをやります。

バージョン情報

  • macOS High Sierra:@10.13.6
  • docker@18.09.2

インストール

Install Docker Desktop on Mac | Docker Documentation

まず、上記URLからDocker for Macをインストールします。

Nginxの起動と停止

続いてHello world的な目的で、インストールしたDockerからWebサーバーのNginxを起動してみましょう。

https://hub.docker.com/_/nginx

f:id:l08084:20190303155019p:plain
Docker HubのNginxのページ

Docker HubのNginx公式Dockerイメージ画面に遷移して、「Copy and paste to pull this image」の項目に記載されているコマンド(docker pull nginx)をコピーします

f:id:l08084:20190303155153p:plain
"Docker Desktop is running"

メニューバーのDockerアイコンをクリックしてDockerが起動状態になっているのを確認した後、ターミナルを開いてDocker Hubからコピーしたコマンドを実行します

$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
6ae821421a7d: Pull complete 
58702d4af197: Pull complete 
b165f42e8fd4: Pull complete 
Digest: sha256:18c0755594af107923baa2e65fcef35aea4ab0cea7862d19c27aa127bacb458e
Status: Downloaded newer image for nginx:latest

docker image lsコマンドでNginxのDockerイメージのダウンロードに成功したことを確認する

$ docker image ls nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              8c9ca4d17702        3 days ago          109MB

コンテナを作成するdocker container runコマンドを実行して、Nginxを起動します。下記のコマンドでは80番ポートを使用してDockerイメージの「nginx」から「tutorialserver」という名前のコンテナを起動しています

MacBook-Pro-2:~ takuya$ docker container run --name tutorialserver -d -p 80:80 nginx

54569771cfef520e2cf74b3b818d5177f6fbdc74bc6a2407adfd0656a79d89b7
docker: Error response from daemon: driver failed programming external connectivity on endpoint  tutorialserver (994db4b2efc0aac1059feb64515cfe2ae346db83c7f85dbe04d2ad8cf784fa13): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE).

エラーが出力されてdocker container runコマンドが失敗しました。80番ポートをすでに占有しているアプリケーションがないか確認します。

$ sudo lsof -i -P | grep "LISTEN"
Password:
httpd       91           root    4u  IPv6 0x5f4e4fd2058c6d59      0t0  TCP *:80 (LISTEN)
xartstora  209           root    3u  IPv4 0x5f4e4fd2058faa01      0t0  TCP *:61500 (LISTEN)
xartstora  209           root    4u  IPv6 0x5f4e4fd2058c7319      0t0  TCP *:61500 (LISTEN)
httpd     2214           _www    4u  IPv6 0x5f4e4fd2058c6d59      0t0  TCP *:80 (LISTEN)
httpd     2220           _www    4u  IPv6 0x5f4e4fd2058c6d59      0t0  TCP *:80 (LISTEN)
httpd     2221           _www    4u  IPv6 0x5f4e4fd2058c6d59      0t0  TCP *:80 (LISTEN)

上記コマンド(sudo lsof -i -P | grep "LISTEN")の結果、80番ポートを占有しているアプリケーションがApache httpdであることがわかります。

Nginx起動のために、Apacheの方は停止してしまいましょう。

$ sudo apachectl stop

Apacheを停止して80番ポートの競合を解決したところで再度、docker container runコマンドを実行します。

$ docker container run --name tutorialserver -d -p 80:80 nginx
docker: Error response from daemon: Conflict. The container name "/tutorialserver" is already in use by container "f93a6126da0db6d74fdf8b812fa7814ef02ad691acdb46e262abbdbb53a6b240". You have to remove (or rename) that container to be able to reuse that name

またエラーが発生しました。エラーメッセージからコンテナの名前(tutorialserver)が重複しているのが原因であることがわかります。

邪魔なコンテナを削除するか、作成するコンテナ名を変更しましょう。

コンテナ名をtutorialserver2に変更して再度コンテナの作成を実行します。

$ docker container run --name tutorialserver2 -d -p 80:80 nginx
786a573afe09b43fd880e9f1fc8153b646ac254f5aeed9d974918e9680fafcbb

今度こそ成功しました。http://localhost:80/をwebブラウザを開いてNginxサーバーが稼働していることを確認しましょう。

<figure class="figure-image figure-image-fotolife" title="Nginxの起動が成功している時の画面">[f:id:l08084:20190303172133p:plain]<figcaption>Nginxの起動が成功している時の画面</figcaption></figure>

起動したコンテナを停止したいときは、docker stop [コンテナ名]コマンドを使用します。

$ docker stop tutorialserver2 
tutorialserver2

http://localhost:80/を再びwebブラウザで開くと、コンテナ「tutorialserver2」が停止して、Nginxに繋がらなくなっていることがわかります。

f:id:l08084:20190303172723p:plain
コンテナを停止した時の画像

参考記事

Dockerで80番へポートマッピングした際に起きたエラーについて | Hodalog