Docker - docker-compose 详解
docker-compose 详解
上节我们创建了一个 MySQL 的镜像箱,那接下来就配置一个 Pyhon | Django 的镜像箱,并同时配置 docker-compose 将两者结合在一起吧!
1. 创建 Python | Django 的镜像箱
那么,需要新建一个 Dockerfile 文件来安装 Python 环境!
FROM pythonENV PYTHONUNBUFFERED=1WORKDIR /appCOPY . /appRUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/RUN pip install --no-cache-dir -r requirements.txt
COPY init.sh /init.shRUN chmod +x /initshENTRYPOINT ["/init.sh"]需要安装 Python,配置 pip 镜像源后,将相关文件迁移至镜像里,再安装依赖。创建完文件后保存退出。
以此目录创建一个名字为 minishop 的 docker镜像!
docker build --no-cache --t minishop .2. 开始联动部署项目 | docker-compose
尽可能把相关需要部署的 Dockerfile 放在同一个文件夹目录的另一个文件夹下,然后创建一个 docker-compose.yml 文件,就可以直接放在这个文件夹的目录下,就像这样:
- Folder
- docker-compose.yml
- MySQL_Folder / Dockerfile
- Python_Folder / Dockerfile
而后,在相应位置创建 docker-compose.yml 文件
version: '3.8'
services: db: build: context: ./mysql environment: MYSQL_ROOT_PASSWORD: 132120 MYSQL_DATABASE: database ports: - "3306:3306" networks: - app_network
app: build: context: ./minishop/Minishop/src volumes: - ./minishop/Minishop/src:/app ports: - "8000:8000" depends_on: - db networks: - app_network
networks: app_network: driver: bridge使用 build 开始编译镜像
docker-compose build而后就可以启动容器了,使用 -d 参数让它静默启动
docker-compose up -d那么到这里似乎是能启动了,但是发现了一堆的报错 …
例如 MySQL 里似乎没有 root 远程的访问权限,同时还没有项目的数据库文件,Python的Django的数据库表未能初始化 …
要如何解决呢?
3. 挂载脚本
那么首先,我们要先解决数据库内缺少 Minishop 数据库的文件问题,与 root 的远程连接问题。
在 mysql/ 下新建 init.sql 文件。
CREATE DATABASE IF NOT EXISTS Minishop;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;ALTER USER 'root'@'%' IDENTIFIED BY '132120';FLUSH PRIVILEGES;完成挂载(修改 yml 文件):将本地目录中的 init.sql 脚本挂载到 MySQL 容器的 /docker-entrypoint-initdb.d/ 目录下。MySQL 容器会在第一次启动时自动执行该目录中的所有 SQL 脚本。
volumes: - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql完整db
db: build: context: ./mysql environment: MYSQL_ROOT_PASSWORD: 132120 MYSQL_DATABASE: database ports: - "3306:3306" networks: - app_network volumes: - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql那么继续,我们要继续解决 Django 的数据初始化问题。在 Django 下创建 init.sh 文件
python manage.py makemigrationspython manage.py migratepython manage.py runserver 0.0.0.0:8000完成挂载:
volumes: - ./minishop/Minishop/src:/app - ./minishop/Minishop/src/init.sh:/app/init.sh脚本文件不像 sql 一样,放在一个文件夹在服务启动时则会执行,所以还需要在 yml 里配置 command
command: ["bash", "/app/init.sh"] # 执行脚本所以完整的 app 修改后如下:
app: build: context: ./minishop/Minishop/src volumes: - ./minishop/Minishop/src:/app - ./minishop/Minishop/src/init.sh:/app/init.sh ports: - "8000:8000" depends_on: - db networks: - app_network command: ["bash", "/app/init.sh"] # 执行脚本4. 编译启动
docker-compose downdocker-compose up --build -d5. MySQL 测试链接
因为安装的 MySQL 版本来到了9.4,所以直接连接可能会出现 Public Key Retrieval is not allowed 的报错
所以需要使用 URL 进行访问并添加参数:?useSSL=false&allowPublicKeyRetrieval=true
所以完整的 URL 如下:
jdbc:mysql://192.168.31.197:3306/?useSSL=false&allowPublicKeyRetrieval=true可见 Minishop 表已经正常建立了。也正因公钥的问题,所以在 Django 中的 settings 中也要修改
6. Django 修改 settings
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'Minishop', # 数据库名 'USER': 'root', # 账号 'PASSWORD': '132120', # 密码 'HOST': '192.168.31.197', # HOST 'POST': 3306, # 端口 'OPTIONS': { 'allowPublicKeyRetrieval': True, # 允许公钥检索 }, }}请务必一定要修改 host,此 192.168.31.197 与 localhost 完全不同。
7. 启动项目
使用 build 开始编译镜像
docker-compose build而后就可以启动容器了,使用 -d 参数让它静默启动
docker-compose up -d访问 Web 项目地址!成功!
192.168.31.197:8000支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













