Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Установка и настройка Docker

profile picture
Author
Hetzner Online
Published
2019-03-08
Time to read
9 minutes reading time

Введение

Это руководство охватывает установку и настройку Docker. В качестве ОС используется CentOS.

При использовании Windows потребуются инструмент командной строки (например, PuTTY) и инструмент передачи файлов (например, WinScp). В Linux необходимые инструменты уже есть.

Шаг 1 — базовая настройка CentOS и установка Docker

После установки CentOS необходимо сначала выполнить обновление:

yum -y update

Затем идет установка Docker

yum -y install docker docker-registry

Для того чтобы Docker запускался автоматически при загрузке системы, необходимо включить службу Docker

systemctl enable docker.service
systemctl start docker.service

Чтобы проверить, работает ли docker, введите:

root@CentOS-73-64-minimal ~]# systemctl status docker.service

Вывод должен содержать: Active: active(running) since...

Шаг 2 — Настройка MariaDB и изучение основных команд Docker

Поскольку мы хотим, чтобы Ghost и ownCloud имели доступ к центральной базе данных, сначала нужно настроить эту базу данных в качестве первого контейнера. В нашем примере будем хранить данные в домашней директории.

Для этого можно создать каталог данных, введя:

mkdir /home/data
mkdir /home/data/MariaDB

В этом руководстве используется следующая конфигурация:

  • Имя: ghost-mysql
  • директория для данных: /home/data/MariaDb/
  • Пароль SQL: XXXXXXX
  • Образ Docker для использования: mariadb

Эта конкретная база данных будет создана с помощью следующей команды:

docker run --name ghost-mysql -v /home/data/MariaDb/:/var/lib/mysql:z -e MYSQL_ROOT_PASSWORD=XXXXXXX -d -p 3306:3306 mariadb

Запустите docker ps, чтобы проверить правильность работы базы данных:

