Прошло 9102 года, а вы до сих пор не знаете Докера? 10 минут, чтобы перейти от ознакомительной операции к реальному бою

Docker

Коротко о докере

Docker — это технология виртуализации ОС и механизм контейнера приложений с открытым исходным кодом. Это позволяет разработчикам упаковывать приложения в портативный контейнер, и контейнер может работать практически на всех системах Linux (Windows 10 в настоящее время поддерживается изначально, а до Win10 требуется встроенная виртуальная машина), что является так называемым «пакетом». один раз беги везде" ".

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

Многие люди не понимают, в чем разница между Docker и виртуальной машиной.

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

Размер образа Docker составляет от десятков М до сотен М. Как правило, образ упаковывает только одно приложение, а полный проект состоит из нескольких образов. сделать проект Управление развертыванием стало более гибким. Итак, Docker опережает виртуальные машины с точки зрения потребления ресурсов, управления и использования, так почему же мы не используем такую ​​технологию контейнеризации?

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

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

  • Многоофисная среда, развертывание в один клик. Если у вас есть среда разработки в компании и среда разработки дома, то при изменении среды разработки вашей компании соответственно изменится и среда дома.Если вы используете Docker, вы можете использовать некоторые зависимые приложения, такие как Redis, ZK , Mysql и другие пограничные службы упакованы в Docker. Независимо от того, где вы меняете содержимое, если вы обновляете образ во время выполнения, вы можете выполнить его в соответствии с последним содержимым, и вам не требуется ручная установка и адаптация.
  • Совместный отладочный тест, не полагаясь на других. Когда серверная часть завершит работу с внешним интерфейсом, упакуйте внутреннюю часть приложения в докер, чтобы вы могли запустить контейнер для совместной отладки и тестирования, независимо от того, является ли он интерфейсной частью, тестирования в любом месте без необходимости вручную шаг за шагом создайте эту внутреннюю среду.
  • ...

Ниже приводится пошаговое объяснение знаний Docker, необходимых для обычной разработки.

Введение концепции

Чтобы изучить Docker, вы должны сначала понять следующие основные понятия:

  • Host, Host, физическая машина, на которой работает Docker, — это системная среда, в которой работает Docker.
  • Изображение, Image, эквивалентно шаблону программы, посредством которого можно сгенерировать множество подобных контейнеров. Его можно понимать как класс в Java, который сам по себе не имеет возможности исполняться и запускаться и является абстрактным шаблоном объекта. Каждое изображение может иметь несколько версий, которые различаются тегами. Образы можно создавать с помощью Dockerfile.
  • Контейнер, Контейнер, наименьший модульный объект, в котором работает Docker. Это исполняемый объект, созданный из изображения. Можно отправить изменения в контейнер, чтобы отреагировать на изображение и обновить шаблон контейнера.
  • Репозиторий, репозиторий, представляет собой репозиторий для хранения изображений и управления ими, аналогичный репозиторию git для управления кодом, и может управлять несколькими версиями изображений.

Отношения между образами, контейнерами и складами следующие:

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

Основная операция

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

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

пройти черезdocker pull ${image_uri}:${image_tag}командой, вы можете получить нужный образ из удаленного репозитория (по умолчанию Docker Hub).

существуетDocker HubВы можете найти нужное вам зеркало и версию на сайте. Например Ubuntu, несколько версий приведены выше.

давай потянем16.04версия зеркала ubuntu. затем пройтиdocker imagesкоманда для просмотра образа, сохраненного в локальном, и найденного дополнительного образа ubuntu.

Создание контейнера, запуск, остановка, вход

После того, как у вас есть зеркало, вы можете пройтиdocker run -it ${image_id}Создайте и запустите контейнер.

image_idэто идентификатор зеркала черезdocker imagesЕго можно просмотреть или это может быть имя изображения (REPOSITORY:TAG).

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

exitПосле выхода из контейнера контейнер автоматически останавливается. Но контейнер все еще существует, он просто «закрыт». (способен пройтиctrl+p,ctrl+q, выйти из контейнера, не закрывая контейнер)

пройти черезdocker ps -aВы можете видеть, что наш контейнер имеетExited.

пройти черезdocker start ${container_id}, мы снова запускаем контейнер. пройти черезdocker ps(добавитьВключая контейнер, показывающий, что он не запущен), вы можете видеть, что статус контейнераВВЕРХ*.

Точно так же мы можем пройтиdocker stop ${container_id}остановить контейнер,

С использованиемdocker startПри использовании команды, если параметр *-a* не добавлен, контейнер по умолчанию не будет подключен. Однако после запуска мы можем пройтиdocker attach ${container_id}войти в контейнер.

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

обновить зеркало

В приведенном выше примере то, что мы вытащили, — это просто исходный образ ubuntu, и контента не так уж много. Далее устанавливаем jdk в контейнер этого образа.

Таким образом, в нашем контейнере есть jdk, но если мы используем этот исходный образ ubuntu для создания другого контейнера, он не будет использовать этот jdk. Итак, нам нужно передать содержимое этого контейнера в образ.

пройти черезdocker commit ${container_id} ${repository}:${tag}, отправьте содержимое контейнера в образ локально. Тогда у вас может быть образ ubuntu с jdk.

Позже мы можем использовать этот образ для создания контейнера с помощью jdk.

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

зеркальный репозиторий

Как упоминалось выше, репозиторий по умолчанию использует Docker Hub. Наши pull и push работают в Docker Hub, но если образ предназначен для внутреннего частного использования, нет необходимости использовать Docker Hub, один из них — медленная сеть, а другой — частные проблемы с безопасностью.

Есть два решения вышеуказанных проблем: одно — создать частную службу самостоятельно, а другое — использовать платформу управления образами облачных служб (например, «Container Image Service» от Alibaba Cloud). Первый не нужен обычным разработчикам, и его нужно сертифицировать, что более хлопотно, поэтому я не буду здесь вдаваться в подробности. Ниже описано, как использовать сервисы Alibaba Cloud в качестве собственного частного хранилища.

Сначала создайте хранилище образов в облаке Alibaba Cloud и получите адрес склада, напримерregistry.cn-shenzhen.aliyuncs.com/zackku/jdk. Вот адрес склада, соответствующий изображению (с разными тегами).

использоватьdocker login, сначала войдите в сервисы Alibaba Cloud.

Затем пометьте приведенный выше образ jdk (по сути, это тоже процесс смены источника хранилища)

Наконец, отправьте образ в Alibaba Cloud.

После нажатия вы можете увидеть изображение на складе Alibaba Cloud.

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

Образ сборки Dockerfile

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

Dockerfile может очень хорошо решить эту проблему. Он может создавать образы в одном месте, написав процесс сборки. Далее также используется ubuntu в качестве базового образа и устанавливается jdk для создания нового образа в качестве примера, чтобы увидеть, как пишется Dockerfile.

затем выполнитьdocker build -t registry.cn-shenzhen.aliyuncs.com/zackku/jdk2:1.0 .Образ можно построить.

Расширенные советы по Dockerfile

Выше приведено основное использование Dockerfile, но на практике мы не собираем образ так (или не только), как описано выше. Два общих принципа использования описаны ниже.

Слоистая конструкция. На самом деле образ Docker иерархичен.Оглянитесь на пример отправки на удаленный склад раньше.

Внутри красной рамки находится представление зеркала слой за слоем.Если этот слой был построен локально, его не нужно строить в следующий раз.Так же, если на удаленном конце уже есть этот слой, нет необходимости проталкивать это слой. И это многоуровневое отображение может быть общим для разных зеркал.Например, разные Java-проекты зависят от операционной среды JDK, поэтому они могут совместно использовать содержимое зеркальных слоев JDK.

Поэтому, исходя из таких характеристик, мы должны строить изображения слоями и абстрагироваться от общих точек изображений. Для конкретных операций мы можем примерно построить образ в два этапа: сначала создать базовый образ для нижнего слоя различных образов, таких как все основные операционные среды проектов Java, а затем использовать базовый образ для построения образа приложения на поверхность разв. Это эквивалентно упаковке приложения и переносу его на уровень разработки. И этот уровень сообщает Docker, как запускать программу.

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

Что касается операционной системы, я использовал ubuntu в качестве базы выше, это избыточно.Рекомендуется использовать только операционную систему apline в качестве нижнего образа программы.Это облегченный дистрибутив Linux, а размер системы и потребление ресурсов во время выполнения довольно низкие, идеально подходят для контейнеров Docker. На основе операционной системы apline мы добавляем на нее нужное нам окружение, например установку Tomcat, JDK и т.д., для сборки базового образа.

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

Насчет того, как написать Dockfile и какой у него синтаксис, в интернете есть куча подробных инструкций, из-за нехватки места я не буду здесь его расширять.

docker-compose запускает кластер

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

Рекомендуется использовать официальный docker-compose Docker, который может записывать все конфигурации контейнеров в файл, а затем передаватьdocker-compose upКоманда, вы можете запустить набор контейнеров в соответствии с вашей договоренностью.

в этом примереservicesСодержит конфигурацию каждого контейнера, среди которых redis и mongodb используют образ по умолчанию и конфигурацию по умолчанию, а myproject — это наш собственный проект. Благодаря этому мы можем подключить наш проект к Redis и mongodb. наконец прошлоdocker-compose upЗеркало будет автоматически вытягиваться и работать в соответствии с договоренностью.

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


Для получения дополнительных технических статей и замечательных сухих товаров, пожалуйста, обратите внимание
Блог:zackku.com
Публичный аккаунт WeChat: Зак сказал код