LoginSignup
0
0

More than 3 years have passed since last update.

[Docker / mysql] Can't connect to local MySQL server through socket

Posted at

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🔗 より

  • 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 部分をを見て、こう思った方がいるかもしれません。

mysql/5.7/Dockerfile
CMD ["mysqld"]

「じゃあ、docker container が立ち上がった時に mysqld コマンドを実行すればいいんじゃね?」

つまりこうするわけです
# ダメな例
(host) $ docker run -d --name mydb --rm -p 3306:3306 mysql:5.7 /bin/bash

(container) # mysqld

実際私もそう思いました。試しました。ダメでした 😢

「タイムスタンプがどうのこうの」と言われてしまい、うまくいきません...

( 調査中です... ご存知の方、いらっしゃいましたらご教示ください... )

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0