Перейти к основному контенту

7. Практика контейнеры

Построение стенда

Схема виртуального лабораторного стенда

Рисунок 1. Схема стенда

  1. Создать виртуальные машины для работы
Название виртуальной машиныИсточникТип инстансаСети для внешнего подключения
web-serverОбраз-Ubuntu-server20.04mediumexternal-net

Так же нужно проверить развернутую инфраструктуру на соответствие схеме на рисунке 1.

1. Установка Docker

  1. Обновляем информацию о пакетах в репозиториях и обновляем установленные пакеты:

    sudo apt update
    sudo apt full-upgrade -y
    
  2. Добавляем репозитории официальные репозитории Docker:

    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    
  3. Установим пакеты Docker

    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
    
  4. Проверка работы Docker

    sudo docker run hello-world
    

  5. Добавляем пользователя в группу docker

    sudo groupadd docker
    sudo usermod -aG docker $USER
    newgrp docker
    

    После добавления текущего пользователя в группу Docker проверяем работу docker без использования прав суперпользователя

    docker run hello-world
    

2. Написание Dockerfile

  1. Клонируем исходный проект

    sudo apt install git -y
    git clone https://gitlab.resds.ru/itt/sample-project.git
    cd sample-project
    

    в данном проекте собраны все компоненты из прошлой работы

  2. Пишем Dockerfile для frontend части проекта Для этого создаем в директории notes-app файл Dockerfile

    FROM node:18-slim
    WORKDIR /usr/local/app
    COPY package*.json ./
    RUN npm i && npm cache clean --force
    COPY . .
    RUN npm run build -- --prod
    CMD ["npx","serve","-s","build"]
    
  3. Запускаем сборку контейнера и проверяем его работоспособность

    docker build -t notes-app:latest .
    docker run -p 3000:3000 notes-app:latest
    

    И проверяем работоспособность приложения открыв в браузере страницу

  4. Проделываем аналогичные действия для notes-backend

    FROM node:18-slim
    WORKDIR /usr/local/app
    COPY package*.json ./
    RUN npm i && npm cache clean --force
    COPY . .
    RUN npm run build -- --prod
    CMD ["npx","serve","-s","build"]
    

    Собираем контейнер и проверяем

    docker build -t notes-back:latest .
    docker run -p 5000:5000 notes-back:latest
    

    Для проверки можно использовать запрос к API

    curl --location --request POST 'http://127.0.0.1:5000/api/notes' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "index": "1",
         "note": "test message"
     }'
    

    Как можно заметить, запускаемые приложение доступны снаружи виртуальной машины

  5. Пишем общий Docker-compose файл для старта

    services:
       notes-app:
         build: ./notes-app/
         restart: always
       notes-back:
         build: ./notes-backend/
         restart: always
       nginx:
         image: nginx:1.25.3-alpine-slim
         volumes:
           - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
         ports:
           - "80:80"
         restart: always
         depends_on:
           - notes-app
           - notes-back
    

    Можно заметить, что при таком варианте запуска контейнеров у нас публичным становится только 80 порт