Информационные технологии (часть 2)

4. Настройка ресурсов контейнеров docker

Введение

Целью данной лабораторной работы является изучение взаимодействия контейнеров docker с операционной системой.

Создание общей папки для контейнера

Скачайте образ docker, содержащий средства разработки под linux:

sudo docker pull gcc

Запустите этот контейнер указав следующие ключи:

-it -v /home/osboxes/server:/home/osboxes

Ключ -v создает общую папку, доступную на виртуальной машине по пути /home/osboxes/server, а в контейнере по пути /home/osboxes.

На физическом компьютере или виртуальной машине создайте файл hello.c со следующим содержимым:

  #include "stdio.h"
  main () {
      #if defined(_WIN32)
          printf("hello, windows\n");
      #elif defined(__linux__)
          printf("hello, linux\n");
      #elif defined(__APPLE__)
          printf("hello, Apple\n");
      #elif defined(BSD)
          printf("hello, BSD\n"); 
      #endif
  }

Скомпилируйте и запустите эту программу на физическом компьютере и в контейнере. Для запуска в контейнере нужно перейти в его терминале в общую папку, запустить компилятор gcc, и запустить результат компиляции командой ./a.out.

Скопируйте любую лабораторную работу из 1-го семестра по программированию в расшаренную папку, скомпилируйте ее в контейнере и запустите.

Проброс портов

Скачайте образ gitbucket (сервер системы контроля версий):

sudo docker pull gitbucket/gitbucket

При запуске контейнера ключ -it указывать не нужно, нужно указать ключи -v и -p.

Создайте на физической машине папку для хранения данных gitbucket и сделайте ее с помощью ключа -v общей с папкой контейнера /gitbucket (через общую папку на виртуальной машине).

Ключ -p нужен для проброса портов. Он имеет формат:

-p 𝘩𝘰𝘴𝘵_𝘱𝘰𝘳𝘵:𝘤𝘰𝘯𝘵𝘢𝘪𝘯𝘦𝘳_𝘱𝘰𝘳𝘵

Сервер в контейнере запускается на порту 8080, этот порт следует указать в 𝘤𝘰𝘯𝘵𝘢𝘪𝘯𝘦𝘳_𝘱𝘰𝘳𝘵. 𝘩𝘰𝘴𝘵_𝘱𝘰𝘳𝘵 – это порт, на котором будет доступен сервер на виртуальной машине (его нужно пробросить на физическую машину).

Дождитесь загрузки сервера (в терминале должен появиться текст Server:main: Started). В браузере компьютера зайдите на сервер gitbucket, аутентифицируйтесь под логином root с паролем root. Создайте репозиторий системы контроля версий с настройками по-умолчанию.

Перегрузите виртуальную машину, перезапустите контейнер и убедитесь, что учетная запись и репозиторий на сервере сохранились.

Взаимодействие контейнеров

По-умолчанию, контейнеры docker подключаются к виртуальной компьютерной сети через которую и осуществляется их взаимодействие. Каждый контейнер в этой сети имеет свой адрес.

В этом пункте мы будем с контейнера со средствами разработки выкладывать результаты на сервер контроля версий. Для этого нужно узнать его адрес (порт сервера уже известен – 8080). Для этого:

  • с помощью команды sudo docker ps определите имя контейнера с сервером.
  • с помощью команды sudo docker network inspect bridge посмотрите конфигурацию виртуальной сети. В этой конфигурации в разделе Containers найдите контейнер с нужным именем. В параметрах этого контейнера будет примерно такая строчка "IPv4Address": "172.17.0.3/16", где 172.17.0.3 – интересующий нас адрес контейнера сервера.

Далее создадим локальную копию репозитория и выложим ее на сервер. В терминале контейнера gcc выполните следующие действия:

  • настройте пользователя системы контроля версий:

    git config --global user.email "𝘺𝘰𝘶@𝘦𝘹𝘢𝘮𝘱𝘭𝘦.𝘤𝘰𝘮"
    git config --global user.name "𝘠𝘰𝘶𝘳 𝘕𝘢𝘮𝘦"
    
  • создайте и перейдите в каталог для локального репозитория:

    mkdir repo
    cd repo
    
  • создайте репозиторий и привяжите его к репозиторию на сервере:

    touch README.md
    git init
    git add README.md
    git commit -m "first commit"
    git remote add origin http://𝘴𝘦𝘳𝘷𝘦𝘳_𝘪𝘱:𝘴𝘦𝘳𝘷𝘦𝘳_𝘱𝘰𝘳𝘵/git/root/𝘳𝘦𝘱𝘰-𝘯𝘢𝘮𝘦.git
    git push -u origin master
    

Вместо 𝘳𝘦𝘱𝘰-𝘯𝘢𝘮𝘦 укажите имя созданного ранее репозитория. Выполнение последней команды потребует ввода имени пользователя и пароля на сервере системы контроля версий. Используйте тот же логин, что и ранее (root:root).

Перейдите в браузере на страницу репозитория и убедитесь, что в нем появился файл README.md.