- 打開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的鏡像。