Docker - docker-compose 详解

900 字
5 分钟
Docker - docker-compose 详解

docker-compose 详解#

上节我们创建了一个 MySQL 的镜像箱,那接下来就配置一个 Pyhon | Django 的镜像箱,并同时配置 docker-compose 将两者结合在一起吧!

1. 创建 Python | Django 的镜像箱#

那么,需要新建一个 Dockerfile 文件来安装 Python 环境!

FROM python
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY . /app
RUN 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.sh
RUN chmod +x /initsh
ENTRYPOINT ["/init.sh"]

需要安装 Python,配置 pip 镜像源后,将相关文件迁移至镜像里,再安装依赖。创建完文件后保存退出。

以此目录创建一个名字为 minishop 的 docker镜像!

Terminal window
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 开始编译镜像

Terminal window
docker-compose build

而后就可以启动容器了,使用 -d 参数让它静默启动

Terminal window
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 文件

Terminal window
python manage.py makemigrations
python manage.py migrate
python 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 down
docker-compose up --build -d

5. 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 开始编译镜像

Terminal window
docker-compose build

而后就可以启动容器了,使用 -d 参数让它静默启动

Terminal window
docker-compose up -d

访问 Web 项目地址!成功!

192.168.31.197:8000

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Docker - docker-compose 详解
https://springtsuki.xucjno.com/posts/springtsuki/notes/docker/4-docker-compose-详解/
作者
SpringTsuki
发布于
2025-03-31
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
SpringTsuki
你好,我是浅月。
公告
浅月的开发小窝!欢迎你来到这里!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
17
分类
8
标签
16
总字数
19,430
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录