Docker で PHP 環境を作成する で ひとまず Docker なるものを使ってみたが、まだしっくりこないのでよさそうなまとめを実際に試しながら Docker に慣れようと思う。
参考:
Docker Hubは、Docker社が営利目的で開発・運営しているサービスです。 自分で作成したコンテナをアップロードして公開・共有することができます。
Docker HubにはCanonical、Oracle、Red Hat などのベンダやコントリビュータ(貢献者)によって公開され、 Docker 社によって認証を受けている、多くの 「公式リポジトリ」 があります。ユーザーはこれらを自由に使用することができます。 (コンテナイメージの検索・取得だけであれば、Docker Hubアカウントを作成しなくても利用できます。)
ざっくり
コンテナは「リポジトリ」という単位で管理され、タグを使ったバージョン管理も可能です。 無制限に作成できる公開リポジトリ(パブリックリポジトリ)のほか、一般公開されないプライベートリポジトリも作成できます。
ざっくり
まずは、httpdに関するコンテナがどれだけ公開されているのか、検索してみましょう。searchコマンドを実行します。
$ docker search httpd
※limitオプションを指定しない場合、25件が上限となります。 ※公式イメージのみを検索したい場合は、以下の様にfilterオプションを指定します。
$ docker search --filter "is-official=true" httpd
やってみる。
$ docker search httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3073 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 33
centos/httpd 29 [OK]
arm32v7/httpd The Apache HTTP Server Project 9
salim1983hoop/httpd24 Dockerfile running apache config 2 [OK]
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 1
publici/httpd httpd:latest 1 [OK]
solsson/httpd-openidc mod_auth_openidc on official httpd image, ve… 1 [OK]
jonathanheilmann/httpd-alpine-rewrite httpd:alpine with enabled mod_rewrite 1 [OK]
lead4good/httpd-fpm httpd server which connects via fcgi proxy h… 1 [OK]
dariko/httpd-rproxy-ldap Apache httpd reverse proxy with LDAP authent… 1 [OK]
dockerpinata/httpd 0
e2eteam/httpd 0
hypoport/httpd-cgi httpd-cgi 0 [OK]
interlutions/httpd httpd docker image with debian-based config … 0 [OK]
appertly/httpd Customized Apache HTTPD that uses a PHP-FPM … 0 [OK]
izdock/httpd Production ready Apache HTTPD Web Server + m… 0
manasip/httpd 0
amd64/httpd The Apache HTTP Server Project 0
trollin/httpd 0
manageiq/httpd_configmap_generator Httpd Configmap Generator 0 [OK]
itsziget/httpd24 Extended HTTPD Docker image based on the off… 0 [OK]
alvistack/httpd Docker Image Packaging for Apache 0 [OK]
manageiq/httpd Container with httpd, built on CentOS for Ma… 0 [OK]
ppc64le/httpd The Apache HTTP Server Project 0
スター順、更新があった順にならぶような感じがする。要検証。
公式イメージだけ検索する。
$ docker search --filter "is-official=true" httpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3073 [OK]
1 つだけになった。 nginx とかも検索してみる。
$ docker search --filter "is-official=true" nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 13374 [OK]
公式イメージの「httpd」があるので、それをpullコマンドでダウンロードしましょう。 ※バージョンを指定しない場合、最新版を取得します。
$ docker pull httpd
Using default tag: latest latest: Pulling from library/httpd … Status: Downloaded newer image for httpd:latest
最新版が取得できました。ではimagesコマンドで現在自分が保有しているイメージのリストを 確認してみましょう。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 2a51bb06dc8b 2 weeks ago 132MB hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
やってみる。
$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8559a31e96f4: Pull complete
bd517d441028: Pull complete
f67007e59c3c: Pull complete
83c578481926: Pull complete
f3cbcb88690d: Pull complete
Digest: sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
httpd の他、依存するものもいくつかダウンロードされているようだ。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest ccbcea8a6757 2 weeks ago 166MB
httpd のイメージが生成されたことも確認できた。
実際にコンテナイメージを起動してみます。
$ docker run -d -p 8080:80 httpd
コマンドが通ったら、ブラウザから「 http://localhost:8080 」へアクセスしてみましょう。「It Works!」画面が表示されれば成功です。
やってみる。
$ docker run -d -p 8080:80 httpd
789ab7aaf815af41ff511e616b64e698f0fd50d90c7f7a87a5e813a316d4e85c
ブラウザからアクセスする。
大丈夫そうだ。
nginx を http://localhost:8090 で動作させてみる。
$ docker run -d -p 8090:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
8559a31e96f4: Already exists
8d69e59170f7: Pull complete
3f9f1ec1d262: Pull complete
d1f5ff4f210d: Pull complete
1e22bfa8652e: Pull complete
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
48e23be10dbbe46b98a77a736a3836ca3365de374c64bc0620aa827b951d4bb3
docker pull
せずに docker run
をすると、自動で該当するコンテナを取得してきてくれる。
DockerリポジトリからイメージをPullする記述を省略していますが、 所有していないイメージをRunしようとした場合、自動的にPull→Runと動いてくれます。
ブラウザからアクセスする。
同じコンピュータ上に
という謎環境ができた。
docker run
コマンドの引数だが、
※(前回説明しませんでしたが)オプション「-d」は”バックグラウンドで動作”、 「-p」は”ポートの指定(ホスト8080番ポートへの通信を、コンテナ80番ポートへ転送)”となります。
-p [outside]:[container]
[outside]
のポートをコンテナの [container]
ポートに転送する-d
ということらしい。
psコマンドで、実行中コンテナの状態を確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7f389a9b265d httpd "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp xenodochial_hugle
httpdコンテナが起動している状態であることが確認できます。 ※NAMESは、コンテナ起動時にオプションで指定しない場合、Dockerがランダムな名称を付与します。
psコマンドに「-a」オプションをつけると、停止中も含め全てのコンテナが確認できます。
今度は「-a」オプションで、停止中のコンテナも含め全て表示してみましょう。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7f389a9b265d httpd "httpd-foreground" 26 minutes ago Exited (0) 5 minutes ago xenodochial_hugle fd861c5cb6e5 hello-world "/hello" 2 weeks ago Exited (0) 2 weeks ago nervous_kalam
ざっくり
docker ps
で動作中のコンテナを表示するdocker ps -a
で停止中も含め生存しているコンテナのプロセス一覧を表示するdocker ps
をやってみる。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48e23be10dbb nginx "/docker-entrypoint.…" 28 minutes ago Up 28 minutes 0.0.0.0:8090->80/tcp busy_varahamihira
789ab7aaf815 httpd "httpd-foreground" 32 minutes ago Up 32 minutes 0.0.0.0:8080->80/tcp inspiring_mendel
Apache と nginx が表示された。
stopコマンドでコンテナIDを指定し、コンテナを停止してみます。
$ docker stop 7f389a9b265d
5.コンテナの停止
起動と同様に、
docker stop <CONTAINER IDまたはNAME>
で停止することができます。$ docker stop 0b5aad08487b 0b5aad08487b
または、
$ docker stop big_hawking big_hawking
STATUSがExitedとなり、停止しているのが確認できます。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b5aad08487b ubuntu "/bin/bash" 38 minutes ago Exited (0) 9 seconds ago big_hawking
また、
docker start コマンドで起動させた場合でも、
docker attach後に
exit` コマンドで抜けると停止します。$ docker attach big_hawking root@0b5aad08487b:/#
root@0b5aad08487b:/# exit exit
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b5aad08487b ubuntu "/bin/bash" 42 minutes ago Exited (0) 4 seconds ago big_hawking
ざっくり
docker stop <ID>
で停止できるdocker stop <Name>
でも停止できるやってみる。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48e23be10dbb nginx "/docker-entrypoint.…" 28 minutes ago Up 28 minutes 0.0.0.0:8090->80/tcp busy_varahamihira
789ab7aaf815 httpd "httpd-foreground" 32 minutes ago Up 32 minutes 0.0.0.0:8080->80/tcp inspiring_mendel
$ docker stop 48e23be10dbb 789ab7aaf815
48e23be10dbb
789ab7aaf815
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48e23be10dbb nginx "/docker-entrypoint.…" 38 minutes ago Exited (0) 9 seconds ago busy_varahamihira
789ab7aaf815 httpd "httpd-foreground" 43 minutes ago Exited (0) 8 seconds ago inspiring_mendel
<ID>
や <Name>
は複数を指定することができるようだ。
停止するともちろんアクセスできない。
他に、
動作中のコンテナを強制終了したい場合は、killコマンドを実行します。実行するとコンテナは「Exited」になります。
$ docker kill 7f389a9b265d
ということもできるようだ。
停止中のコンテナを削除する場合は、rmコマンドを実行します。
$ docker rm 7f389a9b265d
コンテナの破棄
起動しているかどうかにかかわらず、コンテナを廃棄するには、 dockerコマンドにrmを付与し、コンテナIDまたはコンテナ名を指定します。 稼働中のコンテナに対して、docker rmに-fオプションを付与しないで実行すると、エラーになり、コンテナは破棄されません。 もし、稼働中のコンテナを強制的に破棄する場合は、-fオプションを付与します。
# docker rm test0002 Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f FATA[0000] Error: failed to remove one or more containers # docker rm -f test0002 test0002 #
Docker のコンテナは停止させてもプロセスは残り続けるので、どっかのタイミングでプロセスを消去する必要がありそうだ。
消去には docker rm
コマンドを利用するらしい。やってみる。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48e23be10dbb nginx "/docker-entrypoint.…" 38 minutes ago Exited (0) 9 seconds ago busy_varahamihira
789ab7aaf815 httpd "httpd-foreground" 43 minutes ago Exited (0) 8 seconds ago inspiring_mendel
$ docker rm 48e23be10dbb 789ab7aaf815
48e23be10dbb
789ab7aaf815
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
プロセスが完全に消えたことがわかる。