Отказ от сервера: выпуск пакета проекта Docker + развертывание нескольких приложений одним щелчком мыши

Docker

Оригинальный пост в блоге:github server-docker-deploy

В последнее время я бросал докер, который может развертывать несколько приложений одновременно одним щелчком мыши локально.

Если вы совсем не понимаете докер, сначала прочтите его.Официальная документацияо~

Основной процесс

  1. После разработки проекта упакуйте проект в образ с помощью Docker и отправьте его на DockerHub.

  2. Сервер настроен с файлами обратного прокси-сервера docker-compose и nginx для нескольких приложений.

  3. Для локального и удаленного подключения используйте免交互Войдите на сервер, чтобы получить образ и развернуть службу.

локальная конфигурация

1. Загрузите докер

  1. Mac готов к использованиюbrewскачать
brew cask install docker
  1. Для Windows обратитесь к официальному веб-сайту, я не буду здесь слишком много объяснять.
  1. запустить докер

2. конфигурация докера

Эта статья упакована вследующий урок рендеринга на стороне сервераВозьмите проект в качестве примера, пожалуйста, проверьте его сами, если вам это нужно

  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

Это ни о чем не говорит, чтобы ненужные файлы не копировались в контейнер

node_modules
yarn.lock
package-lock.json

build
dist
  1. Создать команду нпм
"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",
}
  • Используйте упакованное зеркало команды сборки:yarn docker:build

  • Локальный тест:yarn docker:run

  • Отправить в DockerHub:yarn docker:push, не забудьте войти в систему перед нажатием:docker login -u your_name -p your_password

конфигурация сервера

1. Установите докер

Blogger использует систему 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, который содержит различные серверы.Если вы хотите использовать обратное прокси в доменное имя, настройте разрешение 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

Получение исходного кода

наконец

После метаний в течение нескольких дней это непросто, добавьте маленького друга, который считает, что это полезно 💜~