LoginSignup
103
93

DockerのMySQLコンテナに外部のサーバーから接続する

Last updated at Posted at 2018-10-15

概要

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
103
93
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
103
93