Позвольте мне сначала объяснить сценарий применения Я думаю, что большинство студентов, которые читают эту статью, не могут найти ее в Интернете.
Docker + Node + Nginx + Mysql
Обучение настройке этой комбинации включает в себя несколько ценных статей из-за рубежа, которые я давно искал, когда исследовал этот проект.В конце статьи я также опубликую несколько ссылок для всех, чтобы узнать. Начало этого проекта связано с тем, что команда надеется иметь собственную облачную платформу, которая оснащена некоторыми сервисами, такими как загрузка изображений, управление OSS, управление выпуском, служба DingTalk push, синтез речи и т. д., и эти сервисы совершенно разные. от наших ожиданий. Требуется участие серверной части. Уровень серверов у студентов в команде разный.Десять человек с одинаковой архитектурой могут выделить десять видов сред (думаю, это общая проблема большинства front-end и даже back-end команд). пытался использовать Docker для упаковки с нашей системой.
Если вы уже изучили Docker, просто найдите решение, вы хотите увидеть Dockerfile, вы можете перейти прямо к тому месту, где вы пишете Docker-Compose.
Грубый разговор о Докере
Я до сих пор помню компьютерный класс в школе, когда я учился в школе.VMware Workstation
? Это позволяет нам запускать виртуальные машины многих систем на Windows или Mac, иVMware Workstation
Важной концепцией является то, что宿主机-虚拟机
.
Новички могутDocker
понимается какVMware Workstation
Подобные продукты, но если нам нужно разобраться в их различиях, мы должны помнить, что они похожи только тем, что предоставляют другую систему изоляции для работы в системе.
В обычных условиях производительность виртуальных машин относительно невысока, а требования к конфигурации компьютеров и самих серверов высоки.Docker
При снижении этого порога производительность близка к голому железу.
Для чего нам нужна виртуальная машина? Нельзя ли просто поставить все приложения на сервер напрямую? Где конкретное применение Docker?
Позвольте мне поговорить об этом, вы хотите использовать Docker:
- Согласованная среда выполнения (между несколькими средами разработки, разработки и производства, а также другими произвольными средами)
- Более эффективный процесс развертывания доставки
- Простота расширения и миграции (существующие системы могут быть напрямую зеркалированы, а распределенное расширение легко)
- Более простое обслуживание: ваша конфигурация nginx, конфигурация узла, конфигурация mongo активны и унифицированы.
- Лучшая производительность, более высокая скорость и более высокая загрузка системы по сравнению с другими продуктами для виртуальных машин.
С другой стороны этих преимуществ, особенно проблемы развертывания и унификации среды, достаточно увеличить стоимость разработки систем без Docker.
Установить Докер
Если у вас MacOS или Windows, загрузите напрямуюDocker Desktop, если загрузка очень медленная, вы можете перейти кDaoCloud.
Если это Linux, вам необходимо выполнить следующие шаги, если ваш сервер неyum
Если да, то нужно установитьyum
,Установитьyum
Пространство не маленькое и расширяться здесь не будет.На всякий случай почистите Докер
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
Установить зависимости
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
установить источник ням(Можно любой другой, я использую Али здесь)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
обновить кеш
sudo yum makecache fast
Установить Docker-ce(CE означает версию сообщества, бесплатную для использования, у Docker также есть версия EE)
sudo yum -y install docker-ce
Запустить Докер
sudo systemctl start docker
тестовая команда
docker -v
На этом установка завершена. Приступаем к установкеDocker-Compose
Docker-Compose
традиционныйDocker
, для контейнера требуетсяDockerfile
Чтобы описать, если проект относительно большой и использует больше технологий, будет много контейнеров, если вам нужно выполнять один за другимDockerfile
, даже когда он запущен, он запускается один за другим, разработка будет исчерпана, а также будут исчерпаны эксплуатация и обслуживание.Docker-Compose
Решил проблему, предоставив каждому проекту файл описания и объединив все контейнеры в проекте.
Установить докер-компоновку
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
проверять
$ docker-compose -v
> docker-compose version 1.24.1, build 4667896b
Архитектура проекта
Прежде всего, давайте посмотрим, как устроен каталог нашего проекта.Следует отметить, что расположение хранилища проекта влияет на конфигурацию Docker. нашnode
Фреймворк использует AliEgg.js
.
├── docker-compose.yml ## docker-compose 配置入口
├── logs ## 日志存放位置
│ └── nginx
│ ├── access.log
│ └── error.log
├── mongo ## mongo 配置入口
│ ├── Dockerfile ## Mongo的 Dockerfile
│ └── mongo.conf ## mongo 配置
├── nginx ## nginx 配置
│ ├── cert ## SSL 证书存放目录
│ ├── conf.d
│ │ └── MicroServer.conf ## nginx 下我们服务的配置文件
│ ├── Dockerfile ## nginx 的 Dockerfile
│ └── nginx.conf
└── node ## node 项目存放目录
├── Dockerfile
└── Microservice ## 项目目录 以下为 Egg 的架构目录
├── app
│ ├── controller
│ ├── database
│ │ ├── init.js
│ │ └── schemas
│ ├── extend
│ │ └── application.js
│ ├── middleware
│ │ ├── gzip.js
│ │ └── jwt_error_handler.js
│ ├── public
│ └── router.js
├── app.js
├── appveyor.yml
├── config
│ ├── config.default.js
│ └── plugin.js
├── config.js
├── jsconfig.json
├── logs
├── node_modules
├── package.json
├── README.md
├── test
└── typings
Тогда поговорим оDockerfile
Что это такое?Он настраивает базовую систему образа в виртуальной машине, какой порт используется и какую команду запускать, а затем Docker сгенерирует пакет образа на основе этих команд.
Общая структура относительно ясна, здесь мы планируем создать отдельный контейнер для каждой программы.node
даnode
из,nginx
даnginx
из,mongo
даmongo
из. Сделай это, подавай большие блюда.
Докерфайл для nginx
# 使用社区里的 nginx:alpine 为基础镜像
FROM nginx:alpine
# 拷贝 nginx 全局配置文件
COPY nginx.conf /etc/nginx/
# apk 国内源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories
# 安装 nginx
RUN apk update \
&& apk upgrade \
&& apk add --no-cache openssl \
&& apk add --no-cache bash
# 启动 nginx
CMD nginx
# 暴露 80 端口和 443 端口给容器外部
EXPOSE 80 443
Dockerfile для узла
# 这里我用的镜像是 node 的稳定版
FROM node:10.16.3-alpine
# 拷贝项目文件进行构建
WORKDIR /app/Microservice
COPY ./Microservice/package.json ./
RUN npm install --registry=https://registry.npm.taobao.org
# 拷贝项目文件
COPY ./Microservice/* ./
# 启动服务
CMD ["npm","run","dev"]
# 暴露 7001 端口到宿主机
EXPOSE 7001
Следует отметить, что здесь мы работаемnpm run dev
, потому что процесс docker требует, чтобы ваша программа работала на переднем плане, если вы используетеnpm run start
, ничто в контейнере не будет занимать вывод, что заставит контейнер думать, что программа была выполнена.
Кроме того, здесь мы отдельноpackage.json
Скопировал копию, чтобы разобраться со следующим нам нужно отделитьnode_modules
для создания сопоставленного тома. Далее будет объяснено, почему необходимо разделитьnode_modules
сделать рулон
Докерфайл для монго
# 使用 mongo 最新版镜像
FROM mongo:latest
# 把宿主机的 Mongo 配置文件拷贝到容器内
COPY mongo.conf /usr/local/etc/mongo/mongo.conf
# 映射外部 DB 的存储文件到容器内
VOLUME /data/db /data/configdb
# 启动 mongo
CMD ["mongod"]
# 暴露 27017 端口到宿主机
EXPOSE 27017
Запишите файл конфигурации Node/Nginx/Mongo в docker-compose.yml.
version: "3"
networks: # 自定义网络
my-network: # 网络名字
driver: bridge # 由网关驱动
volumes: # 创建自定义卷
node_modules: # 卷名
mongo_data:
services: # 定义每个服务的容器
### nginx #################
nginx: # nginx 容器 这里的名字可以当做变量使用
build: # 定义需要构建的内容
context: ./nginx # 选取 nginx 文件夹
ports: # 映射端口
- 80:80
- 443:443
volumes: # 挂载文件夹,配置我们可以写在宿主机,然后挂载进去
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/cert:/etc/nginx/cret
- ./logs/nginx:/var/log/nginx
restart: always # 服务挂了的时候始终自动重启
depends_on: # 定义容器启动顺序 附带容器间的依赖关系
- nodejs
networks: # 使用我们上面定义的网络
- my-network
### node ##############
nodejs:
build:
context: ./node # 构建 node 目录 他会去 node 下面寻找 Dockerfile
ports:
- 127.0.0.1:7001:7001 # 映射 7001
volumes:
- ./node/Microservice:/app/Microservice # 项目文件映射
- node_modules:/app/Microservice/node_modules # 单独处理 node_modules
restart: always
depends_on:
- mongo
networks:
- my-network
### mongoDB ########################
mongo:
build:
context: ./mongo
ports:
- 127.0.0.1:27017:27017
volumes:
- mongo_data:/data/db # 这里的 mongo_data 用的是上面的自定卷
restart: always
networks:
- my-network
Есть несколько моментов, на которые следует обратить внимание выше:
1,Брандмауэр внутреннего порта:
ports
где находится порт, если мы добавим предыдущий порт с помощью127.0.0.1
, docker предотвратит доступ внешней сети к этому порту и разрешит только внутренний доступ.Как мы добавили к базе данных и узлу выше, обычная база данных не разрешает доступ к внешней сети.node
Мы также используемnginx
Прокси был сделан, поэтому нет необходимости в прямом доступе, вы можете решить, открывать ли его в соответствии с вашими потребностями.
2,node_modules
заниматься отдельно:
nodejs
изnode_modules
Он должен быть обработан отдельно. Это для нашего местного развития. Когда мы разрабатываем локально, контейнер вверх, и мы идем в писать бизнес-код. Нет необходимости снова создавать контейнер. Docker автоматически сопоставит его, ноnode_modules
Каждый раз, когда мы выполняемnode
изnpm run install
Когда он закончится, эта папка будет создана только в контейнере, а не на хост-компьютере, и бизнес-код, который мы меняем на хост-компьютере, должен быть автоматически синхронизирован с контейнером.Эта операция синхронизации связана с тем, что на нашем хост-компьютере нет Это.node_modules
, то синхронизация также вызоветnode_modules
Без него код не работает должным образом. Пучокnode_modules
После извлечения его как независимого тома, помимо необходимости обновления зависимых пакетов, нам приходится повторноbuild
Зеркало, обычные изменения в коде приложения нужно только сохранить.
бегать
Хорошо, пока ваша среда в основном готова, выполните
docker-compose up -d
Посмотрите, нормально ли он работает
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bedfab2a306 front-end-microservice_nginx "/bin/sh -c nginx" 18 seconds ago Up 15 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp front-end-microservice_nginx_1
d1d539672df5 front-end-microservice_nodejs "docker-entrypoint.s…" 20 seconds ago Up 18 seconds 127.0.0.1:7001->7001/tcp front-end-microservice_nodejs_1
8f1b1401a4dc front-end-microservice_mongo "docker-entrypoint.s…" 24 seconds ago Up 20 seconds 127.0.0.1:27017->27017/tcp front-end-microservice_mongo_1
Готово, ваш проект должен быть готов. Теперь отправьте Будду на запад. Давайте соединим его с монго, чтобы увидеть в контейнер монго
docker exec -it front-end-microservice_mongo_1 /bin/sh
Открыть после входа в контейнерmongo shell
$ mongo
// 用户表
> use admin
// 创建管理员
> db.createUser(
{
user: "admin", // 用户名
pwd: "admin", // 密码
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
> use test // 创建 test 数据库
> db.createUser( // 创建 test 库账号
{
user: "test",
pwd: "test",
roles: [
{ role: "readWrite", db: "test" } #读写帐号
]
}
)
хорошо, тогда открывайmongo
Инструмент для подключения, я использовал этоmongo
ОфициальныйMongoDB Compass
Ссылка прошла успешноЗатем используйте Postman для локального доступа127.0.01:7001
, любой из ваших интерфейсовКонфигурация завершена.
Развертывание запущено
выгода отDocker
, наше развертывание очень простое, нам нужно только установить его на серверDocker
,docker-compose
(На самом деле, я считаю, что вам не нужно их устанавливать. Серверная часть компании обычно нуждается в этом, плюс эксплуатация и обслуживание компании также делают это...), а затем запустите предложение
docker-compose up -d
Другая вещь, которую нужно изменить, — это не что иное, как ваша конфигурация, такая как имя домена, порт и база данных связанной базы данных в nodejs.Настройте пароль учетной записи, как указано выше. Кроме того, поскольку мы используемdocker-compose
зарегистрированmongo
имя переменной, поэтому вnodejs
, мы можем напрямую использоватьmongo
Это имя действует как имя хоста, например, мое по адресуNode
файл конфигурации в.env
Вот и все:
DB_USER=test
DB_PASSWD=#test
DB_HOST=mongo
DB_PORT=27017
DB_NAME=test
Это автоматически свяжет локальный монго с узлом.
Nginx
Часть, вам нужно только изменить наш nginx.conf под файл nginx, который определяет вашу собственную конфигурацию nginx, следует отметить, что путь, который вы пишете в этом файле, должен быть путем в контейнере, например, мы ссылаемся на файл SSL, полный путь к файлу SSL на хосте:/data/front-end-microservice/nginx/cert/xxx.crt
, после копии Docker расположение внутри нашего контейнера:/etc/nginx/cret/xxx.crt
Это потому, что мыdocker-compose.yml
Зеркальный том указал:
nginx:
build:
context: ./nginx
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/cert:/etc/nginx/cret
- ./logs/nginx:/var/log/nginx
restart: always
depends_on:
- nodejs
networks:
- my-network
Каждый раз, когда вы изменяете файлы конфигурации, связанные с nginx, вам необходимо перезапустить nginx:docker-compose restart nginx
.
Вышеупомянутое в основном завершает весь процесс разработки-производства, и все коды можно найти в библиотеке шаблонов:egg-docker-template.
Если есть какие-либо ошибки, пожалуйста, исправьте меня.Кроме того, я надеюсь, что больше архитекторов смогут вместе поделиться архитектурой и проектированием фронтенда.Добро пожаловать, чтобы добавить мой WeChat (t1556207795), чтобы снимать кирпичи и говорить о фронтенде .
Использованная литература: