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