Docker/Docker-Compose部署Django前后不分离开发
-
什么是Dockerfile
类似于脚本,将docker镜像,使用自动化的方式实现出来。 -
Dockerfile的作用
找一个镜像: ubuntu 创建一个容器: docker run ubuntu
进入容器: docker exec -it 容器 命令
操作: 各种应用配置
…
构造新镜像: docker commit
-
Dockerfile使用准则
1.大: 首字母必须大写D2.空: 尽量将Dockerfile放在空目录中。
3.单: 每个容器尽量只有一个功能。
4.少: 执行的命令越少越好。
1.Dockerfile使用命令
构建镜像命令格式:
docker build -t [镜像名]:[版本号][Dockerfile所在目录]
构建样例:
docker build -t nginx:v0.2 /opt/dockerfile/nginx/
参数详解:
-t 指定构建后的镜像信息,
/opt/dockerfile/nginx/则代表Dockerfile存放位置,如果是当前目录,则用 .(点)表示
#Dockerfile快速入门
docker,docker-compose安装
第一步
切换yum源:
https://blog.csdn.net/wangshuminjava/article/details/84380308
https://blog.csdn.net/qq_39157144/article/details/94717837
第二步
1. 安装docker
Centos:https://www.runoob.com/docker/centos-docker-install.html
Ubuntu:https://www.cnblogs.com/leoshi/archive/2004/01/13/12742276.html
2.安装docker-compose
下载地址:http://get.daocloud.io/
apt地址:https://blog.csdn.net/diligent_lee/article/details/79098302
第三步
- 把项目放到服务器上
比如: 在 home 目录下建一个 root文件夹,把项目放在里面
在项目应用目录下建 Dockerfile 文件
从仓库拉取 带有 python 3.7 的 Linux 环境
FROM python:3.7
设置 python 环境变量
ENV PYTHONUNBUFFERED 1
添加这两行
RUN apt-get update
RUN apt-get install python3-dev default-libmysqlclient-dev -y
创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
WORKDIR /code
更新 pip
RUN pip install pip -U -i https://mirrors.aliyun.com/pypi/simple/
将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt /code/
安装库 并使用阿里源安装
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
将当前目录复制到容器的 code 目录
ADD . /code/
FROM python:3.7 | 指令从仓库拉取一个包含 python 3.7 的 Linux 操作系统环境 |
---|---|
RUN 和 WORKDIR | 指令都是针对容器的,功能是在docker容器里创建目录、并将其设置为工作目录;注意宿主机是没有这个目录的 |
ADD requirements.txt /code/ | 意思是将宿主机当前目录(即 Dockerfile 所在目录)的 requirements.txt 文件复制到容器的 /code 目录中 |
ADD . /code/ | 把当前目录所有内容复制到容器 /code/ 目录,注意中间那个点 |
2. 在项目根目录下建 docker-compose.yml文件
version: "3"
services:
app:
restart: always
build: . # '点'代表当前目录
dockerfile:./c/d/Dockerfile
command: "python3 manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
container_name: docker-web-container
db:
image: mysql:5.7
volumes:
- "./mysql:/var/lib/mysql"
ports:
- "3306:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=mypassword
- MYSQL_DATABASE=django_app
version | 代表 docker-compose.yml 的版本,目前最新版为 3 |
---|---|
restart | 除正常工作外,容器会在任何时候重启,比如遭遇 bug、进程崩溃、docker 重启等情况 |
build | 指定一个包含Dockerfile的路径,并通过此 Dockerfile 来构建容器镜像。注意那个 “.” ,代表当前目录 |
dockerfile | 如果需要指定额外的编译镜像的Dockefile 文件,可以通过该指令来指定。 |
command | 容器运行时需要执行的命令。这里就是我们很熟悉的运行开发服务器了。 |
volumes | 卷,这是个很重要的概念。宿主机和容器目录的映射。 |
ports | 定义了宿主机和容器的端口映射;宿主机端口映射到本容器的端口 |
depends_on | 意思是此容器需要等待 db 容器启动完毕才能够启动 |
image | 从仓库拉取 MySQL 5.7镜像。可以自己定版本 |
container_name | 指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。 需要注意,指定容器名称后,该服务将无法进行扩展,因为 Docker 不允许多个容器具有相同的名称 |
environment | 定义容器的环境变量,设置了 MySQL 的 root 用户的密码、数据库的名称。 |
详细链接 | https://blog.csdn.net/jiangyu1013/article/details/82772363 |
3.修改Django的setting.py中数据库的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_app',
'USER': 'root',
'PASSWORD': 'mypassword',
'HOST': 'db', #注意 HOST 填写的是docker容器的名称,即 db
'PORT': '3306',
'OPTIONS': {'charset': 'utf8'},
}
}
3. 运行docker
docker-compose up
4.安装nginx
1.安装nginx
yum install nginx
2.进入nginx的目录
cd /etc/nginx/conf.d
3.编辑你的前端项目配置
vi your_name.conf
your_name.conf 是自己随便取的名字,只要是xxx.conf就行
server {
listen 80;
server_name localhost; #有域名放域名,没域名就是 localhost
location / {
root /wwwroot/h5; #这里放前端项目目录地址
index index.html;
}
}
保存退出编辑
使用dockerfile/docker-compose部署。
1.确定项目的服务,比如mysql,redis,nginx等…
2. 为各个服务编写dockerfile。
- Nginx --> Dockerfile
FROM nginx:本版 RUN rm -rf /etc/nginx/nginx.conf COPY ./compose/production/nginx/nginx.conf /etc/nginx/
- Redis --> Dockerfile
FROM redis:本版
- Web服务 --> Dockerfile
FROM python:本版
RUN apt-get update && \
apt-get install -y openssl build-essential libopenblas-dev \
netcat \
gettext
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
COPY . /app
EXPOSE 8000
WORKDIR /app
ENV PIPENV_VENV_IN_PROJECT 1
RUN pip install -r requirments.txt
这个位置要看项目具体使用什么服务,可能需要其他sh文件来启动,或者是初始化。
- db
数据库位置比较麻烦 FROM postgres:11 COPY ./compose/postgresql.conf /postgresql.conf #读取数据库配置 COPY ./compose/postgres/backup.sh /usr/local/bin/backup RUN chmod +x /usr/local/bin/backup COPY ./compose/postgres/restore.sh /usr/local/bin/restore RUN chmod +x /usr/local/bin/restore COPY ./compose/postgres/list-backups.sh /usr/local/bin/list-backups RUN chmod +x /usr/local/bin/list-backups
3.使用Docker-compose管理
version: '2'
services:
nginx:
build:
context: .
dockerfile: Nginx的dockerfile文件位置
restart: unless-stopped
container_name: nginx
ports:
- "8001:8001"
- "8000:8000"
volumes:
- .:/app
- .nginx的配置文件位置和Docker映射位置,如同redis的volumes
depends_on:
- web
web:
build:
context: .
dockerfile: web的dockerfile文件位置
restart: unless-stopped
container_name: django
command: bash -c "python manage.py migrate && python manage.py collectstatic --noinput && python manage.py createdefault && gunicorn mysite.wsgi --worker-class=gevent -b 0.0.0.0:8000 -w 4"
depends_on:
- db
- redis
volumes:
- .:/app
expose:
- "8000"
env_file: .env
db:
build:
context: .
dockerfile:db的dockerfile文件位置
restart: unless-stopped
container_name: postgres
volumes:
- 配置文件映射位置
ports:
- "1234:1234" # 可以自定义
env_file: .env
redis:
image: redis:3.0
restart: unless-stopped
container_name: redis
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf 映射位置
最后使用docker-compose build开始创建和启动你的docker服务。