Локальная разработка + развертывание Docker+Node+Nginx+Mongo, написанного для внешнего интерфейса

Docker
Локальная разработка + развертывание Docker+Node+Nginx+Mongo, написанного для внешнего интерфейса

Позвольте мне сначала объяснить сценарий применения Я думаю, что большинство студентов, которые читают эту статью, не могут найти ее в Интернете.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 mongodb compassСсылка прошла успешноmongodb compassЗатем используйте Postman для локального доступа127.0.01:7001, любой из ваших интерфейсовpostmanКонфигурация завершена.

Развертывание запущено

выгода от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), чтобы снимать кирпичи и говорить о фронтенде .

Использованная литература: