Учебник по началу работы с Docker — Руан Ифэн

Docker

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

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

Во-первых, проблема конфигурации среды.

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

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

Если некоторые старые модули несовместимы с текущей средой, это проблема. Разработчики часто говорят: «Это работает на моей машине», подразумевая, что на других машинах, вероятно, не будет.

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

2. Виртуальная машина

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

Хотя пользователь может восстановить исходную среду программного обеспечения через виртуальную машину. Однако эта схема имеет ряд недостатков.

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

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

(2) Есть много избыточных шагов

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

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

Столько времени, сколько требуется для запуска операционной системы, столько же времени требуется для запуска виртуальной машины. Запуск приложения может занять несколько минут.

3. Контейнеры Linux

Из-за этих недостатков виртуальных машин в Linux была разработана другая технология виртуализации: Контейнеры Linux (Linux Containers, сокращенно LXC).

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

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

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

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

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

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

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

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

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

4. Что такое докер?

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

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

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

5. Назначение Докера

Существует три основных категории основных применений Docker.

(1) Предоставьте одноразовую среду.Например, локальное тестирование программного обеспечения других людей и предоставление среды для модульного тестирования и сборки во время непрерывной интеграции.

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

(3) Настройте микросервисную архитектуру.При наличии нескольких контейнеров на одном компьютере может выполняться несколько служб, поэтому архитектуру микрослужб можно моделировать локально.

Шесть, установка Docker

Docker — это коммерческий продукт с открытым исходным кодом, который поставляется в двух версиях: Community Edition (сокращенно CE) и Enterprise Edition (сокращенно EE). Корпоративная версия включает в себя некоторые платные услуги, которые обычно не используются отдельными разработчиками. Следующие описания относятся к версии для сообщества.

Пожалуйста, обратитесь к официальной документации по установке Docker CE.

После завершения установки выполните следующую команду, чтобы убедиться, что установка прошла успешно.


$ docker version
# 或者
$ docker info

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


$ sudo usermod -aG docker $USER

Docker — это серверно-клиентская архитектура. запуск из командной строкиdockerПри выполнении команды вам необходимо иметь службу Docker на локальном компьютере. Если эта служба не запущена, вы можете запустить ее с помощью следующей команды (официальная документация).


# service 命令的用法
$ sudo service docker start

# systemctl 命令的用法
$ sudo systemctl start docker

6. файл изображения

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

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


# 列出本机的所有 image 文件。
$ docker image ls

# 删除 image 文件
$ docker image rm [imageName]

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

Чтобы облегчить обмен, после создания файла изображения его можно загрузить на онлайн-хранилище. Официальный репозиторий ДокераDocker HubЭто самый важный и наиболее часто используемый репозиторий изображений. Кроме того, также можно продавать файлы изображений, сделанные самостоятельно.

7. Пример: привет мир

Ниже мы передаем простейший файл изображения"hello world", почувствуйте Docker.

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


$ docker image pull library/hello-world

В приведенном выше кодеdocker image pullэто команда для захвата файла изображения.library/hello-worldрасположение файла образа в репозитории, гдеlibraryэто группа, в которой находится файл изображения,hello-worldэто имя файла изображения.

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


$ docker image pull hello-world

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


$ docker image ls

Теперь запустите файл изображения.


$ docker container run hello-world

docker container runКоманда создаст работающий экземпляр контейнера из файла образа.

Уведомление,docker container runКоманда имеет функцию автоматического захвата файлов изображений. Если обнаружится, что указанный файл изображения отсутствует локально, он будет автоматически взят со склада. Следовательно, предыдущийdocker image pullКоманды не являются обязательными шагами.

Если запуск прошел успешно, вы увидите следующий вывод на экране.


$ docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

... ...

После вывода этого приглашенияhello worldОн перестанет работать, и контейнер автоматически прекратит работу.

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


$ docker container run -it ubuntu bash

Для тех контейнеров, которые не завершаются автоматически, вы должны использоватьdocker container killКоманда завершается вручную.


$ docker container kill [containID]

8. Контейнерный файл

Экземпляр контейнера, сгенерированный файлом образа, сам является файлом, называемым файлом-контейнером.То есть после создания контейнера одновременно существуют два файла: файл изображения и файл контейнера. И закрытие контейнера не удаляет файлы контейнера, а просто останавливает контейнер.


# 列出本机正在运行的容器
$ docker container ls

# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all

Выходные данные приведенной выше команды включают идентификатор контейнера. Этот идентификатор необходимо указать во многих местах, например, в предыдущем разделе, чтобы завершить работу контейнера.docker container killЗаказ.

Контейнерный файл, завершающий операцию, по-прежнему будет занимать место на жестком диске и может использоватьсяdocker container rmкоманда удалить.


$ docker container rm [containerID]

После запуска вышеуказанной команды используйтеdocker container ls --allКоманда, вы обнаружите, что удаленный файл контейнера исчез.

Девять, файл Dockerfile

После того, как вы научились использовать файлы изображений, возникает следующий вопрос: как создавать файлы изображений? Если вы хотите продвигать собственное программное обеспечение, вы должны создавать свои собственные файлы изображений.

Для этого необходимо использовать файл Dockerfile. Это текстовый файл, используемый для настройки изображения. Docker создает двоичный файл образа на основе этого файла.

В следующем примере показано, как написать файл Dockerfile.

10. Пример: создайте свой собственный контейнер Docker

Ниже я используюkoa-demosВозьмите проект в качестве примера, чтобы представить, как написать Dockerfile, чтобы пользователи могли запускать платформу Koa в контейнере Docker.

В качестве подготовительной работы, пожалуйстаСкачать исходный код.


$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos

10.1 Запись Dockerfile

Сначала в корневом каталоге проекта создайте новый текстовый файл.dockerignore, напишите следующеесодержание.


.git
node_modules
npm-debug.log

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

Затем в корневом каталоге проекта создайте новый текстовый файл Dockerfile и напишите следующеесодержание.


FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000

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

  • FROM node:8.4: файл изображения наследует официальное изображение узла, двоеточие представляет метку, здесь метка8.4, который представляет собой версию 8.4 узла.
  • COPY . /app: Все файлы в текущем каталоге (кроме.dockerignoreисключенные пути), копируются в файл изображения/appсодержание.
  • WORKDIR /app: укажите следующий рабочий путь как/app.
  • RUN npm install:существует/appкаталог, запуститьnpm installкоманда для установки зависимостей. Обратите внимание, что после установки все зависимости будут упакованы в файл образа.
  • EXPOSE 3000: открыть порт контейнера 3000, чтобы разрешить внешние подключения к этому порту.

10.2 Создание файлов изображений

Если у вас есть Dockerfile, вы можете использоватьdocker image buildКоманда для создания файла изображения.


$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .

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

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


$ docker image ls

10.3 Создание контейнеров

docker container runКоманда сгенерирует контейнер из файла образа.


$ docker container run -p 8000:3000 -it koa-demo /bin/bash
# 或者
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

Значение каждого параметра приведенной выше команды следующее:

  • -pПараметр: порт 3000 контейнера сопоставляется с портом 8000 локальной машины.
  • -itПараметры: Оболочка контейнера сопоставляется с текущей оболочкой, а затем команды, которые вы вводите в локальном окне, будут переданы в контейнер.
  • koa-demo:0.0.1: имя файла изображения (если есть тег, вам также необходимо указать тег, по умолчанию используется последний тег).
  • /bin/bash: первая команда, которая будет выполняться внутри после запуска контейнера. Здесь нужно запустить Bash, чтобы убедиться, что пользователь может использовать оболочку.

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


root@66d80f4aaf1e:/app#

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


root@66d80f4aaf1e:/app# node demos/01.js

На данный момент платформа Koa уже запущена. Откройте браузер этой машины, посетите http://127.0.0.1:8000, веб-страница отображает «Не найдено», это из-за этогоdemoМаршрутизация не прописана.

В этом примере процесс Node работает в виртуальной среде контейнера Docker.Файловая система и сетевой интерфейс, с которыми контактирует процесс, являются виртуальными и изолированы от локальной файловой системы и сетевого интерфейса.Поэтому необходимо определить отношения между контейнером и физической машиной Сопоставление портов (карта).

Теперь в командной строке контейнера нажмите Ctrl + c, чтобы остановить процесс узла, затем нажмите Ctrl + d (или введите exit ), чтобы выйти из контейнера. Кроме того, вы также можете использоватьdocker container killЗавершите запуск контейнера.


# 在本机的另一个终端窗口,查出容器的 ID
$ docker container ls

# 停止指定的容器运行
$ docker container kill [containerID]

После того, как контейнер перестанет работать, он не исчезнет.Используйте следующую команду, чтобы удалить файл контейнера.


# 查出容器的 ID
$ docker container ls --all

# 删除指定的容器文件
$ docker container rm [containerID]

также можно использоватьdocker container runкоманда--rmпараметр для автоматического удаления файлов контейнера после закрытия контейнера.


$ docker container run --rm -p 8000:3000 -it koa-demo /bin/bash

10.4 Команды CMD

В примере из предыдущего раздела после запуска контейнера нужно вручную ввести командуnode demos/01.js. Мы можем прописать эту команду в Dockerfile, чтобы после запуска контейнера команда уже была выполнена, и не нужно было вводить ее вручную.


FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js

В приведенном выше Dockerfile добавлена ​​последняя строкаCMD node demos/01.js, что означает, что контейнер автоматически запускается после запускаnode demos/01.js.

Вы можете спросить,RUNкоманда сCMDВ чем разница между командами? просто скажи,RUNКоманда выполняется на этапе сборки файла образа, и результаты выполнения будут упакованы в файл образа;CMDКоманда выполняется после запуска контейнера. Кроме того, Dockerfile может содержать несколькоRUNкоманда, но только однаCMDЗаказ.

Обратите внимание, что указаниеCMDПосле команды,docker container runКоманды не могут быть присоединены к командам (таким как предыдущая/bin/bash), в противном случае перезаписываетсяCMDЗаказ. Теперь запустите контейнер с помощью следующей команды.


$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1

10.5 Публикация файлов изображений

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

Во-первых, перейдите кhub.docker.comилиcloud.docker.comЗарегистрируйте аккаунт. Затем войдите в систему с помощью команды ниже.


$ docker login

Затем отметьте имя пользователя и версию для локального образа.


$ docker image tag [imageName] [username]/[repository]:[tag]
# 实例
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

Вы также можете перестроить файл образа, не отмечая имя пользователя.


$ docker image build -t [username]/[repository]:[tag] .

Наконец, опубликуйте файл изображения.


$ docker image push [username]/[repository]:[tag]

После успешного выпуска войдите на hub.docker.com, и вы увидите выпущенный файл образа.

11. Другие полезные команды

Основное использование докера описано выше, и есть несколько очень полезных команд.

(1) запуск док-контейнера

фронтdocker container runКоманда состоит в том, чтобы создать новый контейнер.Каждый раз, когда она запускается, создается новый контейнер. Выполнение одной и той же команды дважды приведет к созданию двух идентичных файлов-контейнеров. Если вы хотите повторно использовать контейнер, используйтеdocker container startКоманда, которая используется для запуска файла контейнера, который был сгенерирован и остановлен.


$ docker container start [containerID]

(2) остановка док-контейнера

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


$ bash container stop [containerID]

Разница между этими двумя сигналами в том, что после того, как приложение получит сигнал SIGTERM, оно может выполнить отделочную работу самостоятельно, но может и игнорировать этот сигнал. Если получен сигнал SIGKILL, он будет немедленно принудительно завершен, и все выполняемые операции будут потеряны.

(3) журналы док-контейнера

docker container logsКоманда используется для просмотра вывода контейнера докера, то есть стандартного вывода Shell в контейнере. еслиdocker runКогда команда запускает контейнер, он не используется-itпараметры, используйте эту команду для просмотра вывода.


$ docker container logs [containerID]

(4) выполнение контейнера докеров

docker container execКоманда используется для входа в работающий контейнер Docker. еслиdocker runКогда команда запускает контейнер, он не используется-itпараметры, необходимо использовать эту команду для входа в контейнер. Оказавшись внутри контейнера, вы можете выполнять команды в оболочке контейнера.


$ docker container exec -it [containerID] /bin/bash

(5) док-контейнер cp

docker container cpКоманда используется для копирования файлов на локальный компьютер из работающего контейнера Docker. Ниже приведен метод записи копирования в текущий каталог.


$ docker container cp [containID]:[/path/to/file] .

(Заканчивать)