Утилита Docker
Все действия с контейнерами выполняются утилитой docker. Ее можно запускать от имени вашего пользователя после того, как он был добавлен в группу программы. Синтаксис утилиты очень прост:
$ docker опции команда опции_команды аргументы
Давайте сначала рассмотрим основные опции утилиты их всего несколько:
- -D — включить режим отладки;
- -H — подключиться к серверу, запущенному на другом компьютере;
- -l — изменить уровень ведения логов, доступно: debug,info,warn,error,fatal;
- -v — показать версию;
- —help вывести справку по команде или утилите в целом;
Команд намного больше, ниже приведены все команды, которые вы можете использовать в своих программах:
- attach — подключиться к запущенному контейнеру;
- build — собрать образ из инструкций dockerfile;
- commit — создать новый образ из изменений контейнера;
- cp — копировать файлы между контейнером и файловой системой;
- create — создать новый контейнер;
- diff — проверить файловую систему контейнера;
- events — посмотреть события от контейнера;
- exec — выполнить команду в контейнере;
- export — извлечь содержимое контейнера в архив;
- history — посмотреть историю изменений образа;
- images — список установленных образов;
- import — создать контейнер из архива tar;
- info — посмотреть информацию о системе;
- inspect — посмотреть информацию о контейнере;
- kill — остановить запущенный контейнер;
- load — загрузить образ из архива;
- login — авторизация в официальном репозитории Docker;
- logout — выйти из репозитория Docker;
- logs — посмотреть логи контейнера;
- pause — приостановить все процессы контейнера;
- port — подброс портов для контейнера;
- ps — список запущенных контейнеров;
- pull — скачать образ контейнера из репозитория;
- push — отправить образ в репозиторий;
- restart — перезапустить контейнер;
- rm — удалить контейнер;
- run — выполнить команду в контейнере;
- save — сохранить образ в архив tar;
- search — поиск образов в репозитории по заданному шаблону;
- start — запустить контейнер;
- stats — статистика использования ресурсов контейнером;
- stop — остановить контейнер;
- top — посмотреть запущенные процессы в контейнере;
- unpause — проложить выполнение процессов в контейнере.
В этой статье мы будем часто использовать команду run, рассмотрим ее опции:
- -e — переменные окружения для команды;
- -h — имя хоста контейнера;
- -i — интерактивный режим, связывающий stdin терминала с командой;
- -m — ограничение памяти для команды;
- -u — пользователь, от имени которого будет выполнена команда;
- -t — связать tty с контейнером для работы ввода и вывода;
- -v — примонтировать директорию основной системы в контейнер.
Теперь, когда мы рассмотрели все основы, приведем несколько примеров работы с контейнерами. Это очень просто.
Перенести снаряд в контейнер
Чтобы увидеть, как работает команда и как ее можно использовать для входа в оболочку контейнера, сначала запустите новый контейнер. Мы будем использовать официальный образ MySQL:
Это создаст контейнер с именем «my_mysql».
Чтобы выполнить команду внутри контейнера, выполните следующую команду:
Параметр означает «интерактивный», а указывает Docker выделить устройство псевдо-телетайпа. Команда выведет список всех файлов и каталогов внутри каталога контейнера:
Чтобы получить оболочку в контейнере, то есть войти внутрь контейнера, запустите новый сеанс оболочки, выполнив двоичный файл оболочки. Вы можете использовать , или любую другую оболочку, включенную в образ.
Приведенная ниже команда создаст новый сеанс Bash внутри контейнера:
Ваша командная строка изменится, показывая, что теперь вы работаете с оболочкой контейнера.
Отсюда вы можете запускать команды так же, как и на любом другом сервере Linux. Например, чтобы получить список текущих переменных среды, введите :
Результат будет выглядеть примерно так:
Сборка нового образа
Сборка начинается с создания файла Dockerfile — он содержит инструкции того, что должно быть в контейнере. В качестве примера, соберем свой веб-сервер nginx.
И так, чтобы создать свой образ с нуля, создаем каталог для размещения Dockerfile:
mkdir -p /opt/docker/mynginx
* где /opt/docker/mynginx — полный путь до каталога, где будем создавать образ.
… переходим в данный каталог:
cd /opt/docker/mynginx
… и создаем Dockerfile:
vi Dockerfile
FROM centos:7
MAINTAINER Dmitriy Mosk <master@dmosk.ru>
ENV TZ=Europe/Moscow
RUN yum install -y epel-release && yum install -y nginx
RUN yum clean all
RUN echo «daemon off;» >> /etc/nginx/nginx.conf
RUN sed -i «0,/nginx/s/nginx/docker-nginx/i» /usr/share/nginx/html/index.html
CMD
* в данном файле мы:
- используем базовый образ centos 7;
- в качестве автора образа указываем Dmitriy Mosk;
- задаем временную зону внутри контейнера Europe/Moscow.
- устанавливаем epel-release и nginx;
- чистим систему от метаданных и кэша пакетов после установки;
- указываем nginx запускаться на переднем плане (daemon off);
- в индексном файле меняем первое вхождение nginx на docker-nginx;
- запускаем nginx.
* подробное описание инструкций Dockerfile смотрите .
Запускаем сборку:
docker build -t dmosk/nginx:v1 .
* где dmosk — имя автора; nginx — название для сборки; v1 — тег с указанием версии. Точка на конце указывает, что поиск Dockerfile выполняем в текущей директории.
… начнется процесс сборки образа — после его завершения мы должны увидеть что-то на подобие:
Successfully built eae801eaeff2
Successfully tagged dmosk/nginx:v1
Посмотреть список образов можно командой:
docker images
Создаем и запускаем контейнер из образа:
docker run -d -p 8080:80 dmosk/nginx:v1
* в данном примере мы запустим контейнер из образа dmosk/nginx:v1 и укажем, что необходимо опубликовать внешний порт 8080, который будет перенаправлять трафик на порт 80 внутри контейнера.
Открываем браузер и переходим по адресу http://<IP-адрес нашего докера>:8080 — мы должны увидеть страницу приветствия с нашим docker-nginx:
Посмотреть созданные контейнеры можно командой:
docker ps -a
Запустить или остановить контейнеры можно командами:
docker stop 5fe78aca2e1d
docker start 5fe78aca2e1d
* где 5fe78aca2e1d — идентификатор контейнера.
Как работать с образами Docker
Запуск контейнеров выполняется из образов. Изначально Docker берет образы в хабах Docker Hub (реестр образов, поддерживаемый разработчиком). Любой имеет возможность создавать и загружать собственные образы. Так что для большей части дистрибутивов и программ уже имеются необходимые образы в Docker Hub.
Приведенная ниже команда позволяет проверить, есть ли возможность получить доступ и скачивать образы в Docker Hub (на примере образа hello-world):
docker run hello-world
Этот вывод данных указывает, что Docker работает правильно:
Сначала сервис не мог найти образ hello-world на локальной машине, из-за чего ему приходилось загрузить образ в хабе (репозитории по умолчанию). После его скачивания Docker создал отдельный контейнер из образа и уже затем запускал в нем программу контейнере.
Представленные в хабе образы можно найти при помощи команд docker и search. К примеру, найти образ Ubuntu можно следующим образом:
docker search ubuntu
Далее скрипт просмотрит содержимое хаба и покажет все образы, соответствующие заданным критериям. В предложенном примере результат будет примерно таков:
Строчка OK в столбце OFFICIAL говорит о том, что образ создан и его поддержка осуществляется компанией, ответственной за этот проект. Выбрав требуемый образ, его можно скачать на компьютер, используя подкоманду pull.
Загрузка официального образа Ubuntu на компьютер выполняется такой командой:
docker pull ubuntu
По завершении операции отобразится такой результат:
Когда образ будет скачан, станет возможным выполнить запуск контейнера из образа при помощи команды run. На примере hello-world видно, что если после ввода run образ не был скачан, сначала клиент загрузит его и уже запустит контейнер с образом.
Чтобы посмотреть, какие образы были загружены на компьютер, используется команда:
docker images
Результат будет похожим на следующий:
Ниже можно увидеть, что образы для запуска контейнеров можно менять и использовать при создании других образов. Причем последние можно загрузить в Docker Hub или другие репозитории. Далее будет рассмотрено более подробно, как работать с контейнерами.
4 ответа
Лучший ответ
У меня была такая же проблема, и я нашел способ установить переменную среды как результат функции с помощью команды RUN в файле dockerfile.
Например, мне нужно установить SECRET_KEY_BASE для приложения Rails только один раз, не меняя, как при запуске:
Вместо этого я пишу в строку Dockerfile, например:
И моя переменная env доступна из root, даже после входа в систему bash. или, может быть
Тогда это переменная, доступная в командах CMD и ENTRYPOINT
Docker кеширует его как слой и изменяет только если вы измените некоторые строки перед ним.
Вы также можете попробовать различные способы установки переменной среды.
3
Community
13 Апр 2017 в 12:36
Частично связано с вопросом. Если кто-то хочет позже использовать результат какой-либо команды, это можно сделать в одном операторе следующим образом:
-1
hurin
5 Июн 2018 в 08:03
Я хотел установить переменную или из вычисления в Dockerfile, например чтобы сделать некоторые вычисленные параметры установки видимыми в .
Похоже, что нет никакого способа сделать это и эта проблема предполагает, что это вариант защиты.
Dockerfile может установить для переменной значение , или , где этот должен быть другим или {{X6} } переменная.
Одна команда может устанавливать и использовать переменные оболочки, но она исчезает в конце команды , когда этот контейнерный уровень завершает работу.
Команда может записывать вычисленные данные в файлы, но Dockerfile по-прежнему не может получить эти данные в или , даже если это файл . (Содержимое файла, конечно, может использоваться кодом, работающим в контейнере.)
Сборка может как минимум записывать варианты выбора в журнал сборки — если только этот шаг не поступает из кеша сборки, и в этом случае шаг не выполняется.
Поправьте меня, если есть выход.
1
Jerry101
18 Июл 2020 в 05:16
Но для это может быть не так точно, как вы хотите.
Вы можете использовать инструкции ENV в Dockerfile для определения значений переменных. Эти значения сохраняются в построенном изображении. Тем не менее, часто настойчивость не то, что вы хотите. Пользователи хотят указывать переменные по-разному в зависимости от того, на каком хосте они создают образ.
Если вы хотите использовать последнюю версию этого изображения, все, что вам нужно сделать, это использовать тег » с :
Если вы действительно хотите использовать параметр curl | parse, используйте его для создания файла Docker с правильным значением (как в шаблоне, обработанном для создания нужного файла). Не пытайтесь использовать его прямо в Dockerfile.
3
VonC
18 Окт 2015 в 19:16
Обмен данными (Монтирование томов)
Когда контейнер останавливается, все данные, генерируемые контейнером, удаляются. Docker Volume — это предпочтительный способ сохранения данных и обмена ими между несколькими контейнерами.
Для создания томов и управления ими используйте опции следующим образом:
- может быть абсолютным путем к файлу или директории на хосте или названном томе.
- — это абсолютный путь к файлу или директории на контейнере.
- Опции могут быть (чтение-запись) и (только чтение). Если опция не указана, по умолчанию используется .
Чтобы объяснить, как это работает, давайте создадим каталог на хосте и поместим в него файл :
Далее смонтируем каталог в каталог в контейнере:
Вместо указания абсолютного пути к директории , мы используем команду , которая распечатывает текущий рабочий каталог.
Теперь, если вы введете http://localhost:8080 в браузере, вы должны увидеть содержимое файла index.html. Вы также можете использовать :
Шаг 1: Установка Docker
Сначала нужно удалить все пакеты Docker, которые, возможно, были установлены ранее:
$ sudo apt-get remove docker docker-engine docker.io
А затем уже перейти к установке самого Docker:
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo apt-key fingerprint 0EBFCD88 $ sudo add-apt-repository "deb https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" $ sudo apt-get update $ sudo apt-get install -y docker-ce
После этого убедитесь в том, что установка прошла успешно, следующей командой:
$ docker info
Она показывает информацию о Docker Engine, развернутом в окружении. Для того чтобы посмотреть версию Docker Engine и Tools, введите:
$ docker version
Вопросы
Я знаю, что Hyper-V на Windows не уживается со всеми остальными гипервизорами, типа VirtualBox. А как проявляет себя WSL2?
Действительно, Hyper-V и VirtualBox между собой конфликтуют. У Docker в Windows есть поддержка экспериментальных функций, которая позволяет не создавать виртуальную машину в гипервизоре, а использовать линуксовый движок ядра. Но как это работает, я сказать точно сказать не могу, потому что я очень редко использую Docker на Windows – он не работает на нем стабильно. Можно использовать Docker на Windows для тестов, можно поиграться, а на продуктив ставить пока что, к сожалению, не стоит.
UPD: Недавно узнал, что на последних версиях wsl2 уже не конфликтует с другими гипервизорами. Но не проверял.
Эталонная база очень большая – 250 Гб. Если я эту базу упакую в Docker, где будет сидеть еще и 1С и все остальное окружение, как такого монстра разворачивать?
База – это все-таки данные. Я знаю примеры, когда люди упаковывают базу именно в Docker и потом его поднимают. Но я не пробовал упаковывать такие огромные базы в сам контейнер. Мне кажется, лучше сделать так – данные базы будут храниться в каком-то именованном volume, а в контейнере понимается сервис – тот же postgres. И он подцепляет в качестве источника данных этот именованный volume вовнутрь. Таким вариантом можно сделать, но тут другой вопрос – Docker подразумевает, что нужно быстро создать новое окружение и что-то на нем потестить, а как быстро создать новую копию базы на 250 Гб я пока не знаю.
*************
Данная статья написана по итогам доклада (видео), прочитанного на онлайн-митапе «DevOps в 1С: Тестирование и контроль качества решений на 1С». Больше статей можно прочитать здесь.
Шаг 6 — Управление контейнерами Docker
После использования Docker в течение определенного времени, у вас будет много активных (запущенных) и неактивных контейнеров на компьютере. Чтобы просмотреть активные, используйте следующую команду:
Вывод будет выглядеть примерно следующим образом:
В этом обучающем руководстве вы запустили два контейнера: один из образа и другой из образа . Оба контейнера больше не запущены, но все еще существуют в вашей системе.
Чтобы просмотреть все контейнеры — активные и неактивные, воспользуйтесь командой с переключателем :
Вывод будет выглядеть следующим образом:
Чтобы просмотреть последний созданный вами контейнер, передайте переключатель :
Чтобы запустить остановленный контейнер, воспользуйтесь с идентификатором контейнера или именем контейнера. Давайте запустим контейнер на базе Ubuntu с идентификатором :
Контейнер будет запущен, а вы сможете использовать , чтобы просматривать его статус:
Чтобы остановить запущенный контейнер, используйте с идентификатором или именем контейнера. На этот раз мы будем использовать имя, которое Docker присвоил контейнеру, т.е. :
После того как вы решили, что вам больше не потребуется контейнер, удалите его с помощью команды , снова добавив идентификатор контейнера или его имя. Используйте команду , чтобы найти идентификатор или имя контейнера, связанного с образом , и удалить его.
Вы можете запустить новый контейнер и присвоить ему имя с помощью переключателя . Вы также можете использовать переключатель , чтобы создать контейнер, который удаляется после остановки. Изучите команду , чтобы получить больше информации об этих и прочих опциях.
Контейнеры можно превратить в образы, которые вы можете использовать для создания новых контейнеров. Давайте посмотрим, как это работает.
Копирование числовых ячеек из 1С в Excel Промо
Решение проблемы, когда значения скопированных ячеек из табличных документов 1С в Excel воспринимаются последним как текст, т.е. без дополнительного форматирования значений невозможно применить арифметические операции. Поводом для публикации послужило понимание того, что целое предприятие с более сотней активных пользователей уже на протяжении года мучилось с такой, казалось бы на первый взгляд, тривиальной проблемой. Варианты решения, предложенные специалистами helpdesk, обслуживающими данное предприятие, а так же многочисленные обсуждения на форумах, только подтвердили убеждение в необходимости описания способа, который позволил мне качественно и быстро справиться с ситуацией.
Управление контейнерами
Просмотр списка активных контейнеров
Вывод будет следующий
Просмотр контейнеров системы
Данная команда выведет примерно следующий текст
Список последних созданных контейнеров
Запуск контейнера производится командой start + ID контейнера либо имя контейнера . Для примера запустим контейнер с ubuntu его ID 997d1ad717ec , а имя interesting_lamarr
Теперь командой docker ps проверим статус контейнера
Для остановки контейнера выполним команду docker stop + ID либо имя контейнера
Для удаления контейнера используется команда docker rm + ID либо имя контейнера
Теперь вы умеет устанавливать Docker , скачивать, создавать, удалять и изменять контейнеры. И самое главное, в этом нет ничего сложного.
Сервер 1С:Предприятие на Ubuntu 16.04 и PostgreSQL 9.6, для тех, кто хочет узнать его вкус. Рецепт от Капитана
Если кратко описать мое отношение к Postgres: Использовал до того, как это стало мейнстримом.
Конкретнее: Собирал на нем сервера для компаний среднего размера (до 50 активных пользователей 1С).
На настоящий момент их набирается уже больше, чем пальцев рук пары человек (нормальных, а не фрезеровщиков).
Следуя этой статье вы сможете себе собрать такой же и начать спокойную легальную жизнь, максимально легко сделать первый шаг в мир Linux и Postgres.
А я побороться за 1. Лучший бизнес-кейс (лучший опыт автоматизации предприятия на базе PostgreSQL).
Если, конечно, статья придется вам по вкусу.
Контейнер и образ
Давайте разделим Docker на две основные части: образ и контейнер.
Давайте вспомним, когда мы покупали ПО на дисках. Образ – это и есть лазерный диск, слепок вашего программного обеспечения. Образ у вас один. Он может находиться у вас, в облаке, вы можете его собрать из исходников.
У диска есть дорожки, а у образа – слои. Каждая команда, которая формирует этот образ, накладывает в образе свой слой. Это позволяет в дальнейшем экономить дисковое пространство за счет переиспользования слоев нескольких образов. Допустим, у вас есть 3-4 образа, каждый из которых использует в качестве первого слоя операционную систему Ubuntu. С Docker вам не надо в вашей системе хранить несколько слоев с Ubuntu: вам достаточно одного слоя, который будут использовать все образы. Это называется переиспользование.
Когда вы начинаете запускать свое приложение на базе образа, вы запускаете контейнер – это, по факту, экземпляр приложения, сущность, которая предоставляет вам сервис.
Контейнер с точки зрения концепции Docker – некая сущность, которая живет недолго. Он должен родиться, поработать, и в дальнейшем уничтожиться. Все данные которые необходимо сохранить, монтируются к контейнеру в качестве подключаемых разделов.
Запуск Apache 2.4 с модулем 1С внутри Docker контейнера
Про Apache и про Linux слышали, наверное, все. А вот про Docker пока нет, но он сильно набирает популярность последнее время и не зря. Поделюсь своим опытом и дам пошаговую инструкцию настройки веб-сервера Apache с модулем 1С внутри Docker контейнера на Linux хосте. При этом сам сервер 1С может находиться совсем на другой машине и на другой операционной системе
Это не важно, главное чтобы Apache смог достучаться до сервера 1С по TCP. В статье дам подробное пояснение по каждой используемой команде со ссылками на документацию по Docker, чтобы не создавалось ощущение непонятной магии
Также прилагаю git репозиторий с описанием всей конфигурации, можете попробовать развернуть у себя буквально за 10 минут.
Создание и запуск контейнеров
Запомните основные постулаты контейнеров в docker
- Контейнер живет, пока живет процесс, вокруг которого рождается контейнер.
- Внутри контейнера этот процесс имеет pid=1
- Рядом с процессом с pid=1 можно порождать сколько угодно других процессов (в пределах возможностей ОС, естественно), но убив (рестартовав) именно процесс с pid=1, контейнер выходит. (см п.1)
- Внутри контейнера вы увидите привычное согласно стандартам FHS расположение директорий. Расположение это идентично исходному дистрибутиву (с которого взят контейнер).
- Данные, создаваемые внутри контейнера остаются в контейнере и нигде более не сохраняются (ну, еще к этому слою есть доступ из хостовой ОС). удалив контейнер — потеряете все ваши изменения. Поэтому данные в контейнерах не хранят, а выносят наружу, на хостовую ОС.
Создание контейнера
# docker container create ОБРАЗ
Или
# docker container create -a STDIN ОБРАЗ
-a – сокращение от –attach (прикрепить). Контейнер можно прикрепить к стандартным потокам STDIN, STDOUT или STDERR.
Запуск существующего контейнера (можно обращаться к контейнеру по идентификатору или имени):
docker container start КОНТЕЙНЕР
Определить идентификатор или имя можно при помощи команды ps. Опция «–l» означает последний запущенный контейнер:
# docker ps -l
Как уже было рассмотрено в предыдущей части, команда run объединяет создание и запуск контейнера. Для краткости с ней можно не указывать слово container.
# docker container run ОБРАЗ
Или
# docker run ОБРАЗ
Для запуска внутри контейнера команды:
# docker container run ОБРАЗ КОМАНДА
Запуск в фоновом режиме
# docker container run -d ОБРАЗ
-d – это сокращение от –detach (отсоединить). Контейнер будет работать в фоновом режиме, и вы сможете использовать терминал для других команд.