VagrantでDockerを試してみる(自分でイメージを作る場合)

VagrantでCentOS7にDockerの環境を作ってみる https://yk5656.hatenablog.com/entry/20201118/1605625200
の続き

dockerはCentOSに入れているが、
CentOS上でUbuntuのイメージを使うこともできるみたいなので、
今回はあえてUbuntuApacheを入れてみる。

Ubuntuのイメージから手動で入れてつくる場合

Ubuntuのコンテナのbashに接続する

とりあえずubuntuのイメージを取得。

$ docker pull ubuntu

コンテナを作成。
今回はApacheを入れるので、80番ポートに接続できるようにしておく。

$ docker create --name hoge -p 80:80 ubuntu

ubuntuのコンテナが作成できた。
COMMANDは「/bin/bash」になっている。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS    PORTS     NAMES
14b53f005c39   ubuntu    "/bin/bash"   4 seconds ago   Created             hoge

しかし、startしてもすぐ終了してしまう。

$ docker start hoge

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
14b53f005c39   ubuntu    "/bin/bash"   2 minutes ago   Exited (0) 3 seconds ago             hoge

終了しないようにするるには、create時に「-it」オプションを付けておく必要がある。

一旦、削除し、

$ docker rm hoge

「-it」をつけて再実行。

$ docker create -it --name hoge -p 80:80 ubuntu

改めて起動すると、

$ docker start hoge

コンテナが終了せずに残っている。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS                NAMES
0e03d37d1de7   ubuntu    "/bin/bash"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   hoge

これで、attachで接続できる。

$ docker attach hoge
#

試しにpsコマンド実行すると、bashが起動しているのが確認できる。

# ps -A
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
    9 pts/0    00:00:00 ps

終了すると、コンテナも終了する。

# exit

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
1655ade26134   ubuntu    "/bin/bash"   3 minutes ago   Exited (0) 16 seconds ago             hoge

startに「-ai」をつけて起動すると、
attachした状態かつインタラクティブなモードで起動する。
(よく分かってないが、「-i」もつけないと、何入力しても反応しない)

$ docker start -ai hoge
#

runコマンドの場合

ちなみに、pullからcreate・start・attachまでを、runコマンドでまとめて行える。

$ docker run -it --name hoge -p 80:80 ubuntu
#
# ps -A
  PID TTY          TIME CMD
    1 pts/0    00:00:00 bash
    9 pts/0    00:00:00 ps

Apacheをインストール

とりあえず最新の状態にupdateしてから、Apacheをインストールする。
(途中、areaを聞かれるが「6. Asia」「79. Tokyo」を選択)

# apt-get update
# apt-get install -y apache2

index.htmlを作りたいが、viコマンドが入ってないので、一旦抜ける。
「ctrl+p」「ctrl+q」で、コンテナを終了せずに抜けることができる。

# (ctrl+p ctrl+q)

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS                NAMES
f89d8ccbc338   ubuntu    "/bin/bash"   6 minutes ago   Up 6 minutes   0.0.0.0:80->80/tcp   hoge

index.htmlを作成し、

$ vi index.html
<h1>Hello, world!</h1>

cpコマンドで送る。

$ docker cp ./index.html hoge:/var/www/html

改めて、接続し、

$ docker attach hoge

Apacheを実行する。

# apachectl -D FOREGROUND

これで、
http://192.168.33.10/
にアクセスすると、設置したhtmlが表示される。
f:id:yk5656:20201227181230j:plain

コンテナからイメージを作成

一旦、Apacheを止めて、コンテナを終了する。

(ctrl+c)

# exit

「docker commit コンテナ名 イメージ名」で、 コンテナからイメージを作成する。

$ docker commit hoge my-httpd

これで、コンテナからイメージが作成された。

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
my-httpd     latest    b9b03dc323c8   16 seconds ago   213MB
ubuntu       latest    f643c72bc252   4 weeks ago      72.9MB

しかし、commit時に特にオプションを指定しなかったので、
コンテナを作成してもCOMMANDが「/bin/bash」になっている。

$ docker create --name hoge2 -p 80:80 my-httpd

$ docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                       PORTS     NAMES
3b061b2ba638   my-httpd   "/bin/bash"   3 seconds ago    Created                                hoge2
f89d8ccbc338   ubuntu     "/bin/bash"   15 minutes ago   Exited (130) 4 minutes ago             hoge

一旦、作成したコンテナ・イメージを削除し、

$ docker rm hoge2
$ docker rmi my-httpd

「-c」オプションで、CMDを指定して、コミットする。
(必要なのかどうかよく分かってないがEXPORSEも一応指定しておく)

$ docker commit -c 'CMD ["apachectl", "-D", "FOREGROUND"]' -c 'EXPOSE 80' hoge my-httpd

改めてコンテナを作成すると、COMMANDが変わっているのが確認できる。

$ docker create --name hoge2 -p 80:80 my-httpd

$ docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS                       PORTS     NAMES
1634d3f58456   my-httpd   "apachectl -D FOREGR…"   5 seconds ago    Created                                hoge2
f89d8ccbc338   ubuntu     "/bin/bash"              19 minutes ago   Exited (130) 8 minutes ago             hoge

コンテナを起動すると、

$ docker start hoge2

HTMLが表示できるのが確認できる。

http://192.168.33.10/
f:id:yk5656:20201227181230j:plain

ちなみに、historyコマンドでイメージの履歴が確認できるが、 今回作成したイメージの履歴は下記の通り。

$ docker history my-httpd
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
3edc087ad8f7   24 seconds ago   /bin/bash                                       140MB
f643c72bc252   4 weeks ago      /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      4 weeks ago      /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>      4 weeks ago      /bin/sh -c [ -z "$(apt-get indextargets)" ]     0B
<missing>      4 weeks ago      /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   811B
<missing>      4 weeks ago      /bin/sh -c #(nop) ADD file:4f15c4475fbafb3fe…   72.9MB

Dockerfileを使ってイメージを作る場合

Dockerfileを作成。

$ vi Dockerfile
FROM ubuntu

RUN apt-get update && \
    apt-get install -y tzdata && \
    apt-get install -y apache2

COPY index.html /var/www/html/

EXPOSE 80

CMD ["apachectl", "-D", "FOREGROUND"] 

※下記の記事と同じエラーが出たので、「apt-get install -y tzdata」を追加しています

Ubuntu dockerイメージをbuildするときにタイムゾーン選択で止まる https://www.yamamanx.com/ubuntu-docker-build-timezone-stop/

index.htmlを作成。

$ vi index.html
<h1>Hello, world!</h1>

Dockerfileからイメージを作成。

$ docker build -t my-httpd .

イメージが作成された。

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
my-httpd     latest    89dd9a36af50   7 minutes ago   213MB
ubuntu       latest    f643c72bc252   4 weeks ago     72.9MB

イメージの履歴は下記のようになっている。

$ docker history my-httpd
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
89dd9a36af50   7 minutes ago   /bin/sh -c #(nop)  CMD ["apachectl" "-D" "FO…   0B
26925548e00a   7 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
17a07b1773a2   7 minutes ago   /bin/sh -c #(nop) COPY file:9e8f5072c2c05087…   24B
de45165cde0e   7 minutes ago   /bin/sh -c apt-get update &&     apt-get ins…   140MB
f643c72bc252   4 weeks ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      4 weeks ago     /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>      4 weeks ago     /bin/sh -c [ -z "$(apt-get indextargets)" ]     0B
<missing>      4 weeks ago     /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   811B
<missing>      4 weeks ago     /bin/sh -c #(nop) ADD file:4f15c4475fbafb3fe…   72.9MB

起動すると、

$ docker run -p 80:80 my-httpd

HTMLが表示できるのが確認できる。

http://192.168.33.10/
f:id:yk5656:20201227181230j:plain

補足

Apacheをインストールしようとした所、下記のエラーがでる場合があった。

# apt-get install -y apache2
・・・
The following packages have unmet dependencies:
 apache2 : Depends: apache2-bin (= 2.4.41-4ubuntu3) but it is not going to be installed
           Depends: perl:any
E: Unable to correct problems, you have held broken packages.

この場合、Vagrantをreloadした後、改めてupdateしてからApacheをインストールすると、うまくいった。

# apt-get update
# apt-get install -y apache2

原因はよく分かっていない。