Познакомить вас с Docker с нуля

Docker

С момента своего выпуска в 2013 году Docker является очень популярной контейнерной технологией в последние годы, она привлекает внимание и, как считается, может изменить индустрию программного обеспечения. Более того, Docker — любимец не только гигантов Linux, таких как Linux Redhat и Canonical, но и компаний-разработчиков несвободного программного обеспечения, таких как Microsoft, также с энтузиазмом используют Docker, так что вы знаете, почему Docker так популярен.

Я считаю, что есть много людей, которые интересуются Докером и хотят изучить Докер, ведь я слушаю его каждый день, ведь он такой популярный, и ведь есть много навыков, которые не являются непосильными. Многие не знают, что такое Docker, какую проблему он решает и в чем его преимущества? Далее я объясню его подробно, чтобы помочь вам понять его, а также приведу простые для понимания примеры, чтобы научить вас использовать его для ежедневной разработки.

что такое контейнер

Контейнеры одним предложением. Контейнер — это упаковка программного обеспечения в стандартизированные блоки для разработки, доставки и развертывания.

  • Контейнерные изображения - это легкие, исполняемые автономные программные пакеты, которые содержат все, что необходимо запускать программное обеспечение: код, среда выполнения, системные инструменты, системные библиотеки и настройки.
  • Контейнерное программное обеспечение для приложений на базе Linux и Windows, которое стабильно работает в любой среде.
  • Контейнеры обеспечивают независимость программного обеспечения от различий во внешних средах (например, различий между средами разработки и промежуточной среды), помогая уменьшить конфликты между командами, использующими разное программное обеспечение в одной инфраструктуре.

Я думаю, что контейнер — это место для хранения вещей, точно так же, как дом может вместить любую мебель, а летние каникулы — всевозможные книги. То, о чем мы говорим в контейнерах, может быть больше похоже на такие приложения, как веб-сайты, программы и даже системные среды.

Виртуальные машины и контейнеры

виртуальная машина

Виртуальная машина - это решение с установкой среды. Она может запускать другую операционную систему в одной операционной системе, например, запускать систему Linux в системе Windows. Система точно такая же, и для базовой системы виртуальная машина представляет собой обычный файл, который можно удалить, если он не нужен, и не влияет на другие части.

Хотя пользователи могут восстановить исходную среду, созданную командой, через виртуальную машину. Но следующие недостатки.

(1) Это требует много ресурсов

Виртуальная машина занимает исключительно часть памяти и места на жестком диске. Когда он запущен, другие программы не могут использовать эти ресурсы. Даже если приложение на виртуальной машине фактически использует только 1 МБ памяти, для работы виртуальной машине требуются сотни МБ памяти. Обычно система поддерживает только десятки виртуальных машин.

(2) Есть много лишних шагов

Виртуальная машина — это полноценная операционная система, и некоторые операции на системном уровне нельзя пропустить, например, вход пользователя в систему.

(3) Медленный запуск

Сколько времени нужно, чтобы начать систему, сколько времени нужно, чтобы начать виртуальную машину. Для приложения может потребоваться несколько минут.

Контейнеры Linux

Из-за этих недостатков виртуальных машин в Linux была разработана другая технология виртуализации — контейнеры Linux.

Вместо того, чтобы эмулировать полную операционную систему, контейнеры Linux изолируют программы. Другими словами, снаружи нормального процесса наносится защитный слой. Для процесса в контейнере различные ресурсы, к которым он обращается, являются виртуальными, чтобы обеспечить изоляцию от базовой системы.

Поскольку контейнеры находятся на уровне процесса, они имеют много преимуществ перед виртуальными машинами.

(1) Быстрый запуск

Приложение в контейнере — это непосредственно процесс базовой системы, а не процесс внутри виртуальной машины. Поэтому запуск контейнера эквивалентен запуску процесса машины, а не запуску операционной системы, что намного быстрее.

(2) Меньше ресурсов

Контейнеры занимают только необходимые ресурсы и не занимают неиспользуемые ресурсы; виртуальные машины неизбежно занимают все ресурсы, потому что они являются полноценными операционными системами. Кроме того, несколько контейнеров могут совместно использовать ресурсы, а все виртуальные машины являются эксклюзивными ресурсами. Тысячи контейнеров поддерживаются на одной машине.

(3) Малый размер

Контейнер должен содержать только используемые компоненты, а виртуальная машина представляет собой упаковку всей операционной системы, поэтому файл контейнера намного меньше, чем файл виртуальной машины.

Сравните два

