今天整理了一下如何在docker中部署django項目。
1.環境如下:
python3.6 django2.0.5 nginx mysql5.7 gunicorn
2.項目結構如下:
由於僅僅是測試,項目比較簡單,複雜的項目也是這個流程。
通過上面的結構,我們需要編寫的文件包括
blog/Dockerfile, blog/gunicorn.conf, blog/start.sh, nginx/Doickerfile, nginx/nginx.conf, docker-conpose.yml
3.blog/Dockerfile(基礎鏡像使用的是python:3.6,而不是ubuntu、centos。如果是ubuntu、cenos,Dockerfile文件中需要配置python環境):
FROM python:3.6 # 選擇基礎鏡像,這裏的基礎鏡像也可以選擇ubuntu,centos等,但是下面的配置就會發生變化
# 創建工作目錄
RUN mkdir /blog
#設置工作目錄
WORKDIR /blog
#將當前目錄加入到工作目錄中
ADD . /blog
RUN pip3 install -r requirements.txt
#對外暴露端口
EXPOSE 80 8080 8000 5000
#設置環境變量
ENV SPIDER=/blog
4.blog/gunicorn.conf:
workers=2
bind='0.0.0.0:8000'
proc_name='blog'
5.blog/start.sh:
#!/bin/bash
python manage.py collectstatic --noinput&&
python manage.py makemigrations&&
python manage.py migrate &&
gunicornblog.wsgi:application -c gunicorn.conf
6.nginx/Dockerfile:
FROM nginx # nginx鏡像,最好是先拉取到本地
# 對外暴露端口
EXPOSE 80 8000
RUN rm /etc/nginx/conf.d/default.conf # 刪除原有配置文件
ADD nginx.conf /etc/nginx/conf.d/ # 添加配置文件
RUN mkdir -p /usr/share/nginx/html/static # 創建靜態資源文件夾
7.nginx/nginx.conf:
server {
listen 80;
server_name localhost;
location /static {
alias /usr/share/nginx/html/static;
}
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
8.docker-compose.yml:
version: "3"
services:
db:
image: mysql:5.7 # mysql鏡像,最好先拉取到本地
environment:
- MYSQL_HOST=localhost
- MYSQL_DATABASE=docker
- MYSQL_USER=root
- MYSQL_PASSWORD=wyzane
- MYSQL_ROOT_PASSWORD=wyzane
volumes:
- /home/wyzane/pyprojects/db:/var/lib/mysql # 將宿主機與容器中的文件映射
restart: always # 若容器運行出現問題,會自動重啓容器
web:
build: ./blog
ports:
- "8000:8000"
volumes:
- ./blog:/blog
- /tmp/logs:/tmp
command: bash start.sh # 執行命令,有多種格式
links:
- db
depends_on:
- db
restart: always
nginx:
build: ./nginx
ports:
- "80:80"
volumes:
- ./blog/static:/usr/share/nginx/html/static:ro
links:
- web
depends_on:
- web
restart: always
9.依次執行以下命令:
docker-compose build
docker-compose up -d
10.執行完成後,通過
docker images 命令可以查看新增了2個鏡像
docker ps 命令可以查看啓動了3個容器
多執行幾次docker ps,當容器的STATUS是以Restarting開頭時,表示這個容器運行時發生了錯誤。執行docker logs CONTAINERID可以查看容器出錯的具體原因。
若上述容器都成功運行,則在瀏覽器中輸入http://127.0.0.1:80/api/v1/articles/info/時,視圖會返回相應的結果。
以交互方式進入容器:
docker exec -it CONTAINERID /bin/bash
後,進入mysql數據庫,會看到在數據庫中生成了相應的表。
11.運行中遇到的問題,在運行3個容器後,web容器一直報錯,通過
docker logs CONTAINERID查看主要錯誤信息如下:
django.db.utils.OperationalError: (2003, 'Can\'t connect to MySQL server on \'mariadb55\' (111 "Connection refused")')
解決方案在這裏 https://stackoverflow.com/que...
主要是在settings.py中,將database配置中的HOST值改成db,而不是127.0.0.1,指向docker-compose.yml中的db服務
參考自 https://blog.csdn.net/hbnn111...
今天就聊到這裏,如有疑問,歡迎交流!