Dockerを個人的にいじっていて遭遇した問題。
ポートを変更したいけど、うまく行かなかったときの解決策メモ。
いいやり方があれば教えて下さい。
MySQLコンテナのポートフォワーディングを変更したい
# docker-compose.yml
version: "3"
services:
db:
build:
context: ./docker/mysql
container_name: db
volumes:
- db-store:/var/lib/mysql
- db-logs-store:/var/log/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
- MYSQL_DATABASE=${DB_NAME:-JETmysql}
- MYSQL_USER=${DB_USERNAME}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
- TZ=${TZ:-Asia/Tokyo}
ports:
- ${DB_PORT}:3307 #アクセスするポート:コンテナ内のポート
volumes:
db-logs-store:
db-store:
redis-store:
# .env
DB_CONNECTION=mysql
DB_HOST=db #0.0.0.0
DB_PORT=3307
ポートフォワードというのは特定のポートにやってきた通信リクエストを、
転送してあげることです。
通常、MySQLの場合3306番が使われますが、競合を避けたい事情で3307を
あてがおうと考えました。
上記YMLの、ports部分にポートを定義します。
${DB_PORT}部分は、envファイルから引っ張るようになっています。
左側がポートフォワーディング先、右側がDockerコンテナ内部で使用されるポート番号です。
「ローカルのポート3307にリクエストが来たら、コンテナ内の3307につないでね」という意味です。
コンテナはローカル端末とは隔離されたネットワークという位置づけのため、
コンテナ内部でもポート番号があるという認識です。
ここだけ定義すれば、よしなにやってくれるのかと思っていたのですが、
3306以外ではなぜか繋がらないという事象に見舞われました。
今回はMySQLワークベンチというGUIを接続しようとしていました。
docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------
db docker-entrypoint.sh --por ... Up 3306/tcp, 33060/tcp,
0.0.0.0:3307->3307/tcp
定義されているように見える。。
docker runする場合のポート指定
docker run -p 3307:3307 db
これだとうまくいきます。
だとすれば、コマンドでポート指定すればうまくいく?
ymlにコマンドを追記
ports:
- ${DB_PORT}:3307 #アクセスするポート:コンテナ内のポート
command: --port 3307
うまく接続できたようです。
なぜポート指定のコマンドが必要なのかわかりませんが、
一応これで動くようです。