参考 使用Docker部署Django服务
参考 Docker run 命令参数及使用
install docker + docker-compose
sudo apt install docker-ce -y
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker -v
docker-compose -v
docker version
docker-compose version
Docker run 命令参数
# 说明下参数意义
-i 打开STDIN,用于控制台交互
-t 分配一个伪终端 - 分配tty设备,该可以支持终端登录,默认为false
-d 分离模式: 在后台运行 - 指定容器运行于前台还是后台,默认为false
-p 映射端口:docker内部端口: 端口映射,只有将容器端口映射到外部,外部才能访问
-e 环境变量,指定一些服务内读取的变量,以初始化服务,这里的变量意义从字面上不难理解
--network 指定容器所在网络,需要互相访问的容器记得指定到同一个网络!
--name 容器名,这个名字在同一个容器网络里是可以直接当成域名访问的!
docker exec -it $(docker ps -a|awk '{print $1}') /bin/bash # 实际不能进入,要用 容器id 替换掉 $(docker ps -a|awk '{print $1}')
Docker 命令大全 - www.runoob.com
docker images # 查看已经存在的镜像
docker ps -a # 查看全部状态的容器 # https://www.runoob.com/docker/docker-ps-command.html
docker ps -a|awk '{print $1}' # 只显示镜像id
# 下面两个同样的效果
docker rm $(docker ps -a -q) # 删除所有已经停止的容器
docker rm $(docker ps -aq|awk '{print $1}') # 删除所有已经停止的容器
创建专属网络
docker network ls # 查看专属网络
docker network create django_net # 创建专属网络
docker network inspect django_net # 查看网络内部信息
docker install images
docker search mysql # 查看可用版本
docker images # 查看已经存在的镜像 - 检查是否安装完成
# 拉取 容器
docker pull mysql:8.0.18
docker pull python:3.8
docker 运行容器
# 运行容器
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.18 # ref runoob
docker run -d -p 3337:3306 --network django_net --name django_mysql -v $PWD/db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_USER=admin -e MYSQL_PASSWORD=123456 mysql:8.0.18
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
-d, --detach=false 指定容器运行于前台还是后台,默认为false
-p, --publish=[] 指定容器暴露的端口
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
# 查看专属网络的容器对应的IP地址
docker network inspect django_net|grep IPv4Address
docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器id
# 验证 容器内 mysql 是否运行正常
# 1. 进入 容器内部测试
docker exec -it 41708994233e /bin/bash # 实际不能进入,要用 容器id 替换掉 $(docker ps -a|awk '{print $1}')
# 2. 远程登录测试
mysql -h172.18.0.2 -uroot -p123456 -e 'show databases;' # 远程登录测试容器是否运行正常,远端是3306端口
mysql -uroot -P3307 -p123456 -e 'show databases;' # 为什么进不去呢。。。。
查看端口
Linux 查看端口占用情况可以使用 lsof 和 netstat 命令 # https://www.runoob.com/w3cnote/linux-check-port-usage.html
lsof -i:端口号
netstat -tunlp |grep grep 端口号
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
使用Dockerfile 部署Django应用
# Dockerfile
# use base python image with python 3.8
FROM python:3.8
RUN echo "这是一个py3.8环境,使用Dockerfile构建一个Django3.8的环境"
# install mysql-client
RUN apt-get update
RUN apt-get install -y mysql-client
# 镜像作者
MAINTAINER spider spider@company.com
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# env
ENV RUN_MODE=DEPLOY
# 创建 my_blog 文件夹
RUN mkdir /my_blog
# 将 my_blog 文件夹为工作目录
WORKDIR /my_blog
# 将当前目录加入到工作目录中(. 表示当前目录)
ADD . /my_blog
# 利用 pip 安装依赖 (-i 表示指定清华源,默认源下载过慢) # include django
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
#设置环境变量
ENV SPIDER=/my_blog
# RUN server after docker is up
CMD ./start.sh
编写 start.sh 命令脚本 - https://www.cangmangai.cn/archives/docker-django-deployment
# start.sh
#!/bin/sh
# 从第一行到最后一行分别表示:
# 1. 守护进程执行 celery,没有这个需求的小伙伴可以将第一行命令其删除
# 1. 收集静态文件到根目录,
# 2. 生成数据库可执行文件,
# 3. 根据数据库可执行文件来修改数据库
# 4. 启动 django 服务
python manage.py collectstatic --noinput &&
python manage.py makemigrations &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000 &&
在Dockerfile所在目录进行构建
docker build . -t django_web
启动django服务
docker run -d --network django_web --name django_web -p 6060:8000 django_web