博客原文:github server-docker-deploynode
最近在折騰 docker,可實現本地一鍵同時部署多個應用react
徹底不瞭解 docker 的建議先看 官方文檔 哦~linux
開發完項目後,將項目用 docker 打包成鏡像,推到 DockerHub 上nginx
服務器配置好多個應用的 docker-compose 和 nginx 反向代理文件git
本地與遠程作鏈接,用免交互
登陸服務器拉取鏡像並部署服務github
brew
下載brew cask install docker
複製代碼
本文以打包 next-learn 服務端渲染 項目爲例,須要的請自行查看docker
# 拉取 node 鏡像,alpine 版本包最小
FROM node:10-alpine
# 設置 maintainer
LABEL maintainer "your_email@example.com"
# 將當前項目拷貝到鏡像中的 /app 文件中
COPY . /app
# 設置 /app 爲工做區
WORKDIR /app
# 執行命令
RUN yarn \
&& yarn build \
&& yarn cache clean
# 執行運行命令
CMD ["yarn","start"]
# 暴露出 3000 端口
EXPOSE 3000
複製代碼
這個沒啥說的,防止將沒必要要的文件拷貝進 container 中npm
node_modules
yarn.lock
package-lock.json
build
dist
複製代碼
"scripts": {
"docker:build": "docker build -t lawler61/next-learn .",
"docker:run": "docker run --rm --name next-learn -d -p 8080:3000 lawler61/next-learn",
"docker:push": "docker push lawler61/next-learn",
}
複製代碼
使用 build 命令打包鏡像:yarn docker:build
json
本地測試:yarn docker:run
windows
推到 DockerHub:yarn docker:push
,推送前記得登陸:docker login -u your_name -p your_password
博主採用的是 Ubuntu 系統,其餘 linux 系統請酌情參考
snap
下載(博主採用的方式)snap install docker
複製代碼
apt
apt update
apt install docker.io
複製代碼
爲了方便部署多個項目,咱們採用 docker-compose 來管理。.yml 文件嚴格要求對齊格式,請當心書寫
mkdir projects && cd projects
vi docker-compose.yml
# 寫入
version: '3'
services:
# proxy 爲服務名稱,可自行改變
proxy:
# 拉取的鏡像,這裏也採用 alpine
image: nginx:1.17.2-alpine
# 設置容器名稱,方便查看
container_name: nginx-proxy
ports:
# 設置 nginx 和宿主機的端口映射,注意 nginx 監聽的是 8080
- 80:8080
# - 8081:4000 這裏寫 app2 的端口映射
# 設置邏輯卷,用來與宿主機共享文件
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./conf.d:/etc/nginx/conf.d
# 第一個應用,
app1:
# 剛上傳的鏡像
image: lawler61/next-learn
container_name: next-learn
# app2:
# image: lawler61/react-lighter
# ...
複製代碼
# 服務端也能夠直接運行
docker run --rm --name next-learn -d -p 8080:3000 lawler61/next-learn
複製代碼
這樣咱們能夠直接訪問 your_server_ip:8080
,咱們用 nginx 是作反向代理,其中能夠配置上域名,隱藏端口
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
# 這裏來調用全部的 server 配置
include /etc/nginx/conf.d/*.conf;
}
複製代碼
# 在當前目錄中(projects)
mkdir conf.d && cd conf.d
vi next-learn.conf
# 寫入
# 設置代理名
upstream nl_upstream {
# 這裏 next-learn 爲 docker-compose 中設置的 container_name
# docker 自動 link,因此這裏能直接訪問到 app1 的 3000 端口
server next-learn:3000;
}
server {
# 監聽 8080
listen 8080;
# 配置域名,這裏要在你的域名作 DNS 解析,不然直接訪問不可以解析到
server_name lighter.omyleon.com;
location / {
# 設置反向代理
proxy_pass http://nl_upstream;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_redirect off;
}
}
複製代碼
docker-compose up -d
# 查看容器狀況
docker ps
複製代碼
爲了方便自動化部署,咱們再寫個腳本 deploy.sh
vi deploy.sh
# 寫入
#!/bin/sh
/snap/bin/docker-compose stop
/snap/bin/docker-compose rm -f
/snap/bin/docker-compose up -d
/snap/bin/docker ps
# 保存後記得給個執行權限
chmod +x ./deploy.sh
複製代碼
而後咱們執行腳本,就能夠快樂的一鍵部署了
./deploy.sh
複製代碼
免交互
登陸服務器服務器作好了一鍵部署的腳本,咱們在本地只要可以讓它執行便可
ssh-copy-id
提交 ssh 到服務器,實現免密
登陸ssh-keygen -t rsa -C "your_email@example.com"
ssh-copy-id -i /你本地ssh所在地址/id_rsa.pub root@your_server_ip
# 提交完成後就能夠免密登陸
ssh root@your_server_ip
複製代碼
免交互
登陸服務器實現一鍵部署這裏要用到 scripty
模塊幫助咱們自動管理命令,不瞭解的能夠先看看 文檔 testdouble/scripty
"scripts": {
"deploy": "scripty"
}
複製代碼
scripts
文件夾,在裏面建立 deploy.sh
文件,並寫入#!/bin/sh
ssh root@your_server_ip 'cd /root/projects && ./deploy.sh'
複製代碼
chmod + x ./scripts/*
複製代碼
# 若是 DockerHub 不是最新的要先 push 下:yarn docker:push
yarn deploy
複製代碼
折騰了幾天,不容易,以爲有幫助的小夥伴加個💜哦~