技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Docker(17.12.0)で少し遊んで見る

これの続き

white-azalea.hatenablog.jp

Wordpress なんて 11 年前の学生時代に弄ってた OSS を簡単に動かす紹介があったのでやって見た。

XXXXXXX:~ azalea$ docker run -d -e MYSQL_ROOT_PASSWORD=password --name db mysql
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
f49cf87b52c1: Pull complete 
78032de49d65: Pull complete 
837546b20bc4: Pull complete 
9b8316af6cc6: Pull complete 
1056cf29b9f1: Pull complete 
86f3913b029a: Pull complete 
f98eea8321ca: Pull complete 
3a8e3ebdeaf5: Pull complete 
4be06ac1c51e: Pull complete 
920c7ffb7747: Pull complete 
Digest: sha256:7cdb08f30a54d109ddded59525937592cb6852ff635a546626a8960d9ec34c30
Status: Downloaded newer image for mysql:latest
58c04fb86b7ec40664344c91610f1caf0fa20d31238ad69248e61bee0dea4456
XXXXXXX:~ azalea$ 
XXXXXXX:~ azalea$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
58c04fb86b7e        mysql               "docker-entrypoint.s…"   16 seconds ago      Up 20 seconds       3306/tcp            db
XXXXXXX:~ azalea$ 

MySQL を root パスワード password で起動。
ポート番号は MySQL デフォルトポートなんね。

続いて wordpress

XXXXXXXX:~ azalea$ docker run --link db:mysql -p 8080:80 -e WORDPRESS_DB_PASSWORD=password --name web wordpress
Unable to find image 'wordpress:latest' locally
latest: Pulling from library/wordpress
e7bb522d92ff: Already exists 
75651f247827: Pull complete 
dbcf8fd0150f: Pull complete 
de80263f26f0: Pull complete 
65be8ad4c5fd: Pull complete 
239d5fed0dda: Pull complete 
5ab39b683a9f: Pull complete 
4a3f54f2d93a: Pull complete 
28c970ad99e9: Pull complete 
86b02bcfc0c2: Pull complete 
a21cb128d1e1: Pull complete 
620a1b563498: Pull complete 
2b7708d1b98c: Pull complete 
0086574a434b: Pull complete 
9eb9edc5beda: Pull complete 
660c359d962d: Pull complete 
7668cac2f2dd: Pull complete 
57950765f0c3: Pull complete 
25f60226e8a5: Pull complete 
Digest: sha256:9a6067b6f4d950e4a5fea699d4e9537bdcc2375f651e1ce5c98aa4dc2c61d1b7
Status: Downloaded newer image for wordpress:latest
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
[Fri Feb 16 13:14:08.132796 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.2 configured -- resuming normal operations
[Fri Feb 16 13:14:08.132915 2018] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

うん、起動したので http://localhost:8080 アクセス

f:id:white-azalea:20180216222051p:plain

2コマンドか…楽になったものだ。
そこでもう一声。

qiita.com

こっちの記述も試してみようと思う。
つまり Network 機能だ。

まずネットワークが現在どうなってるか確認する

XXXXXXX:~ azalea$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
90f602f39b31        bridge              bridge              local
d405e0672e62        host                host                local
69b041527ecb        none                null                local

ほむほむ。
Wordpress 用のネットワーク作っちゃうぞー

XXXXXXX:~ azalea$ docker network create wordpress
d632af3c1df0adaf37df9f99ac0bac2cc1e4b06dcbf3ac5a473e2655ae2f9383
XXXXXXX:~ azalea$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
90f602f39b31        bridge              bridge              local
d405e0672e62        host                host                local
69b041527ecb        none                null                local
d632af3c1df0        wordpress           bridge              local

ならここに所属するように指定して起動すればいいのか

XXXXXXX:~ azalea$ docker run -d -e MYSQL_ROOT_PASSWORD=password --net wordpress --name db mysql
ba9ece2b29ea57013671334b5e2de19ed1046154892d0c0790c86ded093c5586
XXXXXXX:~ azalea$ docker run --link db:mysql -p 8080:80 -e WORDPRESS_DB_PASSWORD=password --net wordpress --name web wordpress
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.18.0.3. Set the 'ServerName' directive globally to suppress this message
[Fri Feb 16 13:32:37.914171 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.2.2 configured -- resuming normal operations
[Fri Feb 16 13:32:37.914294 2018] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

ここまでに見たエラー
まずは、docker kill したやつを同じコマンドで起動しようとして怒られたパターン。

kill はプロセスを kill するだけで、コンテナに一切の手をつけないって事なのか。
docker start web で問題なく起動した。

XXXXXXX:~ azalea$ docker run --link db:mysql -p 8080:80 -e WORDPRESS_DB_PASSWORD=password --net wordpress --name web wordpress
docker: Error response from daemon: Conflict. The container name "/web" is already in use by container "07627d915bde1df0fa5bbdc11044cf576ce28ed5595ef9e6e2a92d40052ecb54". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
XXXXXXX:~ azalea$ docker rm web
web

しかし ubuntu は毎回 run でイケるのだが…この差はなんだ?
疑問に思って Kitematic 眺めて見たら、ubuntu は run するたびに別コンテナが作られてたという…なるほどな(汗

試しに、docker run --name test_ubuntu -it ubuntu /bin/bash して Ctrl + D で終了。
そして start からのインタラクティブ指定したら…

XXXXXXX:~ azalea$ docker start test_ubuntu -i
root@f42f937734aa:/# 

普通にログインできた。
しかも前回起動時のファイルが残ってたよ…なるほどね。

もうひとつは Network 構築後に --link が省略できないかなと試してみて、エラー吐かれたパターン。

XXXXXXX:~ azalea$ docker run --link mysql -p 8080:80 -e WORDPRESS_DB_PASSWORD=password --net wordpress --name web wordpress
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html

Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known in Standard input code on line 22

Warning: mysqli::__construct(): (HY000/2002): php_network_getaddresses: getaddrinfo failed: Name or service not known in Standard input code on line 22

ここから見るに、Network はイメージ的には同一のイントラにホスト(コンテナ)を放り込むだけなのに対して、--link はコンテナ同士を殆どシームレスに繋いでしまう事らしい。

扱い違うのね…

やっと概要掴んで来た。

  • image
    コンテナ作成の為の元情報。
    run 実行するとここを元にコンテナを作る。
  • container
    実際に動作する単位。
    start, stop で起動・停止を行う。