Это будет в основном техническая статья, так как постоянно хожу за этой информацией в поиск, а сейчас решил упростить себе задачу. Я подробно расскажу, как установить систему контейнеризации docker и docker-compose на CentOS 7 и 8. Тема распространенная и популярная, регулярно приходится устанавливать, настраивать и запускать контейнеры.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Введение
Думаю, не нужно каких-то подробных пояснений на тему того, что такое Докер и зачем он нужен. Сейчас этот продукт у всех на слуху. В частности, он используется по дефолту в популярном кластерном продукте по автоматическому развертыванию и управлению контейнерами - Kubernetes. По сути он стал стандартом отрасли, хотя поддерживает работу не только на базе docker, но по факту в основном используют его. Я это все к тому, что docker с нами надолго :)
Пару тройку лет назад считалось, что docker лучше всего разворачивать на Ubuntu. С Centos были некоторые проблемы, но где-то в середине развития 7-й ветки они все были решены. Подробности я уже не помню, но по факту сейчас нет принципиальной разницы. Я запускаю контейнеры как на ubuntu, так и на centos. Обычно разработчики просят убунту, так как она им привычна. Лично я сам предпочитаю Centos. Там еще пока нет рекламы в syslog.
С установкой Docker на Centos 7 нет никаких проблем. С 8-й версией есть нюансы. Расскажу обо всем по порядку. Если у вас еще нет готовой системы, то вот мои статьи по теме - установка и настройка centos.
Установка Docker на Centos 8
Начинаем установку системы управления контейнерами Docker на Centos 8. Первыми делом подключаем официальный репозиторий.
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
Система проинформирует, что репозиторий успешно подключен. Сморим, какие версии докера доступны для установки.
# dnf list docker-ce
Устанавливаем Docker на Centos 8.
# dnf install docker-ce
Я хотел рассказать о некоторых нюансах установки на Centos 8, а по факту оказалось, что их больше нет. Еще недавно не получалось просто взять и установить пакет с докером. Была проблема с зависимостями, связанная с тем, что 8-я версия системы не поддерживала необходимую версию container.id. Но сейчас этой проблемы нет, так что можно про нее забыть.
Проверим, что Docker нормально запустился. И сразу добавим его в автозагрузку.
# systemctl enable --now docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service. # systemctl status docker
Все нормально, Docker успешно стартовал. Проверим его работу, запустив какой-нибудь контейнер. Например, официальный образ nginx. Сначала загрузим его.
# docker pull nginx
Проверяем список образов.
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 7e4d58f0e5f3 3 weeks ago 133MB
Теперь запускаем контейнер на основе этого образа и сразу включаем ему автозапуск после старта системы. Частенько разработчики забывают это делать и потом, после ребута сервера, контейнеры не стартуют.
# docker run -d -p 80:80 --restart=always --name nginx-proxy nginx
Смотрим список запущенных контейнеров.
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1d6555ea4726 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp nginx-proxy
Все в порядке, контейнер слушает 80-й порт. Посмотрим список открытых портов в системе.
# netstat -tulnp
Несмотря на то, что указан ipv6 адрес, контейнер nginx запущен в том числе и на ipv4. Можете зайти браузером на страницу с ip адресом сервера и увидите там стартовую страницу nginx. Причем, даже если у вас запущен firewalld, docker автоматически добавит разрешающее правило для 80-го порта.
На этом по установке Docker на Centos 8 все. Мы настроили и проверили работу. Собственно, даже на таком простом примере наглядно видно, в чем удобство докера, хотя тут он сработал аналогично пакетному менеджеру. Но если у вас что-то посложнее с кучей зависимостей, поставится оно так же быстро и легко.
Установка Docker в Centos 7
В Centos 7 Docker устанавливается так же штатно, через официальный репозиторий. Прежде чем его подключить, убедитесь, что у вас установлен пакет yum-utils.
# yum install yum-utils
После этого подключаем репозиторий докера.
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo Loaded plugins: fastestmirror adding repo from: https://download.docker.com/linux/centos/docker-ce.repo grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo
Теперь можно приступить к установке Docker на Centos 7.
# yum install docker-ce docker-ce-cli containerd.io
Запускаем докер и добавляем в автозагрузку.
# systemctl enable --now docker
Проверяем работу:
# systemctl status docker
Запускаем контейнер c nginx для теста.
# docker run -d -p 80:80 --restart=always --name nginx-proxy nginx
Убеждаемся, что все запущено и корректно работает.
# docker ps # ss -tulnp
На этом установка Docker на Centos 7 закончена. Для верности можете в браузере проверить, что nginx запущен и работает.
Установка docker-compose на Centos
Зачастую для работы с докером требуется также docker-compose. Он позволяет быстро запускать проекты, состоящие из нескольких контейнеров. По своей сути docker-compose просто скрипт на python. Так что для его работы нужен собственно сам скрипт и некоторые компоненты python. Последнюю версию скрипта можно посмотреть в репозитории на github - https://github.com/docker/compose/releases/. В моем случае это 1.27.4.
Устанавливаем docker-compose на Centos.
# curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
Делаем файл исполняемым и на всякий случай добавляем символьную ссылку еще и в /usr/bin.
# chmod +x /usr/local/bin/docker-compose # ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Смотрим, все ли корректно установилось.
# docker-compose -v docker-compose version 1.27.4, build 40524192
Для теста можете запустить что-то с помощью docker-compose. Например, установить WordPress. Для этого создаем файл docker-compose.yaml следующего содержания.
version: '3' services: mysql: image: mysql:8 command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress volumes: - "./db:/var/lib/mysql" wordpress: image: wordpress:php7.4-apache ports: - "80:80" environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: root WORDPRESS_DB_NAME: wordpress volumes: - "./wp:/var/www/html/"
После этого запускаем проект.
# docker-compose up
Поднимутся два контейнера - один с mysql, другой с web сервером и исходниками wordpress. Если получите ошибку соединения с базой данных:
MySQL Connection Error: (2002) No route to host
Значит у вас запущен firewalld. Он не дает нормально работать dns в докере. Вам необходимо отключить firewalld и перезапустить докер.
# systemctl stop firewalld # systemctl restart docker
После этого запускайте docker-compose еще раз и проверяйте работу. Должно получиться примерно так.
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f4edc21405e4 wordpress:php7.4-apache "docker-entrypoint.s…" 31 minutes ago Up 52 seconds 0.0.0.0:80->80/tcp root_wordpress_1 2c80b7811bb5 mysql:8 "docker-entrypoint.s…" 31 minutes ago Up 52 seconds 3306/tcp, 33060/tcp root_mysql_1
Docker-compose успешно установлен и проверен на Centos. Можно использовать по назначению.
Заключение
На этом по установке Docker и docker-compose на centos у меня все. Ссылка на официальную документацию - https://docs.docker.com.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
ERROR: Get https://registry-1.docker.io/v2/: x509: certificate signed by unknown authority
привет, а где настройки апача в этом случае можно настроить? чтобы домен прописать?
Можно просто зайти в контейнер и прямо в нем прописать. Но это если разово надо настроить. Обычно выносят конфиг в отдельный файл и мапят его внутрь контейнера при запуске: https://stackoverflow.com/questions/31480556/edit-apache-configuration-in-docker
На версии CentOS 8+ (столкнулся на 8.3) с высокой вероятностью после после добавления репозитория docker-ce.repo вы не сможете штатно установить docker-ce, а зачастую даже выполнение команды dnf update приведёт к ошибке (конфликту) предустановленных компонентов Podman и Buildah.
В случае если эти компоненты не используются вами, рекомендуется выполнить yum erase podman buildah и продолжать спокойную жизнь :)
Подобная ошибка была в 8.0 из-за проблем с зависимостями, потом в какой-то момент пропала. Странно, что опять появилась.
на самой свежей centOS 8.4, получил ту же самую ошибку *Buildah
решение именно такое:: yum erase podman buildah
Теперь в Kubernetes не будет Docker'а - для создания контейнеров будет использоваться containerd или CRI-O:
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation
https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/
В контексте данной статьи это не так важно. Кубер все равно автоматически раскатывают. Никто руками докеры не ставит на ноды.
Да, но желательно знать что под капотом.
За статью спасибо, проверил, работает.
Я бы не сказал, что нет проблем с установкой на Centos 8 докера. Проблема с зависимостями есть и никуда не делись. Вот сейчас ставлю, то podman не тот, то buildah не такой.
На днях ставил по статье, с проблемами не столкнулся.
yum erase podman buildah
Спасибо большое за полезную информацию
А у меня для этого есть вот такая вот последовательность
curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh #ставим Docker на голую ОС
systemctl restart docker.service
systemctl enable docker.service
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose #Ставим docker-compose на любую ОСь из поддерживаемых
chmod +x /usr/bin/docker-compose #Делаем исполняемым
# Проверяем версии
docker --version
docker-compose --version
благодарность за пример как раз с вордпрессом в докере. надо будет попробовать
Спасибо за пост
Зачем поднимать docker на CentOS 8? Если для задач с контейнеризацией у RHEL есть отличный продукт - podman. Который поддерживает systemd для контейнеров и работает без демона.
Да много зачем нужно. Если развивать тему, то можно сказать, зачем поднимать контейнеры вручную, если можно управлять ими централизованно и т.д. Начать можно с того, что podman в списке доступных дистрибутивов для использования отсутствует у большинства хостеров.
Спасибо большое за статью!