2019/03/28(Thr)Docker on Ubuntu on Windows Subsystem for Linux で php:apache をなんとか動かすまで

はてブ数 2019/03/28 6:00 つーさ

結論から言うと、
hello-world は docker バージョンを 17.12.1 に下げることで動いたんだけど、

php:apache はちょっと変なことをしないと動かなかった。
どうも docker コンテナ内のfsでsymlinkを追跡できなかったり、
ファイルやディレクトリを消してもゴミが残ってファイルが消えなかったり、
なんか、謎の挙動をする。

# Dockerfile
FROM php:apache
RUN rm /var/lock && mkdir /var/lock  && chmod 1777 /var/lock
RUN rm /var/run  && cp -rp /run /var/run
RUN mkdir /etc/apache2/mods-enabled/mpm_event.conf /etc/apache2/mods-enabled/mpm_event.load

一応、phpinfo を拝むことはできた。

WSLでDockerを開発環境にするのは、まだしんどそう。

dockerに触ったことがなくて、ちょっと勉強しようと思って、環境の作り方を調べていた。

最近、WSLでdockerが動くらしいという。
普通はDocker for Windowsらしいのだけど、マシンが非力なので、Hyper-Vじゃない環境で動かせるならその方がいい。
というか、Hyper-V有効にしたらvagrant動かなくなってしまう。ちょっと困る。

WSLのインストールからUbuntuをWindows上で動かして、その上にdockerを入れてみようと思った。

が、すんなりとは行かなかったので、正しい挙動(?)を見るために、結局途中でDocker for Windowsも入れた。
*1

環境

Windows 10 Pro: 1809 (build: 17763.379)
tu-sa@T10:~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

WSLはググって、機能を有効にして再起動して、UbuntuはMicrosoft Storeから入れた。

そのあと端末を mintty ベースのに変えた。

この記事を書いてる瞬間の php:apache は 7.3.3-apache-stretch を指してます。

apache: Pulling from library/php
Digest: sha256:2b74bd4c354e0ab7cf51ce34840e1f3a1f548c4872320244a9563aacc1276195
Status: Image is up to date for 7.3.3-apache-stretch

選べる3つの docker.io バージョン

root@T10:~# apt list docker.io -a
Listing... Done
docker.io/bionic-updates,now 18.09.2-0ubuntu1~18.04.1 amd64 [residual-config]
docker.io/bionic-security 18.06.1-0ubuntu1.2~18.04.1 amd64 [residual-config]
docker.io/bionic 17.12.1-0ubuntu1 amd64 [residual-config]

何も考えずに最新版 (18.09.2) を入れてみる

iptablesがどうたらこうたらで、動かない。(どのバージョンを入れてもダメだった)

ので、(めんどくさいので sudo su - して)

いったん、 docker0 の bridge を削除して

root@T10:~# ip link del docker0

iptablesの自動設定を無効にして、internalもexternalも同じcidrにしてやると、とりあえず dockerd はあがった。

root@T10:~# dockerd --debug --bip=192.168.42.1/24 --fixed-cidr=192.168.42.0/24 --iptables=false

したら、dockerdはあがった。

dockerd はあがるのだが、いざ run hello-world すると、動かない。

clientのログ

tu-sa@T10:~$ docker run hello-world
docker: Error response from daemon: OCI runtime create failed: container_linux.g
o:344: starting container process caused "process_linux.go:297: getting the fina
l child's pid from pipe caused \\"EOF\\"": unknown.
ERRO[0006] error waiting for container: context canceled

dockerdのログ

WARN[2019-03-28T05:10:31.838615100+09:00] Seccomp is not enabled in your kernel, running container without default profile.
INFO[2019-03-28T05:10:32.070008900+09:00] shim containerd-shim started                  address="/containerd-shim/moby/5a746894ba8d71666685dea9993cd09e89a74b346e86052a06229164c0e501b0/shim.sock" debug=false pid=302
INFO[2019-03-28T05:10:32.567660500+09:00] shim reaped                                   id=5a746894ba8d71666685dea9993cd09e89a74b346e86052a06229164c0e501b0
ERRO[2019-03-28T05:10:32.600022900+09:00] stream copy error: reading from a closed fifo
ERRO[2019-03-28T05:10:32.600116200+09:00] stream copy error: reading from a closed fifo
ERRO[2019-03-28T05:10:33.139183500+09:00] 5a746894ba8d71666685dea9993cd09e89a74b346e86052a06229164c0e501b0 cleanup: failed to delete container from containerd: no such container
ERRO[2019-03-28T05:10:33.146897300+09:00] Handler for POST /v1.39/containers/5a746894ba8d71666685dea9993cd09e89a74b346e86052a06229164c0e501b0/start returned error: OCI runtime create failed: container_linux.go:344: starting container process caused "process_linux.go:297: getting the final child's pid from pipe caused \\"EOF\\"": unknown

