こんにちはマダラです
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に慣れていない方にはわかりづらい説明だったかもしれません。
ぜひその他の優良サイトも参考にしながら頑張ってみてください。ではでは