簡體   English   中英

從 django 應用程序 docker 連接到本地 mysql 數據庫

[英]Connect to local mysql database from django app docker

I'm trying to dockerize my Django app with Docker, but having some trouble connecting with the mysql database since i'm not really experienced with Docker. 我有幾個問題:

  1. 我已經安裝了 mysql 並在我的計算機上本地設置了數據庫,我是否也必須使用 mysql 映像並在我的 docker-compose 中創建數據庫服務? Django 不應該像沒有停靠時那樣正常連接到 mysql 嗎?

  2. 如果數據庫托管在服務器上,那么 mysql 是否安裝在該服務器上? 我必須使用 mysql 圖像連接到數據庫嗎?

這是我的 docker-compose.yml:

version: '3.7'

services:
  web:
    build: ./appchat
    command: python appchat/manage.py runserver
    ports:
      - 8000:8000
      - "3306"
    network_mode: "host"

這是settings.py中的數據庫設置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': 'root',
        'NAME': 'company',
        'PORT': '3306',
    }
}

這是我運行 docker-compose 文件時的錯誤:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

任何幫助,將不勝感激。 謝謝你。

應用程序及其數據庫可以在同一主機或不同主機上運行,也可以在 Docker 中運行。

如果應用程序及其數據庫在不同的主機上運行,那么在 Docker 中進行設置並沒有什么不尋常的地方。 使用數據庫服務器的 DNS 名稱配置您的應用程序。 (我建議通過環境變量傳遞它,而不是修改settings.py文件。)

Docker 編寫語法:

environment:
  MYSQL_HOST: mysql.example.com

如果兩者都在相同的 Docker 設置中運行,則 Docker 提供了一個內部 DNS 設置,以便一個連接到另一個。 在 Docker Compose 中,可以使用services: key 作為主機名 在普通的 Docker 中, 您需要手動docker network create ,但是這個技巧有效。

普通 Docker 示例:

docker network create app
docker run --net app --name mysql -v $PWD/mysql:/var/lib/mysql/data mysql
docker run --net app --name app -e MYSQL_HOST=mysql myapp

If the database is running on the same host as the application, but outside Docker, and the host is a Mac or Windows system running the Docker Desktop application, then there is a special host.docker.internal hostname

docker run -e MYSQL_HOST=host.docker.internal myapp

對於本機 Linux 主機,此快捷方式不存在,您需要找出主機的 IP 地址,但您可以將其視為第一種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM