概要
DockerでMySQLコンテナを立て、ホストOS、または外部サーバーから接続する方法。
docker runの場合
$ sudo docker run \
--rm \
-v $(pwd)/db/mysql_init:/docker-entrypoint-initdb.d \
-v $(pwd)/db/mysql_data:/var/lib/mysql \
--name mysql \
-e MYSQL_ROOT_PASSWORD=your_password \
--hostname my-mysql \
-e BIND-ADDRESS=0.0.0.0 \
-p 3306:3306 \
-itd mysql:5.7
docker-composeを使う場合
docker-compose.yml
version: '3.1'
services:
db:
image: mysql:5.7
restart: always
hostname: my-mysql
env_file:
- .env
environment:
MYSQL_USER: sample_user
MYSQL_DATABASE: sample_db
TZ: "Asia/Tokyo"
BIND-ADDRESS: 0.0.0.0
ports:
- 3306:3306
# データを永続化させる場合
volumes:
# 初期データを投入するSQLが格納されているdir
- ./db/mysql_init:/docker-entrypoint-initdb.d
# 永続化するときにマウントするdir
- ./db/mysql_data:/var/lib/mysql
tty: true
envファイルにMySQLのROOTのパスワードを定義する
.env
MYSQL_ROOT_PASSWORD=your_password
コンテナ起動
$ docker-compose up -d --build
MySQLに接続
ホストOSから接続
$ mysql -u root -p -h localhost -P 3306 --protocol=tcp
外部のサーバーから接続
$ mysql -u root -p -h hostname -P 3306 --protocol=tcp
コンテナ間通信
ネットワークを作成
sample-networkというネットワークを作成。
$ sudo docker network create sample-network
sample-networkを定義したコンテナ同士で、コンテナ間通信が可能となる。
DBコンテナを作成
Dockerコマンドの場合
$ docker run \
--name sample-db \
-p 3306:3306 \
-e MYSQL_USER=sample \
-e MYSQL_PASSWORD=Sample_123 \
-e MYSQL_ROOT_PASSWORD=Password_123 \
--rm \
--detach \
mysql:5.7
docker-composeの場合
version: '3.2'
services:
db:
container_name: sample-db
image: mysql:5.7
restart: always
hostname: sample-db
env_file:
- .env
environment:
MYSQL_USER: sample_admin
MYSQL_DATABASE: sample
TZ: "Asia/Tokyo"
BIND-ADDRESS: 0.0.0.0
ports:
- "3306:3306"
# データを永続化させる場合
volumes:
# 初期データを投入するSQLが格納されているdir
#- ./db/mysql_init:/docker-entrypoint-initdb.d
# 永続化するときにマウントするdir
- ./mysql_data:/var/lib/mysql
- ./conf/my.cnf:/etc/my.cnf
tty: true
networks:
- sample-network
networks:
sample-network:
external: true
WEBコンテナを作成
Dockerコマンドの場合
$ docker run --rm \
--name sample-web \
--network sample-network \
-itd sample-web /bin/bash
docker-composeの場合
version: '3.2'
services:
web:
container_name: sample-web
build:
context: ./
dockerfile: Dockerfile
hostname: sample-web
volumes:
- ./code:/code
ports:
- "3000:3000"
tty: true
networks:
- sample-network
networks:
sample-network:
external: true