что такое докер?
Docker основан на проектах с открытым исходным кодом Go контейнер языка, родился в начале 2013 года, первым инициатором является компания dotCloud.
Проект Docker присоединился к Linux Foundation и следует протоколу Apache2.0, а весь код поддерживается на github.
Видение Docker заключается в реализацииBuild Ship and Run Any app anywhere
То есть посредством управления упаковкой, распространением, развертыванием и жизненным циклом приложения достигается цель упаковки компонентов приложения один раз и их повсеместное выполнение.
Компоненты приложения здесь не ограничиваются веб-приложениями, а могут быть средой компиляции, службой платформы базы данных или даже операционной системой и кластером.
Разработка Docker построена на контейнерной технологии Linux.
Зачем использовать Докер?
В области облачных приложений могут быть освобождены от ограничений базового физического оборудования и доступны в любое время в любое время. Это позволяет быстро распространять и развертывать. Упаковочные приложения через Docker, отделение приложений и работающих платформ. Уменьшить затраты на разработку и риски развертывания.
Преимущества докера
- Более быстрая доставка и развертывание
- более эффективное использование ресурсов
- Упрощенная миграция и масштабирование
- Более простое управление обновлениями
Основные концепции Docker
Изображение: шаблон только для чтения, содержащий базовую операционную систему Контейнер: легкая песочница, контейнер создается из образа, работающего экземпляра приложения. Вы можете запускать, запускать, прекращать удаление, и контейнеры изолированы друг от друга. Репозиторий: Подобно репозиторию кода, это место, где файлы изображений хранятся централизованно.
Докер-образ — Докер-образ
Как использовать образы Docker
Прежде чем Docker запустит контейнер, соответствующий образ должен существовать локально.Если образ не сохранен локально, Docker сначала попытается загрузить его из репозитория образов по умолчанию.
использоватьdocker pull
Команда может загружать образы непосредственно из источника образа Docker Hub.
docker pull NAME[:TAG]
NAME: 镜像的名称
TAG: 镜像的版本
например: Подводя итог, информация, требуемая зеркалом,名称
+标签
docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
bae382666908: Pull complete
29ede3c02ff2: Pull complete
da4e69f33106: Pull complete
8d43e5f5d27f: Pull complete
b0de1abb17d6: Pull complete
Digest: sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc
Status: Downloaded newer image for ubuntu:14.04
Если не указано указаноTAG
, будет выбрано по умолчаниюlatest
Этикетка. Будет загружена последняя версия зеркала.
загрузочный образ
После загрузки на локал можно использовать образ для создания контейнера
docker run -it ubuntu:14.04 bash
/*
-i
-t
*/
root@4a9c106836e1:/#
После того, как выполнение будет завершено, он войдет в интерфейс bash, и вы сможете выполнить некоторые основные операции.
Просмотр информации об изображении
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
calculatorapp latest 1dec489fae9a 12 hours ago 955MB
<none> <none> 2dab0d648733 6 days ago 755MB
node 6.11.1 1ffbfd4a58ec 2 months ago 656MB
参数
docker iamges
-a 列出所以镜像
Используйте команду «Тег», чтобы добавить теги изображения.
docker tag ubuntu:lastest myubuntu:lastest
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu lastest dea1945146b9 2 weeks ago 188MB
ubuntu 14.04 dea1945146b9 2 weeks ago 188MB
На самом деле видно, что идентификатор IMAGE ID один и тот же, поэтому он фактически указывает на один и тот же файл изображения.
удалить зеркало
1. Удалить по тегу
docker rmi IMAGE[IMAGE...]
eg:
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu lastest dea1945146b9 2 weeks ago 188MB
docker rmi myubuntu:latest
2. Удалить по ID
docker rmi ID
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu lastest dea1945146b9 2 weeks ago 188MB
docker rmi dea1945146b9
注意
При удалении, если ни один контейнер не использует это изображение, изображение и все содержащиеся в нем слои будут удалены напрямую.
Но если контейнер использует изображение, вы получите это приглашение
docker rmi myubuntu:lastest
Error response from daemon: conflict: unable to remove repository reference "myubuntu:lastest" (must force) - container 4a9c106836e1 is using its referenced image dea1945146b9
Есть два пути ее решения:
- использовать
-f
Принудительное удаление параметра (не рекомендуется) - Сначала удалите контейнер, затем удалите образ
Создать образ
Существует три способа создания образа:
- Создание контейнера на основе существующего образа
- Импорт на основе локального шаблона
- Создан на основе Dockerfile
Docker Container - Docker Container
Контейнер — это работающий экземпляр образа.
создание контейнера
использоватьdocker create
Созданный контейнер находится в остановленном состоянии и может быть запущен командой docker start
docker create
-d 是否在后台运行
eg:
docker create -it ubuntu:latest
bb821ea158758312d0832d2c971aab1665cce73541f04f22ca292f979c871e2e
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb821ea15875 ubuntu:latest "/bin/bash" 3seconds ago Created adoring_archimedes
запустить контейнер
использоватьdocker start
команда для запуска уже созданного контейнера
docker start [container_name/container_id]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb821ea15875 ubuntu:latest "/bin/bash" 3seconds ago Created adoring_archimedes
docker start bb821ea15875
or
docker start adoring_archimedes
Просмотр запущенных контейнеров
использоватьdocker ps
команда для просмотра запущенных контейнеров
docker ps
-a 查看所有的容器
Создать и запустить контейнер
docker run
= docker create
+ docker start
docker run
-i 让容器的标准输入保持打开
-t 让docker分配一个伪终端(pseudo-tty),并绑定到容器的标准输入上
eg:
docker run -it ubuntu:14.04 /bin/bash
在ubuntu14.04上启动一个bash终端,并允许用户交互
可以使用exit或者ctrl+d来退出容器
Работает в состоянии демона (работает в фоновом режиме)
docker run -d ubuntu:14.04 /bin/bash
-d 后台运行并输出 container ID
注意
Если он работает в фоновом режиме, вы можете использоватьdocker logs [container_name/container_id]
способ получить выходную информацию контейнера
Завершить контейнер
docker stop [container_name/container_id]
в контейнер
в настоящее время использует-d
параметр, контейнер перейдет в фоновый режим при запуске. Пользователь не может видеть информацию в контейнере и не может выполнять действия
Три способа решения:
-
attach
Команда (устарела) -
exec
команда (рекомендуется) - инструмент nsenter (не рекомендуется)
docker exec -it [container_name/container_id] /bin/bash
-i 打开标准输入接受用户的输入
-t 让docker分配一个伪终端(pseudo-tty),并绑定到容器的标准输入上
-u 执行命令的用户
удалить контейнер
docker rm [container_name/container_id]
-f 强制终止并删除一个正在运行的容器
Репозиторий Docker — репозиторий Docker
склад:
- общественный склад
- Частный репозиторий
Docker Hub: официальный публичный репозиторий образов Docker.
Управление данными докера
Контейнеры управляют данными двумя способами:
- Тома данных: данные внутри контейнера напрямую сопоставляются с локальной средой хоста.
- Контейнеры томов данных: используйте определенные контейнеры для хранения томов данных.
объем данных
Что такое объем данных? Специальный каталог, доступный для контейнера, который сопоставляет каталог операционной системы хоста непосредственно с контейнером.
Преимущество:
Как создать том данных?
Три способа:
- Создайте том данных внутри контейнера
- Смонтировать каталог хоста как том данных
- Смонтировать локальный файл hosts как том данных (не рекомендуется)
Создайте том данных внутри контейнера
Создайте том данных внутри контейнера, используя-v
параметр, который по сути представляет собой папку, созданную внутри контейнера
docker run -it -v /webapp ubuntu
//在容器内部创建一个文件夹
-v Bind mount a volume
например:
docker run -it ubuntu
root@f22d574bb63f:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
docker run -it -v /webapp ubuntu
root@c3acf065e9c2:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var webapp
//多了一个webapp文件夹
Смонтировать каталог хоста как том данных (рекомендуется)
также использовать-v
параметр,
docker run -it -v /src/webapp:/opt/webapp ubuntu
//将本地的/src/webapp目录挂载到容器内部的/opt/webapp
Путь к локальному каталогу должен быть绝对路径
, если целевой каталог не существует, docker создаст его автоматически. Но если цель существует, ? ? ?
Разрешение по умолчанию для тома данных, смонтированного Docker, — чтение и запись (rw), которое также можно изменить.
контейнер объема данных
Создайте контейнер объема данных, чтобы обмениваться постоянно обновляемыми данными между несколькими контейнерами.
Как создать?
docker run -it --name dbdata -v /dbdata ubuntu
//创建一个dbdata的文件夹作为共享数据卷
--name 给容器起一个名字
Как другие контейнеры могут использовать этот общий объем данных?
docker run -it --volumes-from dbdata --name db1 ubuntu
//将一个container名字为dbdata的数据卷也挂载到当前的容器中
--volumes-from Mount volumes from the specified container(s) 从指定的container来挂载卷
Использование томов-контейнеров для резервного копирования данных 1. Резервное копирование
$ docker run --volumes-from dbdatasrc -v $(pws):/backup --name worker ubuntu tar cvf /back/backup.tar /dbdata
//将容器dbdatasrc内部的数据卷(/dbdata)挂载到新的ubuntu的容器上(起名为worker容器),此时worker容器内部会有/dbdata的数据卷.
//同时将/dbdata内部的所有数据压缩打包到worker容器下的/back目录下。 实现数据备份。
Отображение портов и взаимосвязь контейнеров
Доступ к контейнерным приложениям извне (сопоставление портов)
При запуске контейнера, если не указаны соответствующие параметры, доступ к сетевым приложениям и службам в контейнере через сеть вне контейнера невозможен.
Как разрешить внешний доступ к контейнеру?
1. Пройти-P
заглавная П
При использовании флага -P Docker случайным образом сопоставляет порт с 49000 по 49900 с открытым сетевым портом контейнера:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ad0d233c126 training/webapp "python app.py" 46 seconds ago Up 44 seconds 0.0.0.0:32768->5000/tcp dazzling_kirch
2. Пройти-p
строчная буква р
Вы можете указать порт для сопоставления
Поддерживаемые форматы
HostPort:Container | Ip:HostPort:Container | Ip::ContainerPort
ПервоеHostPort:Container
, сопоставьте локальный порт с указанным портом контейнера
Сопоставить все адреса интерфейсов
docker run --name test1 -p 5000:5000 training/webapp python app.py
//将本地的5000端口映射到容器的5000端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7f8a05e63a9 training/webapp "python app.py" 3 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp ecstatic_einstein
docker run -p 5000:5000 -p 3000:80 ubuntu
В это время привязка所有IP段的5000端口
в контейнер5000
порт
секундаIP:HostPort:ContainerPort
, Сопоставьте порт локального указанного IP-адреса с указанным портом контейнера
Сопоставить с указанным портом указанного адреса
docker run --name test2 -p 127.0.0.1:5000:5000 training/webapp python app.py
//将本地的ip仅为127.0.0.1的5000映射到容器的5000
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bd4e352c3b48 training/webapp "python app.py" 2 minutes ago Up 2 minutes 127.0.0.1:5000->5000/tcp test1
третийIp::ContainerPort
,
любой порт, сопоставленный с указанным адресом
docker run --name test3 -p 127.0.0.1::5000 training/webapp python app.py
//绑定127.0.0.1的任意端口到容器的5000端口,本地主机会随机分配一个端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b804acc891df training/webapp "python app.py" 5 seconds ago Up 3 seconds 127.0.0.1:32768->5000/tcp test3
Просмотр конфигурации сопоставления портов
docker port [container_name/container_id]
eg:
docker port b804acc891df
5000/tcp -> 127.0.0.1:32768
//表示容器的5000映射在本地主机的127.0.0.1:32768
or:
docker port b804acc891df 5000
127.0.0.1:32768
Контейнерное соединение
Соединение контейнеров — это способ быстрого взаимодействия с приложениями в нескольких контейнерах. Он создает соединение между контейнерами-источниками и контейнерами-приемниками, к которым можно получить доступ с помощью容器名
Быстрый доступ к исходному контейнеру без указания IP-адреса.
Пользовательское имя контейнера, при создании контейнера используйте--name
параметр, иначе система сгенерирует имя случайным образом.
использовать--link
Параметры обеспечивают безопасное взаимодействие между контейнерами.
например:
1.创建一个新的数据库容器
$ docker run -d --name db-container training/postgres
2.创建一个新的web容器可以访问这个数据库容器
$ docker run -d -P --name web --link db-container:db training/webapp python app.py
// --link name:alias
//name: 要连接的容器名称
//alias: 连接的别名 (这个是啥意思?有什么用?)
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5797ccc4f95 training/webapp "python app.py" 2 hours ago Up 2 hours 0.0.0.0:32769->5000/tcp web
cdd159304af3 training/postgres "su postgres -c '/..." 2 hours ago Up 2 hours 5432/tcp db-container
Docker эквивалентен созданию виртуального канала между двумя взаимосвязанными контейнерами без сопоставления их портов с хостом.
Docker предоставляет информацию о соединении для контейнеров двумя способами:
- Обновите переменные среды
- Обновите файл /etc/hosts
Мое понимание: если два контейнера взаимосвязаны, они должны быть каким-то образом связаны. Здесь db-контейнер эквивалентен родительскому контейнеру.
Информация о его хостах выглядит следующим образом:db-container
из/etc/hosts
:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 cdd159304af3 <= 自己的容器的ID
что связано сweb
Контейнеры разныеweb
из/etc/hosts
:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 db db-container cdd159304af3 <= --link 的参数db-container:db
172.17.0.3 c5797ccc4f95 <= 自己的容器的ID
использованная литература
Книга: "Введение и практика технологии Docker"