一、準(zhǔn)備鏡像和WEB文件夾:
# 基礎(chǔ)鏡像環(huán)境
python:3.6 # 運(yùn)行環(huán)境鏡像
nginx # 部署鏡像
# 項(xiàng)目文件夾:
--web/
--app/ # 項(xiàng)目文件
--wsgi.py # 啟動(dòng)入口
--requirement.txt # flask運(yùn)行環(huán)境包
--Dockerfile # 后端運(yùn)行鏡像配置
--gunicorn_conf.py # 啟動(dòng)配置
-- ... # 其他配置略...
--vue_index/
--dist/ # 打包的vue項(xiàng)目
--Dockerfile # 部署前端運(yùn)行配置(由于是前后端分離部署童太,所以后端由前端轉(zhuǎn)發(fā))
--default.conf # nginx配置
1、打包項(xiàng)目
1)、web/Dcokerfile配置
FROM python:3.6 # 基于py3.6鏡像
RUN mkdir /web # 創(chuàng)建文件夾
WORKDIR /web # 執(zhí)行路徑(等同cd /web)
COPY requirements.txt /usr # 復(fù)制當(dāng)前文件到容器內(nèi)
COPY . /web # 復(fù)制本文件項(xiàng)目到容器
RUN pip install --no-cache-dir -r /usr/requirements.txt # 安裝運(yùn)行需要的包
CMD ["gunicorn", "wsgi:app", "-c", "/web/gunicorn_conf.py"] # gunicorn執(zhí)行
2)约素、web/gunicorn_conf.py
注意點(diǎn):在docker中執(zhí)行項(xiàng)目的話和直接在linux執(zhí)行有區(qū)別,在docker中運(yùn)行不能用
-d 后臺(tái)運(yùn)行笆凌。
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
bind = '0.0.0.0:8000'
backlog = 512
timeout = 30
worker_class = 'gevent'
workers = multiprocessing.cpu_count() * 2 + 1
threads = 2
loglevel = 'info'
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
accesslog = "/web/logs/gunicorn_access.log" # 訪問(wèn)日志文件
errorlog = "/web/logs/gunicorn_error.log"
3)圣猎、生成項(xiàng)目鏡像:
docker build -t web:1 .
2、打包nginx+前端
1乞而、vue_index/Dockerfile
# 設(shè)置基礎(chǔ)鏡像
FROM nginx
# 將dist文件中的內(nèi)容復(fù)制到 /usr/share/nginx/html/ 這個(gè)目錄下面
COPY dist/ /usr/share/nginx/html/
#用本地的 default.conf 配置來(lái)替換nginx鏡像里的默認(rèn)配置
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
VOLUME /data/vue_index /var/log/nginx
2 送悔、vue_index/default.conf
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / { # 直接匹配端口返回前端
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /api/ { # 匹配api的,轉(zhuǎn)發(fā)給后端爪模,
rewrite /api/(.*) /$1 break;
proxy_pass http://192.168.2.2:8000; # 這里是宿主機(jī)的ip
}
}
3欠啤、生成項(xiàng)目鏡像:
docker build -t vue_index:1 .
ps:只是簡(jiǎn)單的部署,主要是nginx部署轉(zhuǎn)發(fā)后端屋灌。
二洁段、啟動(dòng)
1、查看docker images
2共郭、啟動(dòng)后端容器:docker run -it -d -p 8000:8000 -v /data/web:/web web:1
-d:容器后臺(tái)啟動(dòng)
-p:宿主機(jī)端口映射容器端口
-v:掛載文件夾祠丝,在宿主機(jī)查看日志方便
3疾呻、啟動(dòng)nginx容器:docker run -it -d -p 8001:80 vue_index:1
ps:這里要注意的是宿主機(jī)的端口不能重復(fù)映射,現(xiàn)在啟動(dòng)容器后写半,我們可以通過(guò)訪問(wèn)ip+port進(jìn)行直接訪問(wèn)岸蜗。
如果有相關(guān)的后端請(qǐng)求的話會(huì)直接匹配ip+port+/api 進(jìn)行轉(zhuǎn)發(fā)到后端的接口,實(shí)際訪問(wèn)的接口不變
問(wèn)題:
1叠蝇、docker部署gunicorn,為什么啟動(dòng)不了璃岳?
gunicorn在docker啟動(dòng)時(shí)不能在后臺(tái)運(yùn)行
2、nginx部署vue怎么搞蟆肆?
將前端部署在nginx矾睦,通過(guò)匹配api進(jìn)行轉(zhuǎn)發(fā)到后端
3、docker容器之間怎么進(jìn)行通信炎功?(我總不能把數(shù)據(jù)庫(kù)的ip寫死吧)
可以通過(guò)network 進(jìn)行橋接
(docker-compose編排會(huì)提)
通過(guò)link進(jìn)行鏈接
4枚冗、docker怎么實(shí)現(xiàn)一鍵部署?
docker-compose進(jìn)行一鍵部署
5蛇损、docker部署需要用supervisor進(jìn)行守護(hù)嗎赁温?
docker-compose 執(zhí)行的時(shí)候能設(shè)置自動(dòng)重啟
6、web的環(huán)境比較復(fù)雜淤齐,安裝十分緩慢股囊,每次更新代碼就需要重新,有解決方法嗎更啄?
1稚疹、把環(huán)境的鏡像制作好,我們可以基于python36制作一個(gè)自己需要的flask環(huán)境鏡像祭务,每次啟動(dòng)dockerfile只用復(fù)制就行
2内狗、使用掛載,宿主機(jī)和容器內(nèi)映射义锥,修改宿主機(jī)內(nèi)容
7柳沙、鏡像啟動(dòng)了拉不起來(lái)怎么辦?怎么排除故障
1、首先使用docker logs -f contain_id 查看日志
2 拌倍、使用鏡像進(jìn)入查看赂鲤,docker run -it --rm web:1 sh ,然后在里面進(jìn)行執(zhí)行啟動(dòng)命令進(jìn)行查看。--rm是為了進(jìn)入鏡像不修改完全退出的
3柱恤、可以在容器內(nèi)直接執(zhí)行python wsgi.py進(jìn)行測(cè)試数初,排除是不是gunicorn故障,如果正常運(yùn)行則測(cè)試gunicorn啟動(dòng)命令
gunicorn解決方案
8、我在配置鏡像時(shí)候安裝py包很慢怎么辦梗顺?
修改容器內(nèi)鏡像源
在制作鏡像的目錄下創(chuàng)建文件pip.conf 內(nèi)容如下
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
Dockerfile內(nèi)容如下妙真,在安裝包之前配置好