[root@CentOS-73-64-minimal ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS                    NAMES
d952d2b55a4e   mariadb   "docker-entrypoint.sh"   3 weeks ago   Up 3 weeks   0.0.0.0:3306->3306/tcp   ghost-mysql

В каталоге есть соответствующие данные для MariaDB:

alt text

Для удаления работающего контейнера, выполните docker rm. Если контейнер продолжает работать, его можно принудительно удалить с помощью -f:

alt text

Команда docker start позволяет запустить существующий контейнер. Используйте docker restart, чтобы закрыть и перезапустить контейнер. И, естественно, используйте docker stop, чтобы закрыть контейнер.

alt text

Если образ Docker не запускается, увидеть ошибку можно убрав опцию отсоединения -d:

alt text

В этом случае ошибка является ошибкой chown. Опция :z отсутствовала. Правильное монтирование каталога должно выглядеть следующим образом:

alt text

Увидеть список установленных образов (основу для каждого контейнера), введя docker images:

alt text

Используя эту конфигурацию, можно использовать HeidiSQL для доступа к базе данных.

Однако в этом случае (и я бы рекомендовал сделать это только временно) обязательно добавьте одно правило межсетевого экрана в панели Hetzner; правило должно ограничивать доступ только вашим IP-адресом.

alt text

Затем должно быть возможно подключиться к базе данных mySQL/MariaDB:

alt text

Для просмотра журнала контейнера можно использовать команду docker logs ghost-mysql:

alt text

Шаг 3 — Настройка Ghost в качестве сервиса блога

Следующий шаг — установить Ghost.

Должна использоваться следующая конфигурация:

  • Стандартный порт 2368 (не доступен из интернета)
  • Имя: blog
  • Место хранения: /home/data/Ghost
  • база данных mySQL должна быть сопоставлена с ghost-mysql

Запуск Docker должен выглядеть так:

mkdir /home/data/Ghost
docker run --name blog -p 2368:2368 -v /home/data/Ghost/:/var/lib/ghost:z -d --link ghost-mysql:mysql ghost

Полная настройка была бы слишком большой для этого руководства. Поэтому данное руководство концентрируется на минимальных изменениях, позволяющих использовать Ghost с MariaDB вместо внутренней базы данных SQLite. Для этого файл настроек config.js должна быть изменен с помощью WinSCP.

alt text

Здесь необходимо ввести конфигурацию базы данных. Для имени хоста используйте mysql, так это имя определено в Docker. Мы используем blog_user для пользователя и назначили пароль: (ПРЕДУПРЕЖДЕНИЕ: конфигурация должна быть выполнена в development.)

alt text

Теперь нужно создать базу данных в MariaDB и настроить пользователя.

Создать базу данных можно через HeidiSQL:

alt text

А затем введите следующее в этом диалоговом окне:

alt text

Затем авторизуйте пользователя для доступа к базе данных:

alt text

Назначьте пароль и все необходимые разрешения:

alt text

Для применения настроек из config.js необходимо перезапустить blog:

alt text

Если все хорошо, то вы должны иметь доступ к блогу через «http», а в MariaDB должно быть множество таблиц: (используйте F5 для обновления, чтобы все также можно было просмотреть в HeidiSQL!)

alt text

Шаг 4 — Настройка ownCloud и GitLab

Теоретически настройка для этих служб аналогична настройки для Ghost.

Для ownCloud потребуется создать пользователя в MariaDB, а GitLab настроить будет проще.

Создайте базу данных в MariaDB:

alt text

Используйте следующую команду:

docker run --name owncloud -v /home/data/owncloud:/var/www/html:z -p 8082:80 --link ghost-mysql:mysql -d owncloud:8.1

Используйте ту же конфигурацию для ownCloud, что и в MariaDB:

alt text

Соответствующие таблицы появятся в MariaDB:

alt text

Для установки GitLab можно использовать следующую команду:

docker run --detach --name gitlab --hostname git.vr-worlds.de --sysctl net.core.somaxconn=1024 --ulimit sigpending=62793 --ulimit nproc=131072 --ulimit nofile=60000 --ulimit core=0 --publish 8443:443 --publish 8083:80 --publish 8022:22 --publish 8060:8060 --restart always --volume /home/data/gitlab/config:/etc/gitlab:z --volume /home/data/gitlab/logs:/var/log/gitlab:z --volume /home/data/gitlab/data:/var/opt/gitlab:z --volume /etc/localtime:/etc/localtime gitlab/gitlab-ce

Шаг 5 — настройка NGINX

NGINX должен быть настроен таким образом, чтобы запросы к порту 80 перенаправлялись в соответствующий контейнер Docker.

Этого можно добиться при помощи поддоменов:

  • www.vr-worlds.de -> перенаправлено в blog
  • cloud.vr-worlds.de -> перенаправлено в ownCloud
  • git.vr-worlds.de -> перенаправлено в GitLab

Для этого нужно, чтобы все поддомены указывали на один и тот же IP-адрес на сервере:

alt text

Может пройти какое-то время, прежде чем новые адреса будут доступны через DNS. Можете периодически проверять, готовы ли они, используя nslookup с вашего собственного ПК:

alt text

План для NGINX:

  • Порты 80 (HTTP) и 443 (HTTPS) должны быть доступны извне
  • Требуются связи с контейнерами blog, gitlab и owncloud
  • Имя nginxserver
  • Данные из sites-enabled, сертификаты и журналы должны храниться в /home/data/Nginx/

Мы могли бы использовать следующую команду (но мы не будем это делать):

docker run -v /home/data/Nginx/sites-enabled/:/etc/nginx/conf.d/ -v /home/data/Nginx/certs/:/etc/nginx/certs -v /home/data/Nginx/logs/:/var/log/nginx --name nginxserver -p 80:80 -p 443:443 -d --link blog:blog --link gitlab:gitlab --link owncloud:owncloud

Поскольку вам может потребоваться изменять эту конфигурацию, например, при добавлении новых хостов, я рекомендую сохранить конфигурацию настройки Docker контейнеров в файле и использовать docker-compose. (видеть Docker Compose Docs)

Используйте curl для запуска установки:

curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

Docker Compose не имеет разрешений на выполнение; для их добавления необходимо использовать chmod:

alt text

Теперь мы можем видеть, работает ли "docker-compose" правильно:

alt text

Для этого в домашнем каталоге мы создадим новый каталог и в нем создадим файл docker-compose.yml:

alt text

Файл должен выглядеть следующим образом:

version: '2'
services:
   nginxserver:
      container_name: nginxserver
      image: nginx
      network_mode: bridge
      external_links:
         - blog:blog
         - gitlab:gitlab
         - owncloud:owncloud
      ports:
         - 80:80
         - 443:443
      volumes:
         - /home/data/Nginx/sites-enabled/:/etc/nginx/conf.d:z
         - /home/data/Nginx/certs/:/etc/nginx/certs:z
         - /home/data/Nginx/logs/:/var/log/nginx:z

Затем запустим nginx с помощью docker-compose:

alt text

После запуска Nginx нужно будет создать конфигурацию. Для каждого поддомена, нужно указать, какой Docker контейнер будет отвечать на запросы:

alt text

После того, как конфигурация была обновлена, перезапустите nginx:

alt text

Если это не сработает, может быть полезно использовать docker logs для поиска ошибки:

alt text

Шаг 6 — Настройка Shipyard

Последний сервис для добавления — Shipyard. Он позволяет нам управлять Docker контейнерами удаленно.

Установка довольно проста.

Имя в DNS должно быть ship.vr-worlds.de (конфигурация nginx должна быть адаптирована)

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

curl -sSL https://shipyard-project.com/deploy | bash -s

Теперь можно получить доступ к Shipyard через порт 8080 и несколько контейнеров были установлены:

[root@CentOS-73-64-minimal ~]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED       STATUS       PORTS                                            NAMES
48f5cd2ce123        shipyard/shipyard:latest       "/bin/controller --de"   2 weeks ago   Up 2 weeks   0.0.0.0:8080->8080/tcp                           shipyard-controller
ec4955037d0f        swarm:latest                   "/swarm j --addr 176."   2 weeks ago   Up 2 weeks   2375/tcp                                         shipyard-swarm-agent
48487fb7223c        swarm:latest                   "/swarm m --replicati"   2 weeks ago   Up 2 weeks   2375/tcp                                         shipyard-swarm-manager
fee6b7fcc71e        shipyard/docker-proxy:latest   "/usr/local/bin/run"     2 weeks ago   Up 2 weeks   0.0.0.0:2375->2375/tcp                           shipyard-proxy
2058c074314b        alpine                         "sh"                     2 weeks ago   Up 2 weeks                                                    shipyard-certs
d710310dae40        microbox/etcd:latest           "/bin/etcd -addr 176."   2 weeks ago   Up 2 weeks   0.0.0.0:4001->4001/tcp, 0.0.0.0:7001->7001/tcp   shipyard-discovery
0fe8eb95b8fb        rethinkdb                      "rethinkdb --bind all"   2 weeks ago   Up 2 weeks   8080/tcp, 28015/tcp, 29015/tcp                   shipyard-rethinkdb

Теперь Shipyard нужно интегрировать в Nginx и настроить. В конфигурацию nginx необходимо добавить следующее: (/home/data/Nginx/sites_enabled)

alt text

Теперь видно как легко настраивать Nginx через docker-compose:

alt text

Затем можно перестроить контейнер с помощью docker-compose up -d:

alt text

Шаг 6 — централизованное управление конфигурацией через Docker-Compose

Чтобы убедиться, что автоматизация Docker максимально эффективна, мы соберем полную конфигурацию в одном новом файле Docker-Compose.

alt text

Файл должен выглядеть следующим образом:

version: '2.1'
services:
 ghost-mysql:
   container_name: ghost-mysql
   image: mariadb
   network_mode: bridge
   ports:
      - "3306:3306"
   volumes:
      - /home/data/MariaDb/:/var/lib/mysql:z
   environment:
      - MYSQL_ROOT_PASSWORD=rosi2511
 blog:
   container_name: blog
   image: ghost
   network_mode: bridge
   links:
      - ghost-mysql:mysql
   ports:
      - "2368:2368"
   volumes:
      - /home/data/Ghost/:/var/lib/ghost:z
 owncloud:
   container_name: owncloud
   image: owncloud:8.1
   network_mode: bridge
   links:
      - ghost-mysql:mysql
   ports:
      - "8082:80"
   volumes:
      - /home/data/owncloud:/var/www/html:z
 gitlab:
   container_name: gitlab
   image: gitlab/gitlab-ce
   network_mode: bridge
   ports:
      - "8443:443"
      - "8083:80"
      - "8022:22"
      - "8060:8060"
   volumes:
      - /home/data/gitlab/config:/etc/gitlab:z
      - /home/data/gitlab/logs:/var/log/gitlab:z
      - /home/data/gitlab/data:/var/opt/gitlab:z
      - /etc/localtime:/etc/localtime
   sysctls:
      - net.core.somaxconn=1024
   ulimits:
      sigpending: 62793
      nproc: 131072
      nofile: 60000
      core: 0
 nginxserver:
   container_name: nginxserver
   image: nginx
   network_mode: bridge
   links:
      - blog:blog
      - gitlab:gitlab
      - owncloud:owncloud
   ports:
      - "80:80"
      - "443:443"
   volumes:
      - /home/data/Nginx/sites-enabled/:/etc/nginx/conf.d:z
      - /home/data/Nginx/certs/:/etc/nginx/certs:z

Теперь можно удалить все контейнеры и создать новые с помощью docker-compose:

alt text

Шаг 7 — настройка межсетевого экрана в Hetzner

Примерная конфигурация в Hetzner Online может выглядеть так:

alt text

Правило №1 разрешает прохождение ICMP-пакетов, например, это могут быть пинги и запросы, которые позволяют определить пропускную способность сети (размер MTU и т.д.). По этой причине мы рекомендуем оставить здесь "accept".

Правило №2 позволяет подключаться к серверу через SSH. Не обязательно всегда оставлять этот порт открытым. На время, когда не нужно проводить обслуживание сервера можно изменить действие в межсетевом экране не "discard". В этом случае подключение по SSH будет недоступно ни для "putty", ни для "winscp":

alt text

Правило №3 позволяет получить доступ к системе через " http" (порт 80) и "https" (порт 443).

Правило №4 необходимо для прохождения ответов от вашего сервера.

Вывод

В этой статье показаны необходимые шаги для настройки совместной работы прокси-сервера NGINX и нескольких других контейнеров в среде docker.

Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue

Discover our

Dedicated Servers

Configure your dream server. Top performance with an excellent connection at an unbeatable price!

Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more