Docker で mysql server 立てようとしたら Can't connect to local MySQL server through socket
って言われました。
なんだかわからないまま、解決するのに結構時間かかってしまったので、残しておきます。
結論
docker run
では、末尾に [COMMAND]
という option を指定できるが、mysql サーバ (container) を立てる時には指定してはいけない、ということです。
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
[Docker run reference🔗 より] (https://docs.docker.com/engine/reference/run/#docker-run-reference)
- OK な例
docker run -d --name mydb --rm -p 3306:3306 mysql:5.7
# してから
docker exec -it /bin/bash # host
mysql -u root -p # container
- ダメな例
docker run -d --name mydb --rm -p 3306:3306 mysql:5.7 /bin/bash
^^^^^^^^^ これをしちゃダメ!!
チョット 詳細 (未完成)
まず、docker run
するとき、[COMMAND]
の部分は optional です。(つまり、あってもなくても良い)
次に、docker image の話を少しします。
docker image は Dockerfile
を作って docker build
を行うことにより作ることができます。
そしてこの build された image から container を起動できる、という流れになっています。
[Dockerfile] === docker build ==> [image] === docker run ===> [container]
通常、起動直後に実行されるコマンドは、上記のような Dockerfile
の最後あたりに CMD ["command"]
という形で指定されます
This command is optional because the person who created the IMAGE may have already provided a default COMMAND using the Dockerfile CMD instruction.
これはもちろん、 image の作者が、意図的に、CMD を用いて、実行するコマンドを指定している可能性があります。つまり、起動した container がきちんとサービスとしての振る舞いを行うために CMD ["command"]
を書いている可能性がある、ということです。
しかし、docker run の時に、あなたが指定した [COMMAND] option
は、この Dockerfile で作者が指定した CMD をオーバーライドして、新たなコマンドの実行を指定してしまうらしいです。
As the operator (the person running a container from the image), you can override that CMD instruction just by specifying a new COMMAND.
CMD (default command or options) 🔗
なので、mysql container が通常起動された時に実行される (はず) の、このコマンドが実行されないため、mysql server に接続できない、というのが原因であると考えています。
先のリンクにある、CMD 部分をを見て、こう思った方がいるかもしれません。
CMD ["mysqld"]
「じゃあ、docker container が立ち上がった時に mysqld
コマンドを実行すればいいんじゃね?」
# ダメな例
(host) $ docker run -d --name mydb --rm -p 3306:3306 mysql:5.7 /bin/bash
(container) # mysqld
実際私もそう思いました。試しました。ダメでした 😢
「タイムスタンプがどうのこうの」と言われてしまい、うまくいきません...
( 調査中です... ご存知の方、いらっしゃいましたらご教示ください... )