前言
部署django项目需用到mysql数据库,还需要自己写一个Dockerfile文件部署django的容器。 多个容器部署的时候可以用到docker-compose 进行容器编排。
docker-compose环境准备
使用 python3 的 pip3 安装 docker-compose 命令行工具
代码语言:javascript复制pip3 install docker-compose
安装的版本Version: 1.29.2
代码语言:javascript复制# pip3 show docker-compose
Name: docker-compose
Version: 1.29.2
Summary: Multi-container orchestration for Docker
Home-page: https://www.docker.com/
Author: Docker, Inc.
Author-email: None
License: Apache License 2.0
Location: /root/python36/lib/python3.6/site-packages
安装完成后,找到docker-compose目录所在的bin目录地址
代码语言:javascript复制find /root -name docker-compose
添加软链接
代码语言:javascript复制ln -s /your/path/bin/docker-compose /usr/bin/docker-compose
docker-compose 文件编写
1.先编写启动 django 的 Dockerfile 文件
代码语言:javascript复制FROM python:3.6.8
MAINTAINER yoyo <283340479@qq.com>
RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install vim
RUN apt-get -y install lrzsz
RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple
WORKDIR /code
ADD . /code
RUN pip install -r requirements.txt --index-url https://pypi.douban.com/simple
# 开放端口
EXPOSE 8000
CMD执行命令先不写到dockerfile文件,因为数据库还没启动,配置cmd启动django服务会报错
2.修改 setttings.py 文件中数据库配置
代码语言:javascript复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'hrun', # 新建数据库名
'USER': 'root', # 数据库登录名
'PASSWORD': '123456', # 数据库登录密码
'HOST': 'db', # 数据库所在服务器地址(docker-compose文件links地址关联db)
'PORT': 3306, # 监听端口 默认3306即可
}
}
3.docker-compose.yml
version是指定 docker-compose.yml 文件的写法格式版本3.0 services 是需要启动的服务,多个服务键值对
代码语言:javascript复制version: '3.0'
services:
db:
restart: always
image: mysql:5.7
container_name: yy_mysql
volumes:
- ./db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: "hrun"
TZ: "Asia/Shanghai"
ports:
- 3306:3306
web:
restart: always
build: .
container_name: yy_web
command: python manage.py runserver 0.0.0.0:8000
ports:
- 8000:8000
links:
- db
depends_on:
- db
services配置启动服务的参数
- image:指定服务所使用的镜像
- container_name:定义启动容器的名称
- expose:定义容器用到的端口(一般用来标识镜像使用的端口,方便用ports映射)
- ports:定义宿主机端口和容器端口的映射,可使用宿主机IP 宿主机端口进行访问 宿主机端口:容器端口
- volumes:卷挂载路径,定义宿主机的目录/文件和容器的目录/文件的映射 宿主机路径:容器路径
- depend_on: 规定service加载顺序,例如数据库服务需要在后台服务前运行
- restart: always :配置重启,docker每次启动时会启动该服务
- links:将指定容器连接到当前连接,可以设置别名,已废弃,推荐使用networks
- environment:启动容器环境变量
- command:启动容器执行的cmd命令
docker-compose运行
docker-compose中web服务是本地镜像,可以先使用 build 构建镜像(不先build也可以,直接 up也会先build本地镜像)
代码语言:javascript复制docker-compose build
构建过程
代码语言:javascript复制[root@iZ2]# docker-compose build
Building web
Sending build context to Docker daemon 289.2MB
Step 1/17 : FROM python:3.6.8
---> 48c06762acf0
Step 2/17 : MAINTAINER yoyo <283340479@qq.com>
---> Using cache
---> 128b4ae83de3
Step 3/17 : RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list
---> Using cache
---> f974c67bcf87
Step 4/17 : RUN apt-get update
---> Using cache
---> d3ac17c4760f
Step 5/17 : RUN apt-get -y install vim
---> Using cache
---> 6d5c2962aa1d
Step 6/17 : RUN apt-get -y install lrzsz
---> Using cache
---> 16c6a337d525
Step 7/17 : RUN pip install --upgrade pip --index-url https://pypi.douban.com/simple
---> Using cache
---> 8e9efdca8ab0
Step 8/17 : WORKDIR /code
---> Using cache
---> 37d16b8cb963
Step 9/17 : ADD . /code
启动服务
代码语言:javascript复制docker-compose up
启动过程
代码语言:javascript复制Starting yy_mysql ... done
Starting yy_web ... done
Attaching to yy_mysql, yy_web
yy_mysql | 2021-12-28 21:25:22 08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
yy_mysql | 2021-12-28 21:25:22 08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
yy_mysql | 2021-12-28 21:25:22 08:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
加-d参数,挂后台启动
代码语言:javascript复制docker-compose up -d
停掉服务
代码语言:javascript复制docker-compose stop
docker ps 可以查看到启动了yy_mysql 和 yy_web两个容器
代码语言:javascript复制[root@iZ2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10495551676c h2_web "python manage.py ru…" 12 minutes ago Up 15 seconds 0.0.0.0:8000->8000/tcp yy_web
76ade7a55ab4 mysql:5.7 "docker-entrypoint.s…" 12 minutes ago Up 15 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp
需注意的是,这样部署后,同步数据库的指令,需进yy_web容器执行
代码语言:javascript复制python manage.py makemigrations
python manage.py migrate