はじめに
職場の開発環境構築を自動化したいので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
Docker HubのNginx公式Dockerイメージ画面に遷移して、「Copy and paste to pull this image」の項目に記載されているコマンド(docker pull nginx
)をコピーします
メニューバーの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に繋がらなくなっていることがわかります。