Традиционная технология виртуальных машин заключается в том, чтобы виртуализировать набор оборудования, запустить на нем полную операционную систему, а затем запустить необходимый процесс приложения в системе.Контейнер виртуализирует операционную систему, а не оборудование, и контейнеры используют один и тот же набор. ресурсов операционной системы. Технология виртуальной машины заключается в том, чтобы запускать на ней полную операционную систему после виртуализации набора оборудования. Поэтому уровень изоляции контейнера будет немного ниже.

Проще говоря, контейнеры и виртуальные машины имеют схожие преимущества в изоляции и выделении ресурсов, но имеют разные функции, поскольку контейнеры виртуализируют операционную систему, а не аппаратное обеспечение, поэтому контейнеры более переносимы и более эффективны. Процесс приложения контейнера запускается непосредственно на ядре хоста, а у контейнера нет собственного ядра, и нет аппаратной виртуализации. Таким образом, контейнеры легче, чем традиционные виртуальные машины.

Контейнер - это прикладной слой, используемый для упаковки кода и полагаться на ресурсы. Несколько контейнеров могут работать на одной машине, разделяют ядро ​​операционной системы, но каждый в качестве автономного процесса работает в пространстве пользователя. По сравнению с виртуальной машиной пространство, занятое контейнером, и его можно запустить мгновенно.

Виртуальная машина — это абстракция физического аппаратного уровня, используемая для превращения одного сервера в несколько серверов. Гипервизор позволяет запускать несколько виртуальных машин на одной машине. Каждая виртуальная машина содержит полный набор операционной системы, одно или несколько приложений, необходимые бинарники и библиотечные ресурсы, поэтому занимает много места. И запуск vm тоже очень медленный.

Что такое докер

Docker — это пакет контейнеров Linux с простым в использовании контейнерным интерфейсом, который в настоящее время является самым популярным контейнерным решением Linux.

Docker упаковывает приложение и зависимости программы в один файл. Запуск этого файла создаст виртуальный контейнер. Программы запускаются в этом виртуальном контейнере, как если бы они работали на реальной физической машине. С Docker вам не нужно беспокоиться об окружающей среде.

В целом, интерфейс Docker довольно прост, и пользователи могут легко создавать и использовать контейнеры, а также помещать в контейнеры свои собственные приложения. Контейнеры также можно версионировать, копировать, совместно использовать и изменять, как и обычный код.

Основные понятия докера

Докер Есть три основных концепция: изображение, контейнер, репозиторий.
  • Изображение (изображение)
  • Контейнер
  • Репозиторий

Поняв эти три понятия, вы понимаете весь жизненный цикл Docker,

Образ специальной файловой системы

Операционная система разделена на ядро ​​и пользовательское пространство. Для Linux после запуска ядра корневая файловая система будет смонтирована, чтобы обеспечить для нее поддержку пользовательского пространства. Образ Docker (Image) эквивалентен корневой файловой системе.

Образ Docker — это специальная файловая система, которая помимо предоставления программ, библиотек, ресурсов, конфигурации и других файлов, необходимых для выполнения контейнера, также содержит некоторые параметры конфигурации, подготовленные для выполнения (такие как анонимные тома, переменные среды, пользователи и т. д.). .Образ не содержит никаких динамических данных и его содержимое не будет изменено после построения.

Когда образ построен, он будет строиться слой за слоем, и предыдущий слой является основой следующего слоя. После построения каждого слоя он не изменится, и любые изменения на следующем слое будут происходить только с его собственным слоем. Например, операция удаления файла на предыдущем уровне фактически не удаляет файл на предыдущем уровне, а только помечает файл как удаленный на текущем уровне. При запуске финального контейнера, хотя этот файл и не будет виден, на самом деле файл всегда будет следовать за образом. Поэтому при построении образа требуется особая осторожность, и каждый слой должен содержать только то, что нужно добавить к этому слою, а все лишнее следует убрать до окончания построения слоя.

  Функция многоуровневого хранилища также упрощает повторное использование и настройку изображений. Вы даже можете использовать ранее созданный образ в качестве базового слоя, а затем добавлять новые слои, чтобы настроить то, что вам нужно для создания нового образа.

   По сравнению с iso-образом windows концепция образа в Docker не является чем-то новым. Но по сравнению с iso-образом windows, образ в Docker многоуровневый и многоразовый, а не простая куча файлов и дисков вместе (аналогично разнице между исходным кодом сжатого пакета и git-репозитория)

Контейнер

- Зеркальное время выполнения сущности

