Начало работы с Docker
Введение
Docker
— программное обеспечение для автоматизации развёртывания и управления
приложениями в средах с поддержкой контейнеризации.
Позволяет «упаковать» приложение со всем его окружением и
зависимостями в контейнер, который может быть перенесён на любую
Linux
-систему с поддержкой cgroups в ядре, а также предоставляет
среду по управлению контейнерами.
Изначально использовал возможности
LXC, с 2015 года применял собственную библиотеку, абстрагирующую
виртуализационные возможности ядра Linux — libcontainer.
С появлением Open Container Initiative начался переход от монолитной
к модульной архитектуре.
Разрабатывается и поддерживается одноимённой компанией-стартапом,
распространяется в двух редакциях — общественной (Community Edition)
по лицензии Apache 2.0 и для организаций (Enterprise Edition) по
проприетарной лицензии. Написан на языке
Go
.
Инструкция по работе с Docker от Beget.com
Проверить версию
docker version
Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:23:10 2020 OS/Arch: windows/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:29:16 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683
docker info
Client: Debug Mode: false Server: Containers: 1 Running: 1 Paused: 0 Stopped: 0 Images: 18 Server Version: 19.03.8 Storage Driver: overlay2 Backing Filesystem: <unknown> Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 4.19.76-linuxkit Operating System: Docker Desktop OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 1.945GiB Name: docker-desktop ID: FBED:2SXW:VNQJ:PHNT:WYBQ:UICB:BJIW:4IMX:TCRW:3TJT:75VR:LISO Docker Root Dir: /var/lib/docker Debug Mode: true File Descriptors: 56 Goroutines: 68 System Time: 2020-07-14T19:48:22.671351094Z EventsListeners: 4 Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false Product License: Community Engine
Без sudo
Чтобы не писать sudo каждый раз выполните следующие команды
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
Запуск контейнера
Запуск контейнеров в Docker осуществляется командой run
Запустить контейнер hello-world
docker run hello-world
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
Сперва Docker искал образ hello-world на моём компьютере, когда не нашёл - скачал с репозитория и запустил.
Чтобы получить список всех контейнеров выполните docker ps -a.
-a выводит также незапущенные в данный момент контейнеры
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 85375f0f0e5e hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago elated_meninsky 33efc448ad6c docker101tutorial "/docker-entrypoint.…" 9 hours ago Up 9 hours 0.0.0.0:80->80/tcp docker-tutorial
Чтобы получить список всех сетей
docker network ls
NETWORK ID NAME DRIVER SCOPE edc9e216b1c9 bridge bridge local d2a6e70e6f02 host host local 2fe64119957a jenkins_nginx_mkdocs_jenkins bridge local 74bc210e5fd6 jenkins_nginx_mkdocs_net3 bridge local 56d1516faeda none null local
Подключить контейнер к сети
docker network connect [OPTIONS] NETWORK CONTAINER
docker images
Список образов верхнего уровня, их теги, размеры и репозитории можно получить выполнив
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE andreyolegovichru/docker101tutorial latest dd2e76a16950 9 hours ago 26.8MB docker101tutorial latest dd2e76a16950 9 hours ago 26.8MB <none> <none> f5578f194936 9 hours ago 123MB <none> <none> 409d2b2d3c0b 9 hours ago 110MB <none> <none> c26bbf7dc236 9 hours ago 224MB python alpine fbfb63e3c6bb 17 hours ago 80.3MB nginx alpine ecd67fe340f9 4 days ago 21.6MB node 12-alpine 057fa4cc38c2 2 weeks ago 89.3MB hello-world latest bf756fb1ae65 6 months ago 13.3kB
Pull: скачивание образов
С помощью команды pull можно скачивать образы не запуская их.
Скачать образ с Ubuntu
docker pull ubuntu
Using default tag: latest latest: Pulling from library/ubuntu 692c352adcf2: Pull complete 97058a342707: Pull complete 2821b8e766f4: Pull complete 4e643cc37772: Pull complete Digest: sha256:55cd38b70425947db71112eb5dddfa3aa3e3ce307754a3df2269069d2278ce47 Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest
Проверить обновились ли образы
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE andreyolegovichru/docker101tutorial latest dd2e76a16950 19 hours ago 26.8MB docker101tutorial latest dd2e76a16950 19 hours ago 26.8MB <none> <none> f5578f194936 19 hours ago 123MB <none> <none> 409d2b2d3c0b 19 hours ago 110MB <none> <none> c26bbf7dc236 19 hours ago 224MB python alpine fbfb63e3c6bb 27 hours ago 80.3MB nginx alpine ecd67fe340f9 4 days ago 21.6MB ubuntu latest adafef2e596e 8 days ago 73.9MB node 12-alpine 057fa4cc38c2 2 weeks ago 89.3MB hello-world latest bf756fb1ae65 6 months ago 13.3kB
Если Вам нужен не последний образ а какая-то определённая версия - укажите её после двоеточия.
Например, если нужна Ubuntu 14.04
docker pull ubuntu:14.04
Удалить образ можно командой rmi
docker rmi ubuntu:14.04
Можно удалять не по имени, а с помощью IMAGE ID, например, если я хочу удалить образ hello-world IMAGE ID которого bf756fb1ae65
docker rmi bf756fb1ae65
Репозиторий образов hub.docker.com
Изучить список доступных образов можно на сайте
hub.docker.com
Нужно нажать на кнопку Explore в верхнем меню
hub.docker.com/search
Список выглядит следующим оригинальным образом:
Образов очень много, советую пользоваться поиском или фильтрами. Docker Certified означает официльный образ.
У официальных образов названия указаны просто:
debian
,
python
,
php
и так далее. Это называется «Top Level Image»
Если источник не подтверждён, например, если я сделаю какой-то образ, например приложение для сайта
TopBicycle.ru
то имя будет выглядеть так: andreyolegovich/topbicycle-ru
То есть сперва имя автора, затем имя образа. Не все компании верифицируют образы. Например,
софт для нагрузочного тестирования
Yandex Tank
выложен как direvius/yandex-tank
Включение, выключение и удаление контейнеров
Про остановку и удаление всех контейнеров сразу читатйте статью
«Остановить все контейнеры Docker»
Когда контейнер находится в состоянии Exited - его можно запустить командой start.
В целом все команды интуитивно понятны.
docker start имя_контейнера
docker stop имя_контейнера
docker restart имя_контейнера
docker rm имя_контейнера
Можно удалить по id или только по его начальным символам
docker stop a1b2
Выйти из контейнера можно нажав одновременно
CTRL + P + Q
logs
По умолчанию логи бегут прямо в консоли, но если контейнер запущен с флагом -d их не видно. Изучить логи можно командой logs
docker logs имя_контейнера
docker log id_контейнера
Очистить всё
Чтобы удалить все образы, остановленные контейнеры, докер сети и даже кэш выполните
docker system prune
WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all dangling build cache Are you sure you want to continue? [y/N]
y
Держать контейнер активным
Если ваш контейнер успешно запускается и сразу же закрывается можно добавить в Dockerfile следующую команду
CMD tail -f /dev/null
В docker-compose.yml это выглядит как
command: tail -F /dev/null
Это похоже на костыль, поэтому как только мне попадётся на глаза нормальный способ - добавлю его сюда.
Основы | |
exec: команды внутри контейнера | |
Переключить engine (Linux ↔ Windows) | |
Видеоуроки |