Выпускается с 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] .
(Заканчивать)