Отношения между изображением и контейнером подобны классу и экземпляру в объектно-ориентированном программировании. Изображение является статическим определением.Контейнеры — это объекты, которые представляют собой среды выполнения. Контейнеры можно создавать, запускать, останавливать, удалять,Пауза и др.

    

Суть контейнера — это процесс, но в отличие от процесса, выполняемого непосредственно на хосте, процесс-контейнер работает в своем собственном независимом пространстве имен. Как упоминалось ранее, образы используют многоуровневое хранилище, как и контейнеры.

   Жизненный цикл слоя хранения контейнера такой же, как и у контейнера.Когда умирает контейнер, уровень хранения контейнера также умирает. Поэтому любая информация, хранящаяся на уровне хранения контейнера, будет потеряна при удалении контейнера.


  Существование контейнера неотделимо от поддержки образа, который является носителем среды выполнения образа (по аналогии с отношениями между экземплярами и классами). Опираясь на технологию виртуализации Docker, для контейнеров создаются независимые порты, процессы, файлы и другие пространства.Контейнер представляет собой «контейнер» изоляции хост-машины. Контейнеры и хосты могут взаимодействовать с портами, томами и сетями.

Централизованное место для хранения файлов изображений - склад (хранилище)

После завершения построения зеркала его можно легко запустить на текущем хосте, ноЕсли нам нужно использовать этот образ на других серверах, нам нужен централизованный сервис для хранения и распространения образов, Docker Registry является таким сервисом.

   Реестр Docker может содержать несколько репозиториев (Repository); каждый репозиторий может содержать несколько тегов (Tag); каждый тег соответствует образу. Итак: репозиторий образов — это место, которое Docker использует для централизованного хранения файлов изображений, аналогично репозиторию кода, который мы использовали ранее.

как правило,Репозиторий будет содержать образы разных версий одного и того же программного обеспечения.Часто используется для маркировки каждой версии программного обеспечения должно. мы можем пройти<仓库名>:<标签>формат, чтобы указать, какая версия программного обеспечения является зеркальным отображением. Если тег не указан, в качестве тега по умолчанию будет использоваться последний.

  Репозиторий Docker похож на репозиторий git, но с именем и тегом репозитория. После сборки образа локально его можно распространять через репозиторий. Обычно используемые концентраторы Docker: https://hub.docker.com/, https://cr.console.aliyun.com/ и т. д.

Роль докера

1. Переключение развертывания нескольких сред

В бизнесе Wangwan необходимо различать среду разработки и онлайн-среду.Используя Docker, код и среда в среде разработки могут быть перенесены в онлайн-среду без изменений и без загрязнения.Активируйте на этом.

2. Настройка в один клик для сложных сред

В некоторых сценариях могут быть настроены некоторые сверхсложные среды.В настоящее время Docker может инкапсулировать конфигурацию среды и напрямую генерировать образы для всех, чтобы использовать их по низкой цене.

3. Модульное тестирование непрерывной интеграции

похож на travis-ci

4. Многоверсионная изоляция одного и того же приложения, файловая изоляция

Например, этот проект зависит от Java 7, этот проект зависит от Java 8, и на одном сервере работает 100 Chen Yong, которые могут быть изолированы Docker для предотвращения взаимного заражения.

5. Облачная конструкция

Разные люди, разрабатывающие один и тот же склад, часто сталкиваются с разными людьми, использующими разныеверсия пакетаИ я не знал, что отличаюсь от других, что в итоге привело к проблемам с онлайном после релиза. Используя Docker, вы можете удаленно создавать новые контейнеры в облаке.Отсутствие загрязнения, низкая стоимостьстроить код, реализовыватьРазные люди должны использовать одну и ту же версию.

6. Экономьте деньги

Низкая стоимость безопасности перепродано

Связанные команды

Установить

Установка Docker очень удобна, и есть инструменты или скрипты для установки в один клик под macOS, ubuntu и т.д. Еще можно обратиться кОфициальное руководство по Docker.

Ниже приведено краткое введение в установку под Ubuntu.

Docker поддерживает следующие версии Ubuntu:

  • Ubuntu Precise 12.04 (LTS)
  • Ubuntu Trusty 14.04 (LTS)
  • Ubuntu Wily 15.10
Для Docker требуется система Ubuntu с версией ядра выше 3.10. Проверьте необходимые условия на этой странице, чтобы убедиться, что ваша версия Ubuntu поддерживает Docker.

Проверьте текущую версию ядра с помощью команды uname -r

runoob@runoob:~$ uname -r