バージョンを18.06.1にさげてみる。

root@T10:~# apt -y install docker.io=18.06\\*

で、旧バージョン入れる。 clientのログ

tu-sa@T10:~$ docker run hello-world
docker: Error response from daemon: OCI runtime create failed: container_linux.g
o:348: starting container process caused "process_linux.go:301: running exec set
ns process for init caused \\"exit status 23\\"": unknown.
ERRO[0002] error waiting for container: context canceled

dockerdのログ

WARN[2019-03-28T05:15:52.806295700+09:00] Seccomp is not enabled in your kernel, running container without default profile.
INFO[0008] shim docker-containerd-shim started           address="/containerd-shim/moby/37f5679cc1b317aa42bdd834f798121344acb591b0291469c697f627d48232e4/shim.sock" debug=false pid=2796
INFO[0009] shim reaped                                   id=37f5679cc1b317aa42bdd834f798121344acb591b0291469c697f627d48232e4
ERRO[2019-03-28T05:15:53.465016700+09:00] stream copy error: reading from a closed fifo
ERRO[2019-03-28T05:15:53.465848000+09:00] stream copy error: reading from a closed fifo
ERRO[2019-03-28T05:15:53.934991900+09:00] 37f5679cc1b317aa42bdd834f798121344acb591b0291469c697f627d48232e4 cleanup: failed to delete container from containerd: no such container
ERRO[2019-03-28T05:15:53.952793200+09:00] Handler for POST /v1.38/containers/37f5679cc1b317aa42bdd834f798121344acb591b0291469c697f627d48232e4/start returned error: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:301: running exec setns process for init caused \\"exit status 23\\"": unknown

ちょっと変わる、でも動かない。

17.12.1 に下げてみる

一応

root@T10:~# apt -y install docker.io=17.12\\*
tu-sa@T10:~$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

お? 動きましたね。

ほんとに動いてるのかな?

17.12.1 で php:apache

tu-sa@T10:~$ docker run -p 80:80 php:apache
mkdir: cannot create directory '/var/lock': Not a directory

ん?

# Dockerfile
FROM php:apache
RUN rm /var/lock && mkdir /var/lock && chmod 1777 /var/lock

を build して run すると、

mkdir: cannot create directory '/var/run': Not a directory
# Dockerfile
FROM php:apache
RUN rm /var/lock && mkdir /var/lock && chmod 1777 /var/lock
RUN rm /var/run  && cp -rp /run /var/run

/var/run -> /run らしいのでcp。

build して run。

apache2: Syntax error on line 146 of /etc/apache2/apache2.conf: Could not open configuration file /etc/apache2/mods-enabled/mpm_event.load: 
No such file or directory

ふーむ……?

RUN ls -al /etc/apache2/mods-enabled

↓なんじゃこりゃ?

Step 4/5 : RUN ls -al /etc/apache2/mods-enabled || true
 ---> Running in 72657baf7ea7
