Docker-Basic

Docker

что такое докер?

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"