1. Выберите отечественного поставщика облачных услуг, здесь мы выбираем Alibaba Cloud в качестве примера.

curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

2. Установите необходимые пакеты

sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

3. Добавьте пакет, передаваемый по протоколу HTTPS, и сертификат ЦС.

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates

4. Добавьте ключ GPG

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

5. Добавьте источник программного обеспечения

echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list

6. После добавления успеха обновите буфер пакета программного обеспечения.

sudo apt-get update

7. Установите докер

sudo apt-get install docker-engine

8. Запустите докер

sudo systemctl enable docker
sudo systemctl start docker

Найдите базовое изображение

DockerHubКогда веб-сайт предоставляет много зеркал, как правило, мы находим зеркало из него в качестве базового зеркала, а затем выполняем наши последующие операции.

Вытащите базовое изображение

Когда мы используем несуществующий образ на локальном хосте, Docker автоматически загружает этот образ. Если мы хотим предварительно загрузить этот образ, мы можем использовать команду docker pull для его загрузки.

Используйте команду docker pull, чтобы загрузить образ с соответствующего узлового веб-сайта на локальный. При этом в процессе вытягивания видно, что зеркало вытягивается по нескольким «слоям»

Crunoob@runoob:~$ docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
6599cadaf950: Pull complete 
23eda618d451: Pull complete 
f0be3084efe9: Pull complete 
52de432f084b: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3
Status: Downloaded newer image for ubuntu:13.10

мы можем использоватьdocker imagesчтобы перечислить зеркала на локальном хосте.

runoob@runoob:~$ docker images           
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
training/webapp     latest              6fae60ef3446        11 months ago       348.8 MB

Описание каждого варианта:

  • РЕПОЗИТОРИЙ:Источник репозитория, представляющий изображение

  • ТЕГ:зеркальная этикетка

  • ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ:Идентификатор изображения

  • СОЗДАННЫЙ:Время создания образа

  • РАЗМЕР:Размер изображения

Создать Docker-контейнер

docker createКоманда создает контейнер через изображение и выдает идентификатор контейнера.

> docker create --name ubuntuContainer ubuntu:18.04
0da83bc6515ea1df100c32cccaddc070199b72263663437b8fe424aadccf4778

использоватьdocker startдля запуска контейнера.

> docker start ubuntuContainer

использоватьdocker psВы можете просмотреть работающий контейнер

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9298a27262da        ubuntu:18.04        "/bin/bash"         4 minutes ago       Up About a minute                       ubuntuContainer

использоватьdocker execЧтобы войти в контейнер.

> docker exec -it 9298
root@9298a27262da:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@9298a27262da:/# exit

использоватьdocker runМожно создать и запустить контейнер за один шаг, а затем войти в этот контейнер.

> docker run -it --name runUbuntuContainer ubuntu:18.04 /bin/bash
root@57cdd61d4383:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@57cdd61d4383:/#

# docker ps 可以查到已经成功运行了 runUbuntuContainer
> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
57cdd61d4383        ubuntu:18.04        "/bin/bash"         9 seconds ago       Up 8 seconds                            runUbuntuContainer
9298a27262da        ubuntu:18.04        "/bin/bash"         9 minutes ago       Up 6 minutes 

зафиксировать контейнер для создания нового образа

Так же, как при установке Windows с Ghost, во многих случаях мы ожидаем настроить наш собственный образ, установить в нем некоторые базовые среды (например, узел выше), а затем создать базовый образ, который мы хотим. В настоящее времяdocker commitЭто пригодилось.

> docker commit --author "rccoder" --message "curl+node" 9298 rccoder/myworkspace:v1
sha256:68e83119eefa0bfdc8e523ab4d16c8cf76770dbb08bad1e32af1c872735e6f71

# 通过 docker images 就能看到新制作的 rccoder/myworkspace 就躺在这里了
>docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
rccoder/myworkspace      v1              e0d73563fae8        20 seconds ago      196MB

Далее попробуйте наш только что созданный образ?

> docker run -it --name newWorkSpace rccoder/myworkspace:v1 /bin/bash
root@9109f6985735:/# node -v
8.0.0

Это выглядит хорошо.

отправить изображение в докер-хаб

После того, как изображение создано, как я могу поделиться им с другими?docker hubНапример.

Первый шаг — перейти в Docker Hub, чтобы зарегистрировать учетную запись, затем войти в учетную запись на терминале и нажать.