ls: cannot access '/etc/apache2/mods-enabled/mpm_event.conf': No such file or directory
ls: cannot access '/etc/apache2/mods-enabled/mpm_event.load': No such file or directory
total 0
drwxr-xr-x 1 root root 512 Mar 27 01:13 .
drwxr-xr-x 1 root root 512 Mar 27 01:09 ..
lrwxrwxrwx 1 root root  36 Mar 27 01:09 access_compat.load -> ../mods-available/access_compat.load
lrwxrwxrwx 1 root root  28 Mar 27 01:09 alias.conf -> ../mods-available/alias.conf
lrwxrwxrwx 1 root root  28 Mar 27 01:09 alias.load -> ../mods-available/alias.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 auth_basic.load -> ../mods-available/auth_basic.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authn_core.load -> ../mods-available/authn_core.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authn_file.load -> ../mods-available/authn_file.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authz_core.load -> ../mods-available/authz_core.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authz_host.load -> ../mods-available/authz_host.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authz_user.load -> ../mods-available/authz_user.load
lrwxrwxrwx 1 root root  32 Mar 27 01:09 autoindex.conf -> ../mods-available/autoindex.conf
lrwxrwxrwx 1 root root  32 Mar 27 01:09 autoindex.load -> ../mods-available/autoindex.load
lrwxrwxrwx 1 root root  30 Mar 27 01:09 deflate.conf -> ../mods-available/deflate.conf
lrwxrwxrwx 1 root root  30 Mar 27 01:09 deflate.load -> ../mods-available/deflate.load
lrwxrwxrwx 1 root root  26 Mar 27 01:09 dir.conf -> ../mods-available/dir.conf
lrwxrwxrwx 1 root root  26 Mar 27 01:09 dir.load -> ../mods-available/dir.load
lrwxrwxrwx 1 root root  26 Mar 27 01:09 env.load -> ../mods-available/env.load
lrwxrwxrwx 1 root root  29 Mar 27 01:09 filter.load -> ../mods-available/filter.load
lrwxrwxrwx 1 root root  27 Mar 27 01:09 mime.conf -> ../mods-available/mime.conf
lrwxrwxrwx 1 root root  27 Mar 27 01:09 mime.load -> ../mods-available/mime.load
c????????? ? ?    ?      ?            ? mpm_event.conf
c????????? ? ?    ?      ?            ? mpm_event.load
lrwxrwxrwx 1 root root  34 Mar 27 01:09 mpm_prefork.conf -> ../mods-available/mpm_prefork.conf
lrwxrwxrwx 1 root root  34 Mar 27 01:09 mpm_prefork.load -> ../mods-available/mpm_prefork.load
lrwxrwxrwx 1 root root  34 Mar 27 01:09 negotiation.conf -> ../mods-available/negotiation.conf
lrwxrwxrwx 1 root root  34 Mar 27 01:09 negotiation.load -> ../mods-available/negotiation.load
lrwxrwxrwx 1 root root  27 Mar 27 01:13 php7.load -> ../mods-available/php7.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 reqtimeout.conf -> ../mods-available/reqtimeout.conf
lrwxrwxrwx 1 root root  33 Mar 27 01:09 reqtimeout.load -> ../mods-available/reqtimeout.load
lrwxrwxrwx 1 root root  31 Mar 27 01:09 setenvif.conf -> ../mods-available/setenvif.conf
lrwxrwxrwx 1 root root  31 Mar 27 01:09 setenvif.load -> ../mods-available/setenvif.load
lrwxrwxrwx 1 root root  29 Mar 27 01:09 status.conf -> ../mods-available/status.conf
lrwxrwxrwx 1 root root  29 Mar 27 01:09 status.load -> ../mods-available/status.load

どうも、WSLのdocker container上で、rm的なことができない。ファイルもディレクトリも、消しても、消せない。ゴミが残る。

この状態で rm しても No such file or directory だし、じゃあいったん /dev/null を上書きコピーしてみればいいかと試してみても

RUN cp /dev/null /etc/apache2/mods-enabled/mpm_event.conf && \\
    cp /dev/null /etc/apache2/mods-enabled/mpm_event.load && \\
    mv /etc/apache2/mods-enabled/mpm_event.conf /etc/apache2/mods-enabled/mpm_event.conf.x && \\
    mv /etc/apache2/mods-enabled/mpm_event.load /etc/apache2/mods-enabled/mpm_event.load.x && \\
    ls -al /etc/apache2/mods-enabled

コピーが終わった時点では、正常なファイルに戻るのだけど、そのあとの mv で再び、 c????????? なファイル(?)になってしまう。

移動元には消えて欲しいのだが。

Step 5/5 : RUN cp /dev/null /etc/apache2/mods-enabled/mpm_event.conf &&     cp /dev/null /etc/apache2/mods-enabled/mpm_event.load &&     mv
/etc/apache2/mods-enabled/mpm_event.conf /etc/apache2/mods-enabled/mpm_event.conf.x &&     mv /etc/apache2/mods-enabled/mpm_event.load /etc
apache2/mods-enabled/mpm_event.load.x &&     ls -al /etc/apache2/mods-enabled
 ---> Running in 46e9ae378939
