VagrantでDockerを試してみる(公式のイメージを使った場合)
VagrantでCentOS7にDockerの環境を作ってみる
https://yk5656.hatenablog.com/entry/20201118/1605625200
の続き
DockerでApacheをインストールしてみる。
イメージの取得
どんなイメージがあるかどうかは「docker search キーワード」で検索できる。
$ docker search httpd NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 3299 [OK] centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 36 centos/httpd 33 [OK] ・・・
DockerHubのサイトでも検索できる。
Explore - Docker Hub
https://hub.docker.com/search?q=httpd&type=image
とりあえず、公式のイメージを取得する。
$ docker pull httpd
最新(latest)のイメージが取得できている。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest dd85cdbb9987 2 weeks ago 138MB
バージョンを指定したい場合は、「:タグ」を指定してpullする。
$ docker pull httpd:2.4.43
指定したバージョンのイメージが取得できる。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest dd85cdbb9987 2 weeks ago 138MB httpd 2.4.43 f1455599cc2e 4 months ago 166MB
イメージにどのようなタグがあるのかは イメージのTagsのページで確認できる。
httpd Tags - Docker Hub
https://hub.docker.com/_/httpd?tab=tags&page=1&ordering=last_updated
ちなみに、一度pullしたイメージが更新された場合、 再度pullすれば最新のイメージが取得できるみたい。
$ docker pull httpd
コンテナの作成&起動
createでコンテナを作成する。 httpdは80番ポートでアクセスする必要があるので「-p ホスト側のポート番号:コンテナ側のポート番号」も付ける。
$ docker create -p 80:80 httpd
「docker ps」だと稼働中のコンテナしか表示されないので、
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
「-a」をつけて全てのコンテナを表示すると、 コンテナが作られているのが確認できる。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e68eb5372ff httpd "httpd-foreground" 8 seconds ago Created boring_kowalevski
コンテナ名は「--name」で指定しないとランダムな名前になる。
renameで変更することも可能。
$ docker rename boring_kowalevski hoge
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e68eb5372ff httpd "httpd-foreground" 3 minutes ago Created hoge
作成したコンテナを「docker start コンテナ名」で起動する。 startにオプションを指定しない場合は、バックグラウンドで起動される。
$ docker start hoge
コンテナのステータスが「Up」になっている。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e68eb5372ff httpd "httpd-foreground" 13 minutes ago Up 6 seconds 0.0.0.0:80->80/tcp hoge
下記のURLをブラウザで表示すると、Apacheが起動しているのが確認できる。
(Vagrantfileでipを「192.168.33.10」に設定しています)
http://192.168.33.10/
起動したコンテナはstopで停止する。
$ docker stop hoge
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ちなみに、startに「-a」のオプションを付けると、 フォアグラウンドのモードで起動し、
$ docker start -a hoge AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Sat Dec 26 09:18:25.463975 2020] [mpm_event:notice] [pid 1:tid 140584375383168] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations [Sat Dec 26 09:18:25.464090 2020] [core:notice] [pid 1:tid 140584375383168] AH00094: Command line: 'httpd -D FOREGROUND' ・・・
Ctrl+C等で終了すると、コンテナも終了する。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
一度、バックグラウンドで起動したあと、
$ docker start hoge
attachで接続すると、フォアグラウンドの状態になり、
$ docker attach hoge ・・・
Ctrl+C等で終了すると、コンテナも終了する。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
作成したコンテナは、「docker rm コンテナ名」で削除できる。
$ docker rm hoge
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
イメージの削除
イメージはrmiで削除する。
$ docker rmi httpd $ docker rmi httpd:2.4.43
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE
runコマンド
runのコマンドを使うと、イメージのpullから、コンテナのcreate・startまで、まとめて行える。 オプションを指定しない場合、フォアグラウンドのモードで起動される。
$ docker run -p 80:80 httpd Unable to find image 'httpd:latest' locally latest: Pulling from library/httpd ・・・ AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Sat Dec 26 09:27:11.221729 2020] [mpm_event:notice] [pid 1:tid 140274489992320] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations [Sat Dec 26 09:27:11.221859 2020] [core:notice] [pid 1:tid 140274489992320] AH00094: Command line: 'httpd -D FOREGROUND' ・・・
下記のURLをブラウザで表示すると、Apacheが起動しているのが確認できる。
http://192.168.33.10/
Ctrl+C等で終了すると、コンテナも終了する。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
バックグラウンドのモードで起動する場合は「-d」のオプションを付ける。
$ docker run -d -p 80:80 httpd
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 24dbda9b921f httpd "httpd-foreground" 11 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp eloquent_austin
コンテナの停止はstop
$ docker stop eloquent_austin eloquent_austin
runコマンドの注意点は、毎回createするため、実行するたびにコンテナが作られていく。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 24dbda9b921f httpd "httpd-foreground" 5 minutes ago Exited (0) 44 seconds ago eloquent_austin 213e81b827df httpd "httpd-foreground" 7 minutes ago Exited (0) 6 minutes ago clever_johnson ・・・
なので、コンテナの削除が大変。
$ docker rm eloquent_austin $ docker rm clever_johnson ・・・ $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
しかし、「--rm」のオプションを付けると、
$ docker run -p 80:80 --rm httpd AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Sat Dec 26 09:48:59.401016 2020] [mpm_event:notice] [pid 1:tid 140242964956288] AH00489: Apache/2.4.46 (Unix) configured -- resuming normal operations [Sat Dec 26 09:48:59.401156 2020] [core:notice] [pid 1:tid 140242964956288] AH00094: Command line: 'httpd -D FOREGROUND' ・・・
Ctrl+C等で終了時にコンテナも削除してくれる。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
「-d」をつけてバックグラウンドで実行した場合も、stop時に同様に削除される。
$ docker run -d -p 80:80 --rm httpd $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c8af723b9677 httpd "httpd-foreground" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp trusting_goldstine $ docker stop trusting_goldstine $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
execコマンド
コンテナが起動している状態で
$ docker run -d -p 80:80 --name hoge --rm httpd $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 34f65957df04 httpd "httpd-foreground" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp hoge
「docker exec コンテナ名 コマンド ・・・」を実行すると、 コンテナの中でコマンドが実行できる。
$ docker exec hoge apachectl -v Server version: Apache/2.4.46 (Unix) Server built: Dec 11 2020 12:17:58
bashを実行することもできるが、オプションを指定しないと、 すぐ終了してしまう。
$ docker exec hoge /bin/bash (終了)
「-i」をつけて実行すると、インタラクティブなモードになって STDINをオープンし続けるらしい(よく分かってない)
$ docker exec -i hoge /bin/bash (入力を受け付けている状態)
試しにコマンドを実行してみると、実行できる。
pwd /usr/local/apache2
終了したい場合は、Ctrl+D等で終了できる。
「-t」も指定すると、端末が割り当てられて、下記のような感じになる。(よく分かっていない)
$ docker exec -it hoge /bin/bash root@…:/usr/local/apache2#