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/
f:id:yk5656:20201226190347j:plain

起動したコンテナは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/
f:id:yk5656:20201226190347j:plain

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#