ls: cannot access '/etc/apache2/mods-enabled/mpm_event.conf': No such file or directory
ls: cannot access '/etc/apache2/mods-enabled/mpm_event.load': No such file or directory
total 0
drwxr-xr-x 1 root root 512 Mar 27 20:24 .
drwxr-xr-x 1 root root 512 Mar 27 20:24 ..
lrwxrwxrwx 1 root root  36 Mar 27 01:09 access_compat.load -> ../mods-available/access_compat.load
lrwxrwxrwx 1 root root  28 Mar 27 01:09 alias.conf -> ../mods-available/alias.conf
lrwxrwxrwx 1 root root  28 Mar 27 01:09 alias.load -> ../mods-available/alias.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 auth_basic.load -> ../mods-available/auth_basic.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authn_core.load -> ../mods-available/authn_core.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authn_file.load -> ../mods-available/authn_file.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authz_core.load -> ../mods-available/authz_core.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authz_host.load -> ../mods-available/authz_host.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 authz_user.load -> ../mods-available/authz_user.load
lrwxrwxrwx 1 root root  32 Mar 27 01:09 autoindex.conf -> ../mods-available/autoindex.conf
lrwxrwxrwx 1 root root  32 Mar 27 01:09 autoindex.load -> ../mods-available/autoindex.load
lrwxrwxrwx 1 root root  30 Mar 27 01:09 deflate.conf -> ../mods-available/deflate.conf
lrwxrwxrwx 1 root root  30 Mar 27 01:09 deflate.load -> ../mods-available/deflate.load
lrwxrwxrwx 1 root root  26 Mar 27 01:09 dir.conf -> ../mods-available/dir.conf
lrwxrwxrwx 1 root root  26 Mar 27 01:09 dir.load -> ../mods-available/dir.load
lrwxrwxrwx 1 root root  26 Mar 27 01:09 env.load -> ../mods-available/env.load
lrwxrwxrwx 1 root root  29 Mar 27 01:09 filter.load -> ../mods-available/filter.load
lrwxrwxrwx 1 root root  27 Mar 27 01:09 mime.conf -> ../mods-available/mime.conf
lrwxrwxrwx 1 root root  27 Mar 27 01:09 mime.load -> ../mods-available/mime.load
l????????? ? ?    ?      ?            ? mpm_event.conf
-rw-r--r-- 1 root root   0 Mar 27 20:24 mpm_event.conf.x
l????????? ? ?    ?      ?            ? mpm_event.load
-rw-r--r-- 1 root root   0 Mar 27 20:24 mpm_event.load.x
lrwxrwxrwx 1 root root  34 Mar 27 01:09 mpm_prefork.conf -> ../mods-available/mpm_prefork.conf
lrwxrwxrwx 1 root root  34 Mar 27 01:09 mpm_prefork.load -> ../mods-available/mpm_prefork.load
lrwxrwxrwx 1 root root  34 Mar 27 01:09 negotiation.conf -> ../mods-available/negotiation.conf
lrwxrwxrwx 1 root root  34 Mar 27 01:09 negotiation.load -> ../mods-available/negotiation.load
lrwxrwxrwx 1 root root  27 Mar 27 01:13 php7.load -> ../mods-available/php7.load
lrwxrwxrwx 1 root root  33 Mar 27 01:09 reqtimeout.conf -> ../mods-available/reqtimeout.conf
lrwxrwxrwx 1 root root  33 Mar 27 01:09 reqtimeout.load -> ../mods-available/reqtimeout.load
lrwxrwxrwx 1 root root  31 Mar 27 01:09 setenvif.conf -> ../mods-available/setenvif.conf
lrwxrwxrwx 1 root root  31 Mar 27 01:09 setenvif.load -> ../mods-available/setenvif.load
lrwxrwxrwx 1 root root  29 Mar 27 01:09 status.conf -> ../mods-available/status.conf
lrwxrwxrwx 1 root root  29 Mar 27 01:09 status.load -> ../mods-available/status.load

/etc/apache2/mods-enabled ごと作り直そうにも、ディレクトリが空でないとか言われてrmもmvもできない。たぶん、rmもmvもディレクトリの子を先に処理すると思うのだが、そのディレクトリの子を消してもすべてがゴミに変わるだけでエントリが消えないので、空にならないのだろう。

うーん……

あ、わかったぞ

ゴミファイルじゃなくて、ちゃんとディレクトリにして、ファイルじゃなくしてしまえば、apacheも読みにこないでしょ!(錯乱)

つまり、こうだ。

# Dockerfile
FROM php:apache
RUN rm /var/lock && mkdir /var/lock  && chmod 1777 /var/lock
RUN rm /var/run  && cp -rp /run /var/run
RUN mkdir /etc/apache2/mods-enabled/mpm_event.conf /etc/apache2/mods-enabled/mpm_event.load
tu-sa@T10:~/docker-php-apache$ docker run -p 80:80 -v $(pwd)/var_www_html:/var/www/html php7_apache_a
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.42.2. Set the 'ServerName' directive globally to suppress this message
[Wed Mar 27 20:41:43.317380 2019] [core:warn] [pid 1] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.42.2. Set the 'ServerName' directive globally to suppress this message
[Wed Mar 27 20:41:43.477457 2019] [core:warn] [pid 1] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT
[Wed Mar 27 20:41:43.562882 2019] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.3.3 configured -- resuming normal operations
[Wed Mar 27 20:41:43.562928 2019] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

あ、動いた、っぽい?

phpinfo も見えた。

この方法は「ファイルの有無?」「ディレクトリの有無?」をチェックしにきてくれているから効いてるけど「ファイルかディレクトリの有無?」を見に来られていたら対応できない。

コンテナの中でファイルを消して、ファイルが消えていることを確認できないから、汎用性もない。

WSLでdockerを気持ちよく動かせる日は、まだ来ていなかったようです。

*1 : ただ、すでにvagrantが入ってる環境なので、Docker for Windows じゃなくて、vagrantにdocker用のディストリ入れる方がよかったね