> docker login
> docker push rccoder/myworkspace:v1
The push refers to repository [docker.io/rccoder/myworkspace]
c0913fec0e19: Pushing [=>                                                 ]  2.783MB/116.7MB
bb1eed35aacf: Mounted from library/ubuntu
5fc1dce434ba: Mounted from library/ubuntu
c4f90a44515b: Mounted from library/ubuntu
a792400561d8: Mounted from library/ubuntu
6a4e481d02df: Waiting

Dockerfile

Непрерывная интеграция с Docker? По сравнению с тем, о чем вы, должно быть, слышали до знакомства с Docker, вам случайно нужно откуда-то скопировать код и выполнить его (да, звучит немногоtravis-ciэто чувство).

Настало время докерфила!

DockerFile - это скрипт, состоящий из куча команд + параметров. Используйте Docker Build, чтобы выполнить сценарий, чтобы создать изображение и сделать некоторые вещи автоматически (похоже на тот, который в Trviss-Ci.travis.yml).

Формат Dockerfile:

# Comment
INSTRUCTION arguments

должен начинаться сFROM BASE_IMAGEУкажите базовое изображение в начале.

Более подробные технические характеристики и инструкции см.Dockerfile reference. Здесь мы используем приведенный выше rccoder/myworkspace:v1 в качестве базового образа, а затем создаем каталог в корневом каталоге в качестве примера.

Dockerfile выглядит следующим образом:

FROM rccoder/myworkspace:v1
RUN mkdir a

Затем выполните:

> docker build -t newfiledocker:v1 .
Sending build context to Docker daemon  3.584kB
Step 1/2 : FROM rccoder/myworkspace:v1
 ---> 68e83119eefa
Step 2/2 : RUN mkdir a
 ---> Running in 1127aff5fbd3
Removing intermediate container 1127aff5fbd3
 ---> 25a8a5418af0
Successfully built 25a8a5418af0
Successfully tagged newfiledocker:v1

# 新建基于 newfiledocker 的容器并在终端中打开,发现里面已经有 a 文件夹了。
> docker docker run -it newfiledocker:v1 /bin/bash
root@e3bd8ca19ffc:/# ls
a  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Благодаря мощности Dockerfile, Docker оставляет безграничные возможности.

Установите среду Mysql в контейнер

Способ 1, docker pull php

Найдите изображения php на Docker Hub

runoob@runoob:~/php-fpm$ docker search php
NAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
php                       While designed for web development, the PH...   1232      [OK]       
richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable ...   207                  [OK]
phpmyadmin/phpmyadmin     A web interface for MySQL and MariaDB.          123                  [OK]
eboraas/apache-php        PHP5 on Apache (with SSL support), built o...   69                   [OK]
php-zendserver            Zend Server - the integrated PHP applicati...   69        [OK]       
million12/nginx-php       Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS...   67                   [OK]
webdevops/php-nginx       Nginx with PHP-FPM                              39                   [OK]
webdevops/php-apache      Apache with PHP-FPM (based on webdevops/php)    14                   [OK]
phpunit/phpunit           PHPUnit is a programmer-oriented testing f...   14                   [OK]
tetraweb/php              PHP 5.3, 5.4, 5.5, 5.6, 7.0 for CI and run...   12                   [OK]
webdevops/php             PHP (FPM and CLI) service container             10                   [OK]
...

Здесь мы загружаем официальное изображение с пометкой 5,6 кадра в минуту.

runoob@runoob:~/php-fpm$ docker pull php:5.6-fpm

Дождавшись завершения загрузки, мы можем найти зеркало с РЕПОЗИТОРИМ как php и меткой как 5.6-fpm в локальном списке зеркал.

runoob@runoob:~/php-fpm$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 5.6-fpm             025041cd3aa5        6 days ago          456.3 MB

Второй способ путем построения Dockerfile

Создать Dockerfile

Во-первых, создайте каталог php-fpm для хранения следующих связанных вещей.

runoob@runoob:~$ mkdir -p ~/php-fpm/logs ~/php-fpm/conf

Каталог журналов будет сопоставлен с каталогом журналов контейнера php-fpm.

Файлы конфигурации в каталоге conf будут сопоставлены с файлами конфигурации контейнера php-fpm.

Войдите в созданный каталог php-fpm и создайте Dockerfile.

Создайте образ через Dockerfile, заменив его своим именем

runoob@runoob:~/php-fpm$ docker build -t php:5.6-fpm .

После завершения создания мы можем найти только что созданный образ в локальном списке образов.

runoob@runoob:~/php-fpm$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 5.6-fpm             025041cd3aa5        6 days ago          456.3 MB