VagrantでDockerを試してみる(自分でイメージを作る場合)
VagrantでCentOS7にDockerの環境を作ってみる
https://yk5656.hatenablog.com/entry/20201118/1605625200
の続き
dockerはCentOSに入れているが、
CentOS上でUbuntuのイメージを使うこともできるみたいなので、
今回はあえてUbuntuにApacheを入れてみる。
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が表示される。
コンテナからイメージを作成
一旦、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が表示できるのが確認できる。
ちなみに、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が表示できるのが確認できる。
補足
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
原因はよく分かっていない。