Skip to content
amigoml edited this page Feb 24, 2019 · 2 revisions

Docker ВНИМАНИЕ. старая инструкция - мб уже что-то не работает

ниже мануал по установке

Полезно ознакомиться, если не знаете зачем вам докер (пока у вас что-то ставится) вроде тут просто и на русском: https://xakep.ru/2015/06/01/docker-usage/ а тут есть все: https://docs.docker.com/


Ставим докер по инструкции:

https://docs.docker.com/install/linux/docker-ce/ubuntu/

выполняем prerequisites, устанавливаем докер до того состояния что сможем получить следующее запустив хелловорлд:

sudo docker run hello-world

Hello from Docker! This message shows that your installation appears to be working correctly.....

Там же еще есть инструкция по созданию докер группы -- это позволит вам избежать ввода каждый раз команды sudo когда вызываете докер


Можно поставить себе nvidia-docker чтобы юзать гпушки

https://github.com/NVIDIA/nvidia-docker

Для его установки выполняем две команды и тестим # Test nvidia-smi (третья команда)


Запускаем какой нибудь образ

Ставим образ, например https://github.com/saiprashanths/dl-docker или https://github.com/windj007/docker-jupyter-keras-tools/ или вообще отсюда https://hub.docker.com/explore/

Скачиваем докерфайл (обычно указано в инструкциях), собираем (он что-то еще докачает). Получаем образ - некоторый шаблон, собранный из инструкций в dockerfile из которого можем создавать свое рабочее окружение - докер контейнер.

запускается образ вот так:

 sudo docker run -it -p 8809:8888 -p 6006:6006 -v sharedfolder:/root/sharedfolder name_image:tag bash
Флаги зачем
-it создает интерактивный терминал для работы с окружением внутри контейнера
-p 8888:8888 -p 6006:6006 Связываем порты от контейнера к вашему компьютеру в формате -p <host-port>:<container-port>. default iPython Notebook runs on port 8888 and Tensorboard on 6006
-v /sharedfolder:/root/sharedfolder/ -v cвязывает папочку /sharedfolder на вашей машине с папкой /root/sharedfolder/ в контейнере докера. (важный момент - пути абсолютные) Все что вы сохраните измените внутри контейнера поменяется и на вашем хосте. Формат прописывания -v /local/shared/folder:/shared/folder/in/container/.
name_image:tag Название образа который хотите запустить. Формат имя_образа(сборки):Необязательный_тег. посмотреть список образов на своем компе можно sudo docker images
bash в конце пишется команда того что запустить. Можно запустить сразу ноутбук docker run -it -p 8888:8888 -p 6006:6006 floydhub/dl-docker:cpu jupyter notebook.

(Другой список флагов вы можете найти покопавшись на сайте докера :))

после того как все сделано набираешь exit и он выходит из контейнера.


Запустить докер с уже сделанными когда-то вашими изменениями

по каждой команде run он собирает новый контейнер из образа (из всех слоев образа) поэтому запуская через run каждый раз у вас будет свежее окружение

если вы наследили в запущенном контейнере и хотите чтобы какие файлы или установленные пакеты были доступны в новом запуске то можно запустить сразу контейнер. список контейнеров можно поглядеть через sudo docker ps -a, найти свой (контейнер айди) и запустить так:

$ sudo docker start 3uds38954jw4  # restart it in the background
$ sudo docker attach 3uds38954jw4 # reattach the terminal & stdin

и все должно быть хорошо - вы подсоединитесь к тому где есть ваши пакеты/данные.


СОХРАНЯЕМ ИЗМЕНЕНИЯ в новый образ

если нужно что то сохранить или сделать новый измененый образ с накатанным добром то можно сделать так:

$ docker ps -a                                    # найти ваш контейнер и запомнить его контейнер айди
$ docker commit <container_id> new_image_name:tag_name(optional) # заделать новый образ из этого контейнера
$ docker images                                          # посмотреть что новый образ есть в списке образов
$ docker run -it new_image_name:tag_name bash            # запустить и радоваться :)
# если хотите "свернуть" процесс чтобы потом можно было войти заново - то ctrl + p затем ctrl + q

Кажется (вроде бы) это добавляет новый слой (который можно было изменять в контейнере) поверх нашего базового образа (read-only слои).

http://stackoverflow.com/questions/19585028/i-lose-my-data-when-the-container-exits


Хотим сохранить (например для того чтобы перенести на другую машинку)

Образ

$ sudo docker images  # смотрим образы 

$ sudo docker save имя_образа > /home/save.tar  # сохраняем необходимый образ

контейнер

$ sudo docker ps -a  # смотрим конейнеры
$ sudo docker export e3574fcc273a > ~/docker_tmp/exported_dl_with_numpy.tar # сохраняем необходимый контейнер

где e3574fcc273a это некоторый container ID

ЗАГРУЗКА:

# загрузка образа
$ docker load < /home/save.tar
$ sudo docker images
# загрузка контейнера
$ cat /home/exported_dl_with_numpy.tar | sudo docker import - busybox-1-export:latest
$ sudo docker images

PS если что переименовать образ можно командой docker tag

http://tuhrig.de/difference-between-save-and-export-in-docker/



Есть некоторый набор хороших правил если вы будете собирать свой образ: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/