Docker заблокировал доступ из-за санкций

Docker заблокировал доступ Кубе, Ирану, Северной Корее, Республике Крым, Судану и Сирии. Это произошло из-за санкций и затронуло всех пользователей без исключения. Соединиться с Docker теперь можно разве что по VPN.

Напомню, что Docker Hub — это облачный сервис для хранения контейнеров, который позволяет разработчикам загружать, находить и запускать приложения в контейнерах Docker.

При попытке сделать docker pull будет выводиться сообщение:

Since Docker is a US company, we must comply with US export control regulations. In an effort to comply with these, we now block all IP addresses that are located in Cuba, Iran, North Korea, Republic of Crimea, Sudan, and Syria. If you are not in one of these cities, countries, or regions and are blocked, please reach out to https://hub.docker.com/support/contact/

Как удалить старые пакеты Docker в CentOS

Команда «for pkg in docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine; do sudo yum remove $pkg -y; done» используется для удаления нескольких пакетов Docker с помощью менеджера пакетов YUM в операционной системе Linux.

Эта команда выполняет следующие действия:

1. Устанавливает список пакетов, которые нужно удалить.

2. Затем она проходит через каждый пакет в этом списке, используя цикл «for».

3. Для каждого пакета в списке выполняется команда «sudo yum remove $pkg -y». Здесь «sudo» используется для получения привилегий суперпользователя (root), «yum» — это команда для управления пакетами в YUM, «remove» указывает на то, что пакеты должны быть удалены, "-y" говорит о том, что команда должна быть выполнена без запроса подтверждения.

Обратите внимание, что перед выполнением этой команды вам может потребоваться обновить кэш пакетов с помощью команды «sudo yum makecache fast». Это особенно важно, если вы недавно установили новую версию операционной системы или долго не обновляли систему.

MySQL в контейнере Docker - часть II

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

1. Складываем все вместе

Не хотите следовать всем пошаговым инструкциям, чтобы получить ваши файлы правильно? Вот готовый продукт (плюс некоторые вспомогательные сценарии для сборки, запуска сервера и подключения к клиенту cli.)Также эти файлы можно найти на гитхабе.
Dockerfile
FROM ubuntu
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install mysql-client mysql-server
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
ADD ./startup.sh /opt/startup.sh
EXPOSE 3306
CMD ["/bin/bash", "/opt/startup.sh"]
<h5>startup.sh</h5>
#!/bin/bash
if [ ! -f /var/lib/mysql/ibdata1 ]; then
mysql_install_db
/usr/bin/mysqld_safe &
sleep 10s
echo "GRANT ALL ON *.* TO admin@'%' IDENTIFIED BY 'changeme' WITH GRANT OPTION; FLUSH PRIVILEGES" | mysql
killall mysqld
sleep 10s
fi
/usr/bin/mysqld_safe

2. Вспомогательные скрипты

build.sh
#!/bin/sh
docker build -t mysql .
run-server.sh
#!/bin/sh
docker run -d -p 3306:3306 -v /data/mysql:/var/lib/mysql mysql
run-client.sh
#!/bin/sh
TAG="mysql"
CONTAINER_ID=$(docker ps | grep $TAG | awk '{print $1}')
IP=$(docker inspect $CONTAINER_ID | python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]')
mysql -u admin -p -h $IP

MySQL в контейнере Docker - часть I

Тема MySQL казалось бы, уже сто раз обсосана, но все-таки она является одной из важных, поскольку MySQL хранит все наши данные уже не один десяток лет, она одна
из ведущих систем управления базами данных, и я думаю что вам понравится тема, которую я хочу предложить.

На первый взгляд, создание контейнера MySQL для Docker довольно легко, но если вы хотите подключиться (не уверены, что сервер mysql, который не позволил бы этого, был бы хорош) и отделить ваши базы данных от вашего контейнера (я предполагаю, что Вы не хотите, чтобы они уходили с вашим контейнером), тогда есть несколько проблем.

Я начинаю эту статью с упрощенного примера (с эфемерным хранилищем базы данных и без возможности подключения). Вы можете перейти на gist (в котором есть файлы для сборки контейнера, а также некоторые скрипты для его сборки и запуска), если все станет слишком скучным или запутанным.

1. Делаем основу

Сейчас мы наметим Dockerfile на основе Ubuntu.
FROM ubuntu
RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install mysql-server
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"]
затем создадим и пометим его:
docker build -t mysql-ubu .
Теперь у нас есть полностью функционирующий контейнер, который мы можем запустить так:
docker run -d -p 3306:3306 mysql-ubu
Он будет работать, но такой подход не полезен, потому что:

mysql слушает на адресе 127.0.0.1, таким образом, мы можем только соединиться изнутри контейнера;
у нас есть только пользователь root, и ему разрешено входить только из контейнера;
поскольку наши данные записываются внутри контейнера, если мы теряем контейнер или нам нужно что-то изменить (например, применить Обновление безопасности), мы теряем наши данные.

2. Обновим адресную привязку

Первый шаг должен заставить наш сервер mysql слушать больше, чем localhost так, чтобы мы могли соединиться извне с нашим контейнером.

Для этого нам нужно обновить bind-адрес в /etc/mysql/my.cnf от 127.0.0.1 до 0.0.0.0 (то есть сделаем привязку mysqld к каждой доступной сети вместо просто localhost.)

Мы могли бы просто добавить поддержку файлика /etc/mysql/my.cnf и добавить его в наш контейнер. а именно в Dockerfile:
ADD ./my.cnf /etc/mysql/my.cnf
Или мы можем обновить это свойство. Я предпочитаю этот способ, потому что я получаю самую последнюю конфигурацию из своей установки и просто обновляю то, что мне нужно. Мы можем добавить соответствующую команду sed в наш Dockerfile после установки mysql-server.
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
Даже при том, что mysqld сейчас слушает все, мы все еще не можем войти, потому что пользователь root только имеет доступ от localhost.

Виновник торжества — тот самый дельфин :)
Нам нужно добавить учетную запись администратора для администрирования баз из-за пределов контейнера. Для того, чтобы добавить учетную запись, нам нужно, чтобы сервер mysql работал. Так как отдельные строки в Dockerfile создают различные коммиты, и коммиты сохраняют только состояние файловой системы (не состояние памяти), нам нужно втиснуть обе команды в один коммит:
RUN /usr/sbin/mysqld & \
sleep 10s &&\
echo "GRANT ALL ON *.* TO admin@'%' IDENTIFIED BY 'changeme' WITH GRANT OPTION; FLUSH PRIVILEGES" | mysql
EXPOSE 3306
CMD ["/usr/bin/mysqld_safe"]
А теперь давайте все соберем и запустим.
docker build -t mysql-ubu .
docker run -d -p 3306:3306 mysql-ubu
Теперь попробуем подключиться. Для того, чтобы сделать это, нам нужно выяснить ip контейнера, и чтобы найти это, нам нужен идентификатор нашего контейнера. Это достаточно легко сделать вручную с помощью docker ps и docker inspect, но вы также можете написать сценарий:
CONTAINER_ID=$(docker ps | grep mysql | awk '{print $1}')
IP=$(docker inspect $CONTAINER_ID | python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]')
mysql -u admin -p -h $IP
Теперь у нас есть полнофункциональный контейнер mysql! Это здорово, но мы вкладываем много доверия в этот контейнер, полагаясь на него, чтобы отслеживать наши базы данных, не говоря уже о том, что мы бы облажались, если мы когда-нибудь захотели обновить что-нибудь. Почему? Да потому, что данные непостоянны. Как их сделать постоянными — читайте далее.

3. Делаем данные постоянными

Нам нужно удалить нашу зависимость от этого конкретного контейнера, и для этого нам нужно экстернализировать (попросту говоря, сделать внешним) наш каталог данных. Это легко, но вызывает проблемы. При запуске нашего контейнера мы просто посылаем в контейнер команду -v /host/path:/container/path, и поставляемый каталог на вашем хост-компьютере используется в контейнере везде, где мы указываем.

Таким образом, чтобы сохранить базы данных из нашего контейнера в /data/mysql на вашем хост-компьютере, мы обновляем нашу команду run:
docker run -d -p 3306:3306 -v /data/mysql:/var/lib/mysql mysql-ubu
Проблема в том, что мы просто уничтожим наши системные таблицы, когда мы заменим /var/lib/mysql нашим пустым каталогом. Это также означает, что мы потеряли нашего администратора. Это сложно объяснить, потому что мы не можем инициализировать каталог (или добавить нашего администратора), пока каталог данных не будет виден контейнеру (во время выполнения), но мы не хотим инициализировать каталог каждый раз, когда мы запускаем либо. Весь смысл экстернализации каталога данных заключается в том, чтобы контейнер мог «приходить» и «уходить» без потери данных.

Чтобы решить эту проблему, давайте создадим скрипт, который для замены просто вызывает /usr/bin/mysqld_safe.

Во-первых, давайте напишем наш сценарий ( startup.sh) для инициализации только в том случае, если каталог данных еще не заполнен.
#!/bin/bash
if [ ! -f /var/lib/mysql/ibdata1 ]; then
mysql_install_db
fi
/usr/bin/mysqld_safe
Это будет искать файл «ibdata1» в наших данных как способ определить, нужно ли нам инициализировать каталог или нет. После того, как каталог данных был инициализирован (или определен уже инициализирован), мы можем продолжить запуск сервера.

И теперь мы обновим Dockerfile, чтобы добавить startup.sh к контейнеру и вызвать его вместо mysqld_safe:
ADD ./startup.sh /opt/startup.sh
CMD ["/bin/bash", "/opt/startup.sh"]
Мы также можем добавить в нашего admin пользователя со скриптом следующее:
#!/bin/bash
if [ ! -f /var/lib/mysql/ibdata1 ]; then
mysql_install_db
/usr/bin/mysqld_safe &
sleep 10s
echo "GRANT ALL ON *.* TO admin@'%' IDENTIFIED BY 'changeme' WITH GRANT OPTION; FLUSH PRIVILEGES" | mysql
killall mysqld
sleep 10s
fi
/usr/bin/mysqld_safe
И, конечно, мы должны также удалить строку запуска из Dockerfile, который делал то же самое, но получал отмену как только мы расширили каталог данных.

Облегчаем себе работу при помощи Docker и Plesk Panel

Docker — это способ доставить приложения именно в виде контейнеров. Сам по себе Docker несложен в управлении. Вся информация хранится на жестком диске сервера с помощью хранилищ — папок с содержанием контейнера Docker. Давайте рассмотрим пример развертывания на Docker определенного приложения, в данном случае это будет phpBB. Весь процесс показан на реальном экземпляре Plesk Panel 12.
1. Прежде всего, нам надо зайти на главную страницу Docker в Plesk. Особенность состоит в том, что обычному пользователю надо просить администратора добыть какой-то контейнер, в этом Plesk пока что малость недоработана.

Далее нам надо написать в строке поиска название интересующего нас приложения и нажать Enter.

Выбираем официальный контейнер, там где написано phpBB Dockerfile, и нажимаем «Запустить».

Будет показан процесс.
Как только контейнер скачается, можно приступать непосредственно к развертыванию.
Проверяем параметры…

Если не знаете что надо выставить — оставляем как есть.
Дальше нажимаем ОК внизу.

Контейнер развернется. Теперь можно приступать к следующему этапу.

2. Включение проксирования Docker
Идем в свою подписку, выбираем свой домен. Там есть пункт «Правила проксификации Docker». Его не будет только в одном случае, если не стоит в связке Nginx и Docker.

Нажимаем пункт. Будет выведен список правил. Здесь ничего нет, поэтому будет пусто. Нажимаем «Добавить».

Если Вы вручную не укажете порт, то не сможете добавить правило. Это особенность панели.

Должно вывестись сообщение об успешном добавлении правила.

Результатом успешного подключения также будет включение подобного сообщения.

Вот и все.
Docker — универсальное средство. Он может помочь с развертыванием любого приложения, даже операционных систем с SSH. Поэтому вы получите как бы мини-VPS. Отличная замена для стандартного сервера, не правда ли?