折騰服務器:Docker 項目打包發佈 + 一鍵部署多個應用

博客原文:github server-docker-deploynode

最近在折騰 docker,可實現本地一鍵同時部署多個應用react

徹底不瞭解 docker 的建議先看 官方文檔 哦~linux

主要流程

  1. 開發完項目後,將項目用 docker 打包成鏡像,推到 DockerHub 上nginx

  2. 服務器配置好多個應用的 docker-compose 和 nginx 反向代理文件git

  3. 本地與遠程作鏈接,用免交互登陸服務器拉取鏡像並部署服務github

本地配置

1、下載 docker

  1. Mac 可直接用 brew 下載
brew cask install docker
複製代碼
  1. Windows 請參考官網,在此不作過多講解
  1. 啓動 docker

2、docker 配置

本文以打包 next-learn 服務端渲染 項目爲例,須要的請自行查看docker

  1. 項目中建立 Dockerfile
# 拉取 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
複製代碼
  1. 建立 .dockerignore

這個沒啥說的,防止將沒必要要的文件拷貝進 container 中npm

node_modules
yarn.lock
package-lock.json

build
dist
複製代碼
  1. 建立 npm 命令
"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:buildjson

  • 本地測試:yarn docker:runwindows

  • 推到 DockerHub:yarn docker:push,推送前記得登陸:docker login -u your_name -p your_password

服務器配置

1、安裝 docker

博主採用的是 Ubuntu 系統,其餘 linux 系統請酌情參考

  1. 能夠採用 snap 下載(博主採用的方式)
snap install docker
複製代碼
  1. 也能夠採用 apt
apt update
apt install docker.io
複製代碼

2、建立 docker-compose.yml

爲了方便部署多個項目,咱們採用 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
    # ...
複製代碼

3、配置 nginx 反向代理

  1. 咱們剛上傳的鏡像是能夠直接運行的
# 服務端也能夠直接運行
docker run --rm --name next-learn -d -p 8080:3000 lawler61/next-learn
複製代碼

這樣咱們能夠直接訪問 your_server_ip:8080,咱們用 nginx 是作反向代理,其中能夠配置上域名,隱藏端口

  1. 配置 nginx.conf,這個沒啥說的,原生配置
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;
}
複製代碼
  1. 配置 conf.d,裏面裝了各類 server,要反向代理成域名的請先自行在你購買的域名網站設置 DNS 解析

DNS

# 在當前目錄中(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;
  }
}
複製代碼
  1. 啓動 docker,而後訪問直接訪問域名就能夠啦
docker-compose up -d
# 查看容器狀況
docker ps
複製代碼

docker-start

  1. 自動化部署

爲了方便自動化部署,咱們再寫個腳本 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
複製代碼

4、本地免交互登陸服務器

服務器作好了一鍵部署的腳本,咱們在本地只要可以讓它執行便可

  1. 使用 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
複製代碼
  1. 免交互登陸服務器實現一鍵部署

這裏要用到 scripty 模塊幫助咱們自動管理命令,不瞭解的能夠先看看 文檔 testdouble/scripty

"scripts": {
  "deploy": "scripty"
}
複製代碼
  • 本地項目中建立 scripts 文件夾,在裏面建立 deploy.sh 文件,並寫入

scripty

#!/bin/sh 
ssh root@your_server_ip 'cd /root/projects && ./deploy.sh'
複製代碼
  • 記得給執行權限哦
chmod + x ./scripts/*
複製代碼
  1. 去吧!終極一鍵部署
# 若是 DockerHub 不是最新的要先 push 下:yarn docker:push
yarn deploy
複製代碼

yarn deploy

源碼獲取

最後

折騰了幾天,不容易,以爲有幫助的小夥伴加個💜哦~

相關文章
相關標籤/搜索