Оригинальный пост в блоге:github server-docker-deploy
В последнее время я бросал докер, который может развертывать несколько приложений одновременно одним щелчком мыши локально.
Если вы совсем не понимаете докер, сначала прочтите его.Официальная документацияо~
Основной процесс
-
После разработки проекта упакуйте проект в образ с помощью Docker и отправьте его на DockerHub.
-
Сервер настроен с файлами обратного прокси-сервера docker-compose и nginx для нескольких приложений.
-
Для локального и удаленного подключения используйте
免交互
Войдите на сервер, чтобы получить образ и развернуть службу.
локальная конфигурация
1. Загрузите докер
- Mac готов к использованию
brew
скачать
brew cask install docker
- Для Windows обратитесь к официальному веб-сайту, я не буду здесь слишком много объяснять.
- запустить докер
2. конфигурация докера
Эта статья упакована вследующий урок рендеринга на стороне сервераВозьмите проект в качестве примера, пожалуйста, проверьте его сами, если вам это нужно
- Создайте 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
- Создать .dockerignore
Это ни о чем не говорит, чтобы ненужные файлы не копировались в контейнер
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",
}
-
Используйте упакованное зеркало команды сборки:
yarn docker:build
-
Локальный тест:
yarn docker:run
-
Отправить в DockerHub:
yarn docker:push
, не забудьте войти в систему перед нажатием:docker login -u your_name -p your_password
конфигурация сервера
1. Установите докер
Blogger использует систему Ubuntu, в случае необходимости, другие системы Linux, см.
- может быть использован
snap
Скачать (как используют блогеры)
snap install docker
- также можно использовать
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
- Изображение, которое мы только что загрузили, можно запустить напрямую.
# 服务端也可以直接运行
docker run --rm --name next-learn -d -p 8080:3000 lawler61/next-learn
так что мы можем получить прямой доступyour_server_ip:8080
, в качестве обратного прокси используем nginx, который может настроить доменное имя и скрыть порт
- Настроить 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;
}
- Настройте conf.d, который содержит различные серверы.Если вы хотите использовать обратное прокси в доменное имя, настройте разрешение 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;
}
}
- Запустите docker, а затем получите прямой доступ к доменному имени.
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
4. Местный免交互
сервер входа
Сервер подготовил сценарий развертывания в один клик, нам нужно только иметь возможность выполнить его локально
- использовать
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
Получение исходного кода
наконец
После метаний в течение нескольких дней это непросто, добавьте маленького друга, который считает, что это полезно 💜~