はじめに
Docker入門中!
今回はDockerfileの使い方について学びます。VagrantfileとかRakefileとかそういう感じなのだろうね。makefileの派生というか。
Dockerfileを試してみる
centosのイメージからsampleというイメージを作ってみます。
[vagrant@docker ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE take/httpd 1.0 93fc9046f4e9 2 days ago 349.7 MB docker.io/mariadb latest 63d91190a69e 5 days ago 389.8 MB docker.io/ubuntu latest f753707788c5 6 days ago 127.1 MB docker.io/centos latest 980e0e4c79ec 6 weeks ago 196.7 MB
Dockerfile。FROMでもととなるDocker imageを指定。MAINTAINERは作者だそう。
[vagrant@docker ~]$ cat Dockerfile FROM centos:latest MAINTAINER take_she12
dockerbuild。指定するDockerfileはディレクトリじゃないとダメらしい。
[vagrant@docker ~]$ sudo docker build -t test:1.0 Dockerfile unable to prepare context: context must be a directory: /home/vagrant/Dockerfile
できたようです。
[vagrant@docker ~]$ sudo docker build -t test:1.0 ./ Sending build context to Docker daemon 358 MB Step 1 : FROM centos:latest ---> 980e0e4c79ec Step 2 : MAINTAINER take_she12 ---> Running in cd1b93420c5d ---> cbe7a70b9a39 Removing intermediate container cd1b93420c5d Successfully built cbe7a70b9a39 [vagrant@docker ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test 1.0 cbe7a70b9a39 4 minutes ago 196.7 MB take/httpd 1.0 93fc9046f4e9 2 days ago 349.7 MB docker.io/mariadb latest 63d91190a69e 5 days ago 389.8 MB docker.io/ubuntu latest f753707788c5 6 days ago 127.1 MB docker.io/centos latest 980e0e4c79ec 6 weeks ago 196.7 MB
phpipamをdockerコンテナ上で作る
以前phpipamの構築メモを残してます。
これをDockerコンテナ上でやってみましょう。
というわけでドカドカDockerfile書きます。
[vagrant@docker ~]$ cat Dockerfile FROM centos:latest MAINTAINER take_she12 RUN yum install -y php php-gd php-mbstring php-mysql php-pear mariadb-server httpd COPY my.cnf /etc/my.cnf COPY php.ini /etc/php.ini COPY httpd.conf /etc/httpd/conf/httpd.conf CMD systemctl start mysqld CMD systemctl enable mysqld CMD mysql -uroot -e "set password for root@localhost=password('PassWord');" COPY phpipam-1.2.1.tar ./ CMD tar xvf phpipam-1.1.010.tar CMD mv phpipam/{.htaccess,api,css,db,functions,index.php,install,js,misc,site,upgrade,config.php} /var/www/html/ CMD chown -R apache:apache /var/www/html/ CMD systemctl start httpd CMD systemctl enable httpd CMD setenforce 0 CMD sed -i -e "s/SELINUX=disabled/SELINUX=permissive/g" /etc/selinux/config
COPYするもの、/vagrant/以下に置けばホストと共有できるから楽なんだけど、どうもそんなもんないと言われたので、こんな風にカレントに散らかってます。
[vagrant@docker ~]$ ls Dockerfile httpd.conf httpd.tar my.cnf php.ini phpipam-1.2.1.tar
Dockerfileからイメージを作ります。
[vagrant@docker ~]$ sudo docker build -t phpipam:1.0 ./ Sending build context to Docker daemon 367.5 MB Step 1 : FROM centos:latest ---> 980e0e4c79ec Step 2 : MAINTAINER take_she12 ---> Using cache ---> cbe7a70b9a39 Step 3 : RUN yum install -y php php-gd php-mbstring php-mysql php-pear mariadb-server httpd ---> Running in d8a0c5a39d86 Loaded plugins: fastestmirror, ovl Determining fastest mirrors (省略) Removing intermediate container ffc17d59e5a9 Step 17 : CMD sed -i -e "s/SELINUX=disabled/SELINUX=permissive/g" /etc/selinux/config ---> Running in 56dbf65b1f8c ---> dbe675a1a337 Removing intermediate container 56dbf65b1f8c Successfully built dbe675a1a337
yumが結構時間かかる。
立ち上げます。
[vagrant@docker ~]$ sudo docker run --privileged -h phpipam -d -p 80:80 --name phpipam phpipam:1.0 /sbin/init ceda0283656d4428e519bb787aa9c4602db9bc1f851a9c1e6b0860b63c8b0b27 [vagrant@docker ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ceda0283656d phpipam:1.0 "/sbin/init" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp phpipam
拒否られた(笑)
[vagrant@docker ~]$ curl localhost curl: (56) Recv failure: 接続が相手からリセットされました
ログインしてみてみようとするとスタートすらしてない?
[vagrant@docker ~]$ sudo docker start phpipam phpipam [vagrant@docker ~]$ sudo docker exec -it phpipam /bin/bash [root@phpipam /]# curl localhost curl: (7) Failed connect to localhost:80; Connection refused [root@phpipam /]# systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:httpd(8) man:apachectl(8)
起動失敗しとるやん。。。
[root@phpipam /]# systemctl start httpd Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details. [root@phpipam /]# echo $? 1
設定ファイルに★がつきっぱなしでした★
しかしDockerfileに書いたはずの/var/www/html/へのcopyは行われておらず。おそらくtarの解凍ができてない。
tarはちゃんと送られてる。Dockerfileのカレントパスがどこか。
[root@phpipam /]# ls anaconda-post.log bin boot dev etc home lib lib64 lost+found media mnt opt phpipam-1.2.1.tar proc root run sbin srv sys tmp usr var
ここまでのまとめ
時間も遅いので今日はここでしめる。。。半端なのは嫌だけど。今のところできてないところ
- serviceが起動されていない
- コマンドの実行パスが分かってない
- コマンドが失敗しても失敗したとわからない ですねーちょっとまだ理解が足りてない。
あとDockerfileについていろいろ調べてたんですが、基本1コンテナ1プロセス、1サービスにすべきみたいですね。phpipamはhttpdとmysql(今回はmariadb)だから分けるべきなのかな。ちょっとそういう基本的な思想も分かってないところ。
コンテナとして固める(docker commit)してdocker hubで公開できるとしても、それはVagrant + Ansibleでも同じ。Packerを使うようなものなので、おそらくそこがメリットじゃないはあず。
Dockerfileを使いつつ、もう少し良い学習材料を探していこうと思います。