- 打开docker
- 在项目目录下编写 DockerFile 文件,以下是我项目中DockerFile文件,并对每一行进行解读
FROM python:3.6 # 项目的基础镜像为 python3.6
EXPOSE 8080 # docker的指定出口端口为8080
RUN mkdir /project_name # 创建项目的目录
COPY . /project_name/ # 将项目代码全部复制过去
RUN mkdir /log # 创建项目的日志文件夹
RUN mkdir /deployments # 创建部署项目的脚本目录
COPY run.sh /deployments # 将部署脚本复制到项目部署目录下
WORKDIR /project_name # 指定项目目录为工作目录
RUN pip3 install --upgrade pip # 升级pip包
RUN pip3 install -r requirements.txt -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn # 安装项目python环境所需要的包,这里指定了清华的镜像源,安装速度会快一些
ENTRYPOINT ["./docker-entrypoint.sh"]
CMD ["bash", "./run.sh"] # 部署项目的命令
- 编写部署脚本 run.sh , 举例如下:
我这里将服务名和每个服务的启动命令放到了列表中,去遍历
#!/bin/bash
#refer:https://docs.docker.com/config/containers/multi-service_container/
export PYTHONPATH=/project_name
# 所有服务的名字
server_names=(
'server:start_app'
'celery'
)
# 启动这些服务的bash命令,和server_names一一对应
start_commands=(
`nohup gunicorn 'server:start_app()' -c gunicorn.conf > /log/service.log 2>&1 &`
`nohup celery -A tasks.async_app worker --concurrency=3 -l INFO > /log/async_task.log 2>&1 &`
)
# 每个服务的日志的路径,和server_names一一对应
log_filenames=(
'/log/service.log'
'/log/async_task.log'
)
# 遍历所有服务,逐个启动
len=${#server_names[@]}
for ((i=0;i<$len;i++))
do
${start_commands[$i]}
PROCESS_STATUS=$?
if [ $PROCESS_STATUS -ne 0 ]; then
echo "Failed to start ${server_names[$i]}, please see error log"
echo `cat ${log_filenames[$i]} | tail -n 150`
exit PROCESS_STATUS
fi
done
# 每30s遍历所有服务,检测服务运行状态
while sleep 30; do
for ((i=0;i<$len;i++))
do
ps aux |grep ${server_names[$i]} |grep -q -v grep
PROCESS_STATUS=$?
if [ $PROCESS_STATUS -ne 0 ]; then
echo "ops~~ : ${server_names[$i]} has already exited, please see error log"
echo `cat ${log_filenames[$i]} | tail -n 150`
exit 1
fi
done
done
- 编写gunicorn.conf 文件,可以指定gunicorn启动服务的配置,举例
workers = 2
bind = "0.0.0.0:8080"
worker_class = "gevent"
timeout = 90
max_requests = 3000
threads = 8
- 本地测试
# 创建镜像,进入本地项目目录,指定Dockerfile所在路径
docker build -t project_name ~/PycharmProjects/project_name
# 启动容器
docker run -it -p 8888:8080 project_name bash run.sh
-
若本地启动一切正常,编写.gitlab-ci.yml文件,推送到gitlib上,走CI/CD 流程,可以看到最新的pipeline已打包完成
-
将容器注册到gitlib上,方便以后直接拉取
-
一些常用的 docker 命令
查看docker信息: docker info
查看镜像列表:docker images
停用镜像:docker stop ImageID
重启镜像: docker start imageID
重命名镜像: docker tag imageID imageREPOSITORY:imageTAG
删除镜像:docker rmi imageID
查看容器:docker ps
docker ps -a 查看所有容器,包括启动失败的
重命名容器:dokcer rename 容器ID mytomcat7:jre7
停止容器:docker stop 容器Name
删除所有未启动容器:docker container prune
删除容器: docker rm ID
从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
使用 docker search 命令来搜索镜像。如搜索httpd的镜像。