Установка и правильная настройка docker на windows subsystem linux (wsl)

Утилита 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

* в данном файле мы:

  1. используем базовый образ centos 7;
  2. в качестве автора образа указываем Dmitriy Mosk;
  3. задаем временную зону внутри контейнера Europe/Moscow.
  4. устанавливаем epel-release и nginx;
  5. чистим систему от метаданных и кэша пакетов после установки;
  6. указываем nginx запускаться на переднем плане (daemon off); 
  7. в индексном файле меняем первое вхождение nginx на docker-nginx;
  8. запускаем 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

  1. Контейнер живет, пока живет процесс, вокруг которого рождается контейнер.
  2. Внутри контейнера этот процесс имеет pid=1
  3. Рядом с процессом с pid=1 можно порождать сколько угодно других процессов (в пределах возможностей ОС, естественно), но убив (рестартовав) именно процесс с pid=1, контейнер выходит. (см п.1)
  4. Внутри контейнера вы увидите привычное согласно стандартам FHS расположение директорий. Расположение это идентично исходному дистрибутиву (с которого взят контейнер).
  5. Данные, создаваемые внутри контейнера остаются в контейнере и нигде более не сохраняются (ну, еще к этому слою есть доступ из хостовой ОС). удалив контейнер — потеряете все ваши изменения. Поэтому данные в контейнерах не хранят, а выносят наружу, на хостовую ОС.

Создание контейнера

# 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 (отсоединить). Контейнер будет работать в фоновом режиме, и вы сможете использовать терминал для других команд.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: