在上一篇 Docker + node(koa) + nginx + mysql 開發環境搭建,我們進行了本地開發環境搭建
現在我們就來開始線上環境部署
如果本地環境搭建沒有什么問題,那么線上部署的配置也就很簡單了
我所使用的環境,Linux Mint,命令有不同可以適當更改
目錄結構
- compose 新建,線上環境配置
- data
- conf
- node_modules
- static
- docker-compose.yml
- docker-compose-prod.yml 新建,線上環境配置
- package.json
- server.js
- yarn.lock
線上服務配置
我們現在需要3個服務:
- Node
- Nginx
- Mysql
在根目錄下compose文件夾內,創建對應的Dockerfile配置文件,mysql是使用的鏡像文件,就不用創建Dockerfile
compose/node/Dockerfile
compose/nginx/Dockerfile
1.Node服務配置
compose/node/Dockerfile
FROM node:12-alpine # 使用的基礎鏡像文件
WORKDIR /code # 工作目錄的路徑
COPY ./package.json ./server.js /code/ # 拷貝文件到/code
COPY ./static /code/static # 拷貝文件到/code/static
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk update && apk add yarn \
&& yarn config set registry https://registry.npm.taobao.org/ \
&& yarn # 這一竄命令,設置鏡像源到國內(加速),更新,安裝yarn,yarn設置國內鏡像源,yarn安裝node依賴
CMD ["npm", "start"] # 容器啟動時運行
FROM指定基礎鏡像文件WORKDIR工作目錄的路徑COPY拷貝本地文件到容器內RUN在 docker build 時運行命令CMD在 docker run 時運行命令
關於Dockerfile更詳細的介紹可以查看 這里
2.Nginx服務配置
compose/nginx/Dockerfile
這個配置文件很簡單,我們只需要把本地的nginx conf文件拷貝到容器里,刪除默認配置
FROM nginx:1.17
RUN rm /etc/nginx/conf.d/default.conf
COPY ./conf/default.conf /etc/nginx/conf.d/default.conf
nginx conf域名設置
線上部署是需要一個域名的,我們現在假設一個域名測試:
conf/default.conf
server {
listen 80;
server_name localhost yoursite.com; # 這里添加你們的域名
...
}
我們在本地修改/etc/hosts,就可以測試了
127.0.1.1 yoursite.com
3.compose
和本地環境配置一樣,要管理多個服務,我們需要compose文件來管理
在之前我們已經說明了,mysql是直接使用鏡像,沒有額外的修改,就不需要Dockerfile了
docker-compose-prod.yml根目錄新建配置文件
version: "3"
volumes:
static: # 數據卷名稱
db: # 數據卷名稱
services:
web:
build: # 構建鏡像
context: ./ # 上下文環境
dockerfile: ./compose/node/Dockerfile # Dockerfile路徑
ports:
- "3000:3000"
volumes:
- static:/code/static # 使用前面聲明的static掛在容器/code/static
restart: always # 總是重啟
nginx:
build:
context: ./
dockerfile: ./compose/nginx/Dockerfile
ports:
- "80:80"
volumes:
- static:/code/static
restart: always
mysql:
image: mysql:5.6 # 直接使用鏡像構建
env_file: .env # 環境變量env,我們寫入到了配置文件里,避免密碼泄漏
volumes:
- db:/var/lib/mysql
ports:
- "3306:3306"
restart: always
和之前的配置基本一樣,不過有一些小的改動
volumes數據卷,我們設置了2個數據卷,static和db,下面就可以直接使用,它會自動創建並掛在到系統制定的目錄/var/lib/docker/volumes/xxxx_static
build我們之前是使用的image鏡像構建,同樣build也可以,因為我們在Dockerfile里面已經聲明了鏡像了context指定上下文運行環境到根目錄,我們build時需要一個上下文環境dockerfile指定當前服務的Dockerfile配置
restart總是重啟
測試服務
配置已經寫好,我們來測試服務是否正常
sudo docker-compose -f docker-compose-prod.yml build
sudo docker-compose -f docker-compose-prod.yml up
服務運行起來,如果你能通過yoursite.com訪問的話,說明配置成功
正式上線
我們只需要把源代碼copy到服務器上然后運行上面兩條命令即可
至於如何上傳到服務器,FTP,GIT等...都可以
總結
在服務器已經安裝好docker的情況下,和我們本地跑服務沒有任何區別,各種順滑,無障礙
從此以后就不再糾結線上線下環境不一致的問題了
珍愛生命,LOVE & PEACE
附錄
服務器上安裝Docker
服務器上也需要安裝Docker,docker-compose,具體安裝步驟有詳細的官方文檔:
