Для выполнения инструкций из данной статьи на Windows необходимо скачать и установить docker toolbox for Windows. Docker toolbox автоматически установит вам VirtualBox (можно убрать галочку) для запуска виртуальной машины Linux для Docker.
После установки следующим этапом будет создание docker-machine. Это лучше сразу делать с отключенной проверкой виртуализации:
docker-machine create default --virtualbox-no-vtx-check
Это действие необходимо выполнить один раз. Далее запускаем docker-machine через команду
docker-machine start
После этого можно просмотреть окружение машины через
docker-machine env
Однако для корректной работы с docker необходимо добавить переменные окружения docker-machine:
@FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO @%i
Либо если вы используете powershell, то
docker-machine env --shell=powershell | Invoke-Expression
Теперь команда docker version
для докер-сервера должна работать корректно:
Для теста можете запустить hello-world:
docker run hello-world
На экране должно вывести на экран примерно следующее:
Чтобы посмотреть все существующие образы на docker-machine воспользуйтесь командной
docker images
Результат на моем ПК выглядит так:
Если в дальнейшем какой-то из образов будет заниматься слишком много места и потребует переноса на другой диск, то вы можете перенести docker-machine, используя virtualBox
Кстати все эти команды можно отправлять и непосредственно из терминала linux докер-машины, подключившись к нему через ssh командой docker-machine ssh
(рекомендуется использовать conemu либо любой другой терминал вместо стандартного). Но это по желанию.
А теперь давайте запустим какой-нибудь контейнер и поработаем с ним. Выше мы уже запускали контейнер с hello-world образом для проверки. После выполнения контейнер завершил работу и вышел. Разумеется, это не то, что нужно для работы. Поэтому мы возьмем другой образ. Однако далее я настоятельно рекомендую использовать conemu либо любой другой терминал windows вместо стандартного, поскольку мы будем работать через него уже непосредственно с линукс-консолью.
Итак, запускаем новый терминал, и вводим команду
@FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO @%i
для корректной его работы с docker-machine. И вводим команду:
docker run -it ubuntu
Обратите внимание на сочетание флагов -it
. Они необходимы, чтобы контейнер не завершил работу сразу после запуска и перенаправил нам ввод вывод со стокового терминала ubuntu. Это команда скачает образ ubuntu с docker-hub и запустит его с указанным флагом. Размер скачиваемого образа ~80mb.
Вы так же можете можете запустить docker с флагом -d
. Так запуск приведет к запуску контейнера в фоновом режиме:
docker run -id ubuntu
Просмотреть все запущенные контейнеры вы можете через команду
docker ps
В случае последнего варианта вы можете выполнять команды в докере через любой терминал Windows через команду
docker exec
Например:
Вместо можно использовать имя контейнера (автоматически сгенерированное при запуске либо заданное с использованием ключа
--name
). Кстати управлять запущенными контейнерами очень удобно и через Kitematic — специальную программу, которая по умолчанию устанавливается вместе с docker toolbox (можно снять галочку).
Мы так же можем подключиться к любому запущенному контейнеру через команду
docker attach
и тогда получим тот же результат что при выполнении docker run -it ubuntu
.
Для выхода из linux-терминала вы можете использовать (в зависимости от windows-терминала) одну из следующих команд: ctrl+c, ctrl+d, ctrl+break.
Однако возникает закономерный вопрос: а что нам с этим делать? Ну запустили мы этот контейнер, что с того? Как нам с ним работать? Через bash команды писать и через git синхронизировать? Да на что он такой нужен?
И вот тут начинается самое интересное.
Начнем с ключа -p
. Этот ключ позволяет достукиваться до контейнера по определенным портам (своего рода проброс портов). Например:
docker run --name server -id -p 0.0.0.0:80:8000 ubuntu
Позволяет с порта 80 хост-машины достучаться до 8000 порта контейнера ubuntu.
Но это, разумеется, не все.
Когда контейнер останавливается, все данные на нем удаляются. Для того, чтобы этого избежать, используют монтирование томов с помощью опции -d
. Например:
docker run --name server -it -v content:/usr/share/dev ubuntu
Давайте выполним эту команду и перейдете по пути /usr/share/
:
cd /usr/share/ ls
Как мы видим внутри появилась новая директория dev
. Перейдем в нее:
cd dev ls -l
Она пуста. Теперь в другом окне терминала параллельно зайдем в docker-machine и проверим список директорий:
docker-machine ssh cd / ls -l
Мы увидим, что появилась директория content
. Давайте изменим ее разрешения:
sudo chmod 777 content
либо
sudo chmod ugo+rwx content
Хорошо. Перейдем в нее и создадим папку a
:
cd content mkdir a
И вернувшись обратно к терминалу с docker-container проверим содержимое директории dev:
ls
В результате там должна появиться директория a
:
Синхронизирует папке content
хост-сервера с папкой /usr/share
в докер-контейнере. Хорошо, скажете вы, но это же папке внутри docker-machine, а не Windows. Тем более, что при таких опциях docker-machine start при перезагрузке docker-machine файлы внутри content будут утеряны. И вопрос вполне логичный. Поэтому необходимо сделать синхронизацию с Windows. Это можно сделать несколькими путями:
Путь первый — открываем Virtual Box, находим там нашу машину (по умолчанию имеет имя default), открываем ее настройки, идем на вкладку Общие папки и в пункте «путь к папке» выбираем путь к той папке на Windows, с которой необходимо настроить синхронизацию:
Пускай у меня это будет F:\Docker\mysql\app
в пункте ниже пишем имя папки на нашей хост-машине. Это content
. Ставим галочку на «создать постоянную папку» и «авто-подключение». Жмем ок и перезапускаем машину.
Второй путь — такого эффекта можно было б добиться командой
docker-machine mount app:/content
Однако есть и третий, но он почему-то у меня работал не всегда. Хотя, пожалуй, он самый лаконичный:
docker run -it -v //c/Users/myuser:/myuser ubuntu
Можете поэкспериментировать с ним, опираясь на эту ветку обсуждений.
Все. На этом настройка docker закончена.
Но это только начало. Наберитесь терпения, ибо впереди у нас создание докер образа с нуля. Поехали
Полезные ссылки раз, синхронизация с windows, настройка общих папок в virtual box и изменение групп пользователя (на случай, если вместо docker-machine используете полноценную linux-систему, поднятую на virtualbox)
от 3 комментария
Если в докер-контейнере нет интернета, то надо воспользоваться советом отсюда https://kompsekret.ru/q/can-t-access-docker-container-on-virtualbox-from-internet-25329/
и сделать `docker-machine restart`
Если же докер контейнер остановлен, то можно его просто запустить, не создавая новый:
docker start -i container_name
где ключ -i отвечает за перехват ввода/вывода (-a — только за перехват вывода)
Вместо ‘docker attach’ можно использовать команду
docker exec -it [container_name|container_id] bash
Она работает стабильнее (docker attach у меня почему-то с Windows-терминалом работает некорректно при заданном ENRTYPOINT в образе, хотя без него все норм)