Перед тем как начать подготовку, необходимо установить Docker и Docker-compose. Инструкции по установке Docker
Содержимое файла:
version: '3'
services:
api:
build: ./api
- API бэкенд
- AUTH бэкенд
- FRONTEND
Содержимое файла:
FROM node:13.12./0-alpine -- монтировать образ NODEJS с минимальным весом
После подготовки окружения необходимо протестировать образ.
docker-compose build
npm init
npm install express
npm install mongoose
####3.1 Создать папку SRC и файл index.js внутри
Простой сервер для обработки запроса:
const express = require('express');
const app = express();
app.get('/test', (req, res) => {
res.send("Our API sercer is working correctly");
});
app.listen(3000, () => {
console.log("Started API service");
})
"scripts": {
"start": "node src/index.js"
}
FROM node:13.12./0-alpine
WORKDIR /usr/src/app --указываем рабочую директорию откуда будут браться файлы для создания контейнера
COPY package*.json ./ --копируем файлы package.json и package-lock.json в контейнер
RUN npm install --запускаем команду установки зависимостей node в контейнере
COPY . . --копируем все файлы в папке API во внутрь контейнера
docker-compose build
EXPOSE 3000 -- открываем порт в контейнере для того, чтобы получить доступ снаружи
CMD ["node", "run start"] -- выполняем внутри контейнера команды для запуска сервера
или изменить Docker-compose.yml
version: "3.8"
services:
api:
build: ./api
command: npm run start -- выполняем команду для запуска сервера
ports:
- "3000:3000" -- соединяем порты 3000 на локалке и на контейнере
docker-compose build
docker-compose up
environment:
- PORT=3000
- HOST=http://realworld-docker.com
environment:
- PORT=3000
- HOST=http://realworld-docker.com
- MONGO_URL=mongodb://api_db/27017/api
depends_on:
- api_db -- задаем зависимости! запустить контейнер API после контейнера API_DB
api_db:
image: mongo:latest
Cодержимое файла index.js
module.exports.port = process.env.PORT;
module.exports.host = process.env.HOST;
module.exports.db = process.env.MONGO_URL;
Cодержимое файла db.js
const mongoose = require("mongoose");
const { db } = require("../configuration");
module.exports.connectDb = () => {
mongoose.connect(db, { useNewUrlParser: true });
return mongoose.connection;
};
const express = require("express");
const mongoose = require("mongoose");
const { port, host, db } = require("./configuration");
const { connectDb } = require("./helpers/db");
const app = express();
const postSchema = new mongoose.Schema({
name: String
});
const Roque = mongoose.model("Roque", postSchema);
app.get("/test", (req, res) => {
res.send("Our api server is working correctly");
});
const startServer = () => {
app.listen(port, () => {
console.log(`Started api service on port ${port}`);
console.log(`Our host is ${host}`);
console.log(`Database url ${db}`);
const roqueOne = new Roque({ name: "Roque-one" });
roqueOne.save(function(err, result) {
if (err) return console.error(err);
console.log("result", result);
});
});
};
connectDb()
.on("error", console.log)
.on("disconnected", connectDb)
.once("open", startServer);
Добавить файле docker-compose.yml:
api_db:
image: mongo:latest
volumes:
- mongodb_api:/data/api_db -- указываем где будем хранить данные
volumes: -- инициализируем VOLUMES
mongodb_api:
docker volume ls
version: '3'
services:
api:
command: npm run dev
volumes:
- ./api/src:/usr/src/app/src
npm install nodemon
{
"scripts": {
"start": "node src/index.js",
"dev": "nodemon"
},
"dependencies": {
"express": "^4.17.1",
"mongoose": "^5.9.7",
"nodemon": "^2.0.3"
}
{
"verbose": false,
"watch": ["src"],
"exec": "node src/index.js"
}
docker-compose -f docker-compose.yml -f docker-compose.development.yml up --build
services:
api:
build: ./api
container_name: roque-one-api -- указываем имя контейнера
command: npm run start
restart: unless-stopped
ports:
- "3000:3000"
environment:
- PORT=3000
- HOST=http://realworld.com
- MONGO_URL=mongodb://api_db:27017/api
depends_on:
- api_db
Переходим в папку frontend.
npm init react-app frontend
frontend:
build: ./frontend
container_name: roque-one-frontend
command: npm run start
restart: unless-stopped
ports:
- "3000:3000"
stdin_open: true -- для интерактивного взаимодействия при создании creact-react-app
tty: true
Содержимое файла Dokcerfile
FROM node:13.12./0-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
RUN npm install -g serve
npm install -g serv
docker-compose build
docker-compose up
docker exec -it $container_name echo "Foo"
docker exec -it $container_name sh
nginx:
image: nginx:stable-alpine
container_name: roque-one-nginx
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf.prod:/etc/nginx/conf.d/nginx.conf -- задаем путь к конф. -- файлу NGINX
depends_on:
- frontend
ps aux | grep nginx
server {
listen 80;
server_name Roque-one.com;
location / {
proxy_pass http://frontend:3000;
}
}
npm install -y axios
Добавить в API Index.js
const axios = require("axios");
const { port, host, db, authApiUrl } = require("./configuration");
app.get('/currentuser', (req, res) => {
axios.get(authApiUrl + '/currentuser').then(response => {
res.json({
currentuser: true,
currentUserFromAuth: response.data
});
});
});
Добавить в AUTH Index.js
app.get("/api/currentuser", (req, res) => {
res.json({
id: "12345",
email: "user@email.com"
});
});
Добавить в > API/configuration Index.js
module.exports.authApiUrl = process.env.AUTH_API_URL;
Добавить в Docker-compose.yml новую переменную окружения AUTH_API_URL
environment:
- AUTH_API_URL=http://auth:3002/api
Вывести список сетей docker
docker network ls
Создать сеть и присоединить к нему приложение APP.(файл docker-compose)
app:
networks:
- docker-up
networks:
docker-up:
driver: bridge
location /api {
proxy_pass http://api:3001;
rewrite ^/api/(.*) /$1 break;
}
location /api {
proxy_pass http://auth:3002;
rewrite ^/auth/api/(.*) /$1 break;
}
npm i -y axios
docker-compose up --build
docker-compose -f docker-compose.yml -f docker-compose.development.yml up --build
$ docker swarm init --advertise-addr 192.168.99.100
$ docker node ls
$ docker swarm join-token worker
$ docker swarm join-token manager
$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
$ docker swarm join --token SWMTKN-1-5gn6hc6uvds8ckh886raf3peq1lcc3txbmm57vosbzvb561zpb-bp3nf5auzhzt2hbyi5vfo9jan 192.168.99.100:2377
$ docker info
$ docker node ls
$ docker service ls
$ docker node inspect self --pretty
$ docker node inspect node_name
$ docker swarm leave
$ docker node rm node_name
version: "3"
services:
wordpress:
image: wordpress
ports:
- 80:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_NAME: wp
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: wp_pass
mysql:
image: mysql:5.7
environment:
MYSQL_USER: wp
MYSQL_PASSWORD: wp_pass
MYSQL_DATABASE: wp
MYSQL_ROOT_PASSWORD: root
phpmyadmin:
image: phpmyadmin
ports:
- 8080:80
environment:
PMA_HOST: mysql
$ docker stack deploy --compose-file stack_file_name.yaml stack_name
OR
$ docker stack deploy -c stack_file_name.yaml stack_name
$ docker service ls
OR
$ docker stack services stack_name
$ docker stack rm stack_name
Инструкции по установке Portainer
$ curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml
$ docker stack deploy --compose-file=portainer-agent-stack.yml portainer
Необходимо зайти в Portainer, добавить новый стэк из YML файла.
Содержимое YML файла:
version: "3"
services:
redmine:
image: redmine
ports:
- 3000:3000
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_USERNAME: redmine
REDMINE_DB_PASSWORD: password
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: redmine
MYSQL_USER: redmine
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: root
docker swarm join --token SWMTKN-1-0ccqj23o6lsngvg7c2jkq0hliklxx0rh6daxey9v2or no296ve-0ajjott1nth4p6g5ly8jtwxqr 192.168.0.28:2377