読者です 読者をやめる 読者になる 読者になる

ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

Docker入門中!Dockerfileに苦戦する。

はじめに

Docker入門中!

take-she12.hatenablog.com

take-she12.hatenablog.com

今回は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の構築メモを残してます。

take-she12.hatenablog.com

これを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はhttpdmysql(今回はmariadb)だから分けるべきなのかな。ちょっとそういう基本的な思想も分かってないところ。

コンテナとして固める(docker commit)してdocker hubで公開できるとしても、それはVagrant + Ansibleでも同じ。Packerを使うようなものなので、おそらくそこがメリットじゃないはあず。

Dockerfileを使いつつ、もう少し良い学習材料を探していこうと思います。