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

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

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

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

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

  1. Создать виртуальные машины для работы
Название виртуальной машины Источник Тип инстанса Сети для внешнего подключения
web-server Образ-Ubuntu-server20.04 medium external-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
    

    После дтобго кавленияк текущегоий пользователяь был добавлен в группу DockerDocker, мы можем проверяемить рфункционабльностуь dockerDocker без необходимости использования праивилегий суперпользователя.

    docker run hello-world
    

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

  1. Клонируем исходный проект с использованием системы контроля версий Git.

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

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

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

    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 файл 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 становится общедостолько 80 упортным.