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

Get €20/$20 free credit!

Valid until: 31 December 2026 Valid for: 3 months and only for new customers
Configure now
Want to contribute?

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

Find out more