Docker-compose.ymlでMysqlとPython環境を立ち上げる | COMMONS NOTE

Docker-compose.ymlでMysqlとPython環境を立ち上げる

こんにちはマダラです

Djangoでアプリを作りたいとなった際に,PythonとMysqlを接続したいということは多いかと思います。

Docker-composeを利用して、それぞれのコンテナを立ち上げて接続していきます

Docker-compose.yml

docker-composeファイルは以下のように記述しました。

version: '3.8'
services:
  mysql:
    build: ./mysql
    container_name: mysql-container
    hostname: mysql-server
    environment:
      MYSQL_ROOT_PASSWORD: $MYSQL_PASSWORD
      MYSQL_DATABASE: $MYSQL_DATABASE
    volumes:
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./mysql/init:/docker-entrypoint-initdb.d
    restart: alwaysports:
      - 3306:3306
    networks:
      - container-link

  python:
    build: ./python
    container_name:python_container
    hostname: python-server
    volumes:
      - ./project:/var/www/html
    ports:
      - '8090:80'
depends_on:
      - mysql 
    tty: true
    environment:
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASSWORD
      MYSQL_DATABASE: $MYSQL_DATABASE
    networks:
      - container-link

networks:
  default:
    external:
      name: bridge
  container-link:
    name: app.internal
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "172.20.100.0/24"
volumes:
  django-app:
    name: mysql-data
    driver: local

環境変数でMysqlの各種設定を読み込ませます。このようにしてGit上に秘密情報は上げないようにします。

ネットワークを同盟にしてnetworks:に設定しておけば、両コンテナが接続されるようになります。

ポイントとしては、同じサーバ場で動いている場合、pythonコンテナからmysqlコンテナへの接続ホストはcontainer_nameに設定した名前になります。

例えば、上記のdocker-composeファイル設定だと、Djangoのsettings.pyでの接続設定は以下のようになります

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': os.environ['MYSQL_DATABASE'],
    'USER': os.environ['MYSQL_USER'],
    'PASSWORD': os.environ['MYSQL_PASSWORD'],
    'HOST': 'mysql-container',
    'PORT': '3306',
    'OPTIONS': {
        'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
    }
  }
}

HOST設定がコンテナ名に対応してますよね。また、そのほかの設定はサーバの環境設定からDockerコンテナ内の環境設定にdocker-compose.ymlのenvironment:の部分で設定していますので、os.environ['MYSQL_DATABASE']のようにして取得しているわけです。

まとめ

文章を描くのが嫌いなので、かなり端折ってしまっています。
Dockerに慣れていない方にはわかりづらい説明だったかもしれません。

ぜひその他の優良サイトも参考にしながら頑張ってみてください。ではでは