Время для чашки чая, начать работу с Docker

Docker
Время для чашки чая, начать работу с Docker

Усердно работать, а затем засыпать, кажется, нет никакой связи между «работой» и «мечтанием»; написание кода, а затем развертывание приложения, кажется, на противоположной стороне. Но так ли это на самом деле? Эта статья откроет Docker через «Начало», что позволит вам добиться существенного перехода от «мечты» к «строительству мечты». На исходном этапе «мечта» (ручная настройка и развертывание) все полно случайности и неконтролируемости, и вы иногда даже не можете вспомнить каждый шаг, который вы сделали; на этапе «строительства мечты» (с Docker) вы будете легко выполнять любые задачи по настройке и развертыванию автоматизированным, воспроизводимым и отслеживаемым образом. Я надеюсь, что после прочтения этой статьи вы тоже сможете стать отличным «Строителем мечты»!

Готов к работе

слова, написанные впереди

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

Во-вторых, мы хотим подтвердить, являетесь ли вы аудиторией этой статьи:

  1. Если вы уже являетесь специалистом по DevOps и ежедневно манипулируете тысячами контейнеров, простите за беспокойство, эта статья может показаться вам слишком упрощенной;
  2. Если вы уже знакомы с Docker и хотите получить больше практического опыта, эта статья поможет вам просмотреть и закрепить ключевые моменты знаний;
  3. Если вы только слышали о Docker, но принципиально им не пользуетесь, эта статья для вас! Просто дружеское напоминание:Докер немного сложен для начала, и вам нужно потратить достаточно времени, чтобы по-настоящему освоить его.Внимательно прочитав эту статью, вы обязательно добьетесь значительного прогресса..

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

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

Предварительные условия

Прежде чем официально читать эту статью, мы надеемся, что у вас есть следующее:

  • Базовый опыт командной строки
  • Иметь определенное представление о компьютерных сетях, особенно на уровне приложений.портконцепция
  • Лучше всего испытать мучительную борьбу с настройкой среды и развертыванием проекта 😭

чего мы добьемся

Теперь предположим, что у вас уже есть проект «список мечтаний», написанный на React, как показано на следующей анимации:

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

ты выучишь

В этой статье не будет...

Конечно, эта статья является вводным учебным пособием и не будет охватывать следующий расширенный контент:

  • Сетевой механизм Docker
  • Объем данных и Bind Mount реализуют обмен данными
  • Docker Compose
  • Многоэтапная сборка
  • Докер Станок
  • Технологии оркестрации контейнеров, такие как Kubernetes и Docker Swarm.

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

Установить Докер

Мы рекомендуем следующие способы установки Docker на каждую платформу (после повторного тестирования).

Windows

учебник для новичковРазличные рекомендуемые методы установки для Win7/8 и Win10 подробно описаны в . Обратите внимание, что Win10 рекомендует включить технологию виртуализации Hyper-V.

macOS

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

Linux

Для основных дистрибутивов Linux (Ubuntu, CentOS и т. д.) мы рекомендуем использовать для установки официальные скрипты, это удобно и быстро:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Затем рекомендуетсяdockerРазрешения передаются пользователям без полномочий root, поэтому используйтеdockerВам не нужно каждый разsudoсейчас:

sudo usermod -aG docker $USER

Он вступит в силу после выхода пользователя из системы или перезапуска. затем пройтиsystemdКонфигурация службы Запуск Docker:

sudo systemctl enable docker

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

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

Зеркала и вместилища: рисунки и мечты строителя грез

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

намекать

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

Малый измельчитель: с чего начинается мечта

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

Эксперимент 1: Привет, мир!

Следуя историческому соглашению, давайте запустим Hello World из Docker с помощью следующей команды:

docker run hello-world

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

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:fb158b7ad66f4d58aa66c4455858230cd2eab4cdf29b13e5c3628a6bfc2e9f05
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
...

Разве вы не можете просто напечатать строку и выйти, это так волшебно? На самом деле Docker молча делает за нас следующее:

  1. Проверить, является ли указанный локальныйhello-world:latestзеркало (latestэто метка изображения, которая будет подробно рассмотрена позже), если нет, то переходим к шагу 2, в противном случае сразу переходим к шагу 3
  2. Локально не указано зеркало (невозможно найти xxx локально), изDocker Hubскачать на локальный
  3. согласно местнымhello-world:latestImage создает новый контейнер и запускает в нем программу
  4. После запуска контейнер закрывается и управление возвращается пользователю

Второй эксперимент: запустить сервер Nginx

Чувствуете себя слишком просто? Давайте попробуем продвинутый: запуститеNginx-сервер. выполните следующую команду

docker run -p 8080:80 nginx

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

В это время друзья, знакомые с Nginx, могут не усидеть на месте: достаточно простогоdocker runКоманда для установки и развертывания сервера Nginx? ? Да, вы можете по-прежнему получать доступ к некоторым несуществующим маршрутам, таким какlocalhost:8080/whatЭто также будет подскажет 404. На этот раз мы смотрим на контейнер Dock Docker, есть контент (журналы сервера):

Подводя итог тому, что только что сделал Docker:

  1. Проверить, является ли указанный локальныйnginx:latestзеркальное отображение (оlatestметка, которая будет подробно рассмотрена позже), если нет, то переходим к шагу 2, иначе сразу переходим к шагу 3
  2. Локально не указано зеркало (невозможно найти xxx локально), изDocker Hubскачать на локальный
  3. согласно местнымnginx:latestimage создает новый контейнер,и через-p(--publish) параметр для установления сопоставления между портом 8080 машины и портом 80 контейнера., а затем запустить в нем программу
  4. Программа сервера Nginx продолжает работать, а контейнер не закрывается.

намекать

Формат правила сопоставления портов:<本机端口>:<容器端口>. Контейнер Nginx по умолчанию открывает порт 80, мы устанавливаем8080:80Доступ к правилам сопоставления портов можно получить локально (вне контейнера) с помощьюlocalhost:8080К нему можно получить доступ даже через IP-адрес интрасети в той же локальной сети, что будет продемонстрировано в конце этой статьи.

Эксперимент 3: запуск Nginx в фоновом режиме

Это выглядит круто, но для такого процесса, как сервер Nginx, мы бы предпочли оставить его работающим в фоновом режиме. Нажмите Ctrl + C, чтобы выйти из текущего контейнера, затем снова выполните следующую команду:

docker run -p 8080:80 --name my-nginx -d nginx

Обратите внимание, что в отличие от предыдущего, мы:

  • добавил параметр--name, используемый для указания имени контейнера какmy-nginx
  • добавил опцию-d(--detach), что означает "работает в фоновом режиме"

предупреждать

Имя контейнера должно быть уникальным, если контейнер с таким именем уже существует (даже если он больше не запущен), его не удастся создать. Если вы столкнулись с такой ситуацией, вы можете удалить ненужный ранее контейнер (как его удалить, будет объяснено позже).

Docker выводит длинную строку идентификаторов 64-битных контейнеров и возвращает нам управление терминалом. мы пытаемся посетитьlocalhost:8080, вы также можете увидеть знакомую надпись Welcome to nginx!, указывающую на то, что сервер действительно работает в фоновом режиме.

Так как же нам управлять этим сервером? как знакомый UNIXpsта же команда,docker psКоманда позволяет нам просмотреть состояние текущего контейнера:

docker ps

Вывод таков:

намекать

из-заdocker psВывод относительно широк.Если вы считаете, что результат не интуитивно понятен, вы можете удлинить терминал (командную строку), как показано на следующем рисунке:

Из этой таблицы мы можем ясно видеть некоторую информацию о нашем контейнере сервера Nginx, работающем в фоновом режиме:

  • Идентификатор контейнера0bddac16b8d8(может быть другим на вашей машине)
  • Используемое изображениеnginx
  • Запустите команду/программу (Command) какnginx -g 'daemon of..., это рабочая команда, которая поставляется с образом Nginx, пока не волнует
  • Создано 45 секунд назад (45 секунд назад)
  • Текущий статус (Статус) Up 44 секунды
  • Порты0.0.0.0:8080->80/tcp, что означает доступ к локальному0.0.0.0:8080Все запросы будут перенаправляться на TCP-порт контейнера 80.
  • Имена - это те, которые вы только что указалиmy-nginx

Если мы хотим остановить контейнер, передаемdocker stopКоманда указывает имя или идентификатор контейнера для работы, команда выглядит следующим образом:

docker stop my-nginx
# docker stop 0bddac16b8d8

Уведомление

Если вы укажете идентификатор контейнера, не забудьте заменить его реальным идентификатором на своем компьютере. Кроме того, при отсутствии конфликтов идентификатор может быть записан только несколькими первыми символами, например.0bdэто тоже хорошо.

Эксперимент 4: интерактивный запуск

После пристрастия к серверу Nginx давайте испытаем другой способ открыть контейнер Docker:работать в интерактивном режиме. Давайте войдем в образ Ubuntu, выполнив следующую команду:

docker run -it --name dreamland ubuntu

Вы можете видеть, что мы добавили-itвариант, который эквивалентен указанию обоих-i(--interactive, интерактивный режим) и-t(--tty, назначение аналогового терминала) два варианта. Вывод вышеуказанной команды выглядит следующим образом:

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
2746a4a261c9: Pull complete
4c1d20cdee96: Pull complete
0d3160e1d0de: Pull complete
c8e37668deea: Pull complete
Digest: sha256:9207fc49baba2e62841d610598cb2d3107ada610acd4f47252faf73ed4026480
Status: Downloaded newer image for ubuntu:latest
root@94279dbf5d93:/#

Подождите, как мы попали в новую командную строку? Правильно, теперь вы находитесь в «стране грез», созданной этим образом Ubuntu, и вы можете «ходить» по своему желанию и выполнять некоторые команды:

root@94279dbf5d93:/# whoami
root
root@94279dbf5d93:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

Например, мы запускаем вышеwhoamiа такжеlsКомандование, вы в принципе можете быть уверены, что находитесь сейчас в «мечте» (контейнере). Теперь откройте новый терминал (командную строку) и запуститеdocker psкоманда, чтобы увидеть образ Ubuntu в действии:

Вернувшись в предыдущий контейнер, нажмите Ctrl+D (или введитеexitкоманда) для выхода. вы можете проверить передdocker psТерминал дважды проверяет, закрыт ли контейнер.

Уничтожь контейнер: слушай звук разбитых снов

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

docker ps -a

-a(--all) используется для отображения всех контейнеров, если не добавлено, будет отображаться толькоБегконтейнер. Вы можете увидеть, что вывод выглядит следующим образом (здесь я расширил терминал для вашего удобства):

намекать

Вы могли заметить, что мы не указывали имя контейнера в предыдущих экспериментах 1 и 2, и Docker дал нам интересные имена контейнеров по умолчанию (такие какhardcore_nash), формат - случайное прилагательное плюс фамилия известного ученого/программиста (если повезет, вы можете увидеть отца LinuxtorvaldsОй).

Похоже на Шеллrmкоманда, мы можем пройтиdocker rmкоманда для уничтожения контейнера, например, удалить тот, который мы создали ранееdreamlandконтейнер:

docker rm dreamland
# 或者指定容器 ID,记得替换成自己机器上的
# docker rm 94279dbf5d93

Но что, если мы хотим уничтожить все контейнеры? Входить снова и сноваdocker rmУдалять явно неудобно, легко удаляется следующей командойВсе контейнеры:

docker rm $(docker ps -aq)

docker ps -aqВыведет идентификаторы всех контейнеров, а затем передаст их в качестве параметров вdocker rmкомандой, вы можете удалить все контейнеры в соответствии с их идентификаторами.

Опасность!

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

Воспоминания и сублимация

О сопоставлении портов

Возможно, некоторые учащиеся до сих пор не до конца понимают концепцию «сопоставления портов» с8080:80В качестве примера этого правила сопоставления мы можем использовать метафору «Портал», чтобы понять (на картинке ниже изображена обложка игры «Портал 2»):

Или сравните контейнер с «мечтой», а локальную среду с «реальностью» и получите доступ к локальному компьютеру, установив сопоставление портов.8080Запрос порта будет «доставлен» в контейнер80Порт, разве это не удивительно?

Жизненный цикл контейнера: карта мечты

После завершения вышеуказанных четырех небольших экспериментов у вас может возникнуть очень интуитивное ощущение и понимание контейнеров Docker. Пришло время придумать эту диаграмму жизненного цикла контейнера Docker из десяти (санг) точек (синь) священных писаний (бинг) (куанг) (источник:докер-Сайгон.GitHub.IO/post/docker...

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

  1. состояние контейнера(цветной круг): включая «Создано», «Выполняется», «Приостановлено», «Остановлено» и «Удалено».
  2. Докер-команды(стрелка вышеdockerначальный текст): включитьdocker run,docker create,docker stopтак далее
  3. мероприятие(прямоугольная рамка): в комплектеcreate,start,die,stopа такжеOOM(нет памяти) и так далее
  4. Существует также условное суждение в соответствии с политикой перезапуска (Restart Policy) для определения необходимости перезапуска контейнера.

Хорошо, эту картину все еще трудно понять сразу, но помните четыре небольших эксперимента, которые мы только что провели? На самом деле мы взяли в общей сложности два пути (и самые распространенные в повседневном использовании), и мы будем анализировать их один за другим.

первый путь (естественный конец)

Как показано на фиг.1:

  • давайте пройдемсяdocker runкоманду, непосредственно создать (создать) и запустить (запустить) контейнер, войти вРабочий статус(Бег)
  • Затем программа выполняется до конца (например, после вывода Hello World, или программа завершается по Ctrl+C), и контейнер умирает (умирает)
  • Поскольку мы не задавали стратегию перезапуска, мы перешли сразу ксостояние остановки(Остановлено)
  • наконец прошлоdocker rmЗаказать уничтожение контейнера, вудаленное состояние(удалено)

Второй путь (принудительный конец)

  • мы все еще проходимdocker runкоманду, непосредственно создать (создать) и запустить (запустить) контейнер, войти вРабочий статус(Бег)
  • затем пройтиdocker stopКоманда убивает программу в контейнере (die) и останавливает (stop) контейнер и, наконец, входит всостояние остановки(Остановлено)
  • наконец прошлоdocker rmкоманду уничтожить контейнер, введитеудаленное состояние(удалено)

намекать

Некоторые зоркие читатели могут обнаружить, чтоdocker killа такжеdocker stopочень похожи, с небольшими различиями:killКоманда напрямую выдает сигнал SIGKILL (или другой указанный сигнал) программе, работающей внутри контейнера, в то время какstopСначала выдается сигнал SIGTERM, а затем сигнал SIGKILL, который принадлежитизящное завершение работы(Изящное завершение работы).

Ярлык: удалить запущенные контейнеры

На самом деле есть короткий путь, который не показан на диаграмме жизненного цикла: непосредственно изБег(илиПауза)прибытьбыл удален, Даваяdocker rmкоманда плюс параметры-f(--force, принудительно) может быть достигнуто:

# 假设 dreamland 还在运行中
docker rm -f dreamland

Точно так же мы можем удалить все контейнеры, независимо от их состояния:

docker rm -f $(docker ps -aq)

бесплатно исследовать

Вы можете исследовать другие маршруты, которые мы не выбрали, например, попытаться снова запустить ранее остановленный контейнер (docker start) или приостановить работающий контейнер (docker pause). К счастью,docker helpКоманды могут дать нам компас для исследования, например, мы хотим знатьstartКак использовать команду:

$ docker help start

Usage:	docker start [OPTIONS] CONTAINER [CONTAINER...]

Start one or more stopped containers

Options:
  -a, --attach                  Attach STDOUT/STDERR and forward signals
      --checkpoint string       Restore from this checkpoint
      --checkpoint-dir string   Use a custom checkpoint storage directory
      --detach-keys string      Override the key sequence for
                                detaching a container
  -i, --interactive             Attach container's STDIN

Прочитав это, я думаю, вы узнали, как использовать существующие образы для создания контейнеров и управления ими. Далее мы познакомим вас с созданием собственного образа Docker и станем стандартным «строителем мечты»!

Первое применение контейнеризации: начните путь к строительству мечты

На предыдущих шагах мы видели образы, которые другие подготовили для нас заранее (например,hello-world,nginxа такжеubuntu), эти изображения доступны вDocker HubНайден в зеркальном репозитории. На этом этапе мы начнем путешествие по строительству своей мечты: узнаем, какконтейнерный(Контейнеризация) вашего приложения.

Как было сказано в начале, мы поместим в контейнер приложение «список мечты» с полным стеком, выполним следующие команды, чтобы получить код, а затем войдем в проект:

git clone -b start-point https://github.com/tuture-dev/docker-dream.git
cd docker-dream

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

Что такое контейнеризация

Контейнеризация состоит из трех этапов:

  • Написать код: Мы предоставили письменный код
  • построить образ: Это основное содержание этого раздела, которое будет подробно раскрыто ниже.
  • Создание и запуск контейнеров: Запускаем наше приложение как контейнер

построить образ

Существует два основных способа создания образа Docker:

  1. руководство: создайте и запустите контейнер на основе существующего образа, введите его, чтобы изменить, а затем запустите.docker commitкоманда для создания нового образа на основе измененного контейнера
  2. автоматический: создайте Dockerfile, укажите команду для сборки образа, а затем передайтеdocker buildкоманда для создания зеркала напрямую

Из-за ограниченного места в этой статье будут объясняться тольконаиболее широко используетсяВторой способ создания зеркала.

некоторые подготовительные работы

Давайте поставим фронтенд-проект на первое местоclientВстроить в статическую страницу. Убедитесь, что на вашем компьютере установлены Node и npm (нажмитездесьскачать или использоватьnvm), а затем перейти кclientкаталог, установите все зависимости и соберите проект:

cd client
npm install
npm run build

Через некоторое время вы должны увидетьclient/buildКаталог, в котором хранятся внешние статические страницы, которые мы хотим отобразить.

Создайте файл конфигурации Nginxclient/config/nginx.conf, код показан ниже:

server {
    listen 80;
    root /www;
    index index.html;
    sendfile on;
    sendfile_max_chunk 1M;
    tcp_nopush on;
    gzip_static on;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

Студентам, которые не знакомы с конфигурацией Nginx, не о чем беспокоиться, просто скопируйте и вставьте напрямую. Приведенная выше конфигурация примерно означает: слушайте порт 80, а корневой каталог веб-страницы находится в/www, файл домашней страницыindex.html, при доступе/предоставить документыindex.html.

Создать Dockerfile

А затем самый важный код на этом этапе: Dockerfile! Создайтеclient/Dockerfileфайл, код такой:

FROM nginx:1.13

# 删除 Nginx 的默认配置
RUN rm /etc/nginx/conf.d/default.conf

# 添加自定义 Nginx 配置
COPY config/nginx.conf /etc/nginx/conf.d/

# 将前端静态文件拷贝到容器的 /www 目录下
COPY build /www

Вы можете видеть, что мы использовали три инструкции в Dockerfile:

  • FROMИспользуется для указания базового изображения, здесь мы основываемся наnginx:1.13Изображение как отправная точка для сборки
  • RUNкоманда используется для запуска любой команды внутри контейнера (при условии, что команда должна существовать, конечно)
  • COPYКоманда используется для копирования файлов из каталога, в котором находится Dockerfile, по пути, указанному контейнером.

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

# 如果你已经在 client 目录中
#(注意最后面有个点,代表当前目录)
docker build -t dream-client .

# 如果你回到了项目根目录
docker build -t dream-client client

Вы можете видеть, что мы указали-t(--tag, этикетка контейнера) естьdream-client, и, наконец, укажите контекстный каталог контейнера сборки (то есть текущий каталог.илиclient).

Выполнив указанную выше команду, вы обнаружите:

Sending build context to Docker daemon:66.6MB

И это число продолжает расти, как сцена в научно-фантастическом фильме о хакерах, и, наконец, оно должно остановиться на отметке 290 МБ. Затем выполните серию шагов (4), а затем запросите успешное построение образа.

Почему этот контекст сборки такой большой? Потому что мы также добавили node_modules, которые «тяжелее», чем «черная дыра»! (Не могу не вспомнить картинку ниже)

Используйте .dockerignore, чтобы игнорировать нежелательные файлы

Docker предоставляет механизм, похожий на .gitignore, который позволяет нам игнорировать определенные файлы или каталоги при создании образа. Создайтеclient/.dockerignoreФайл (обратите внимание на точку перед dockerignore ):

node_modules

Все просто, мы просто хотим игнорировать ужасные node_modules. Запустите команду сборки еще раз:

docker build -t dream-client .

Здорово! На этот раз это всего 1,386 МБ, и это значительно быстрее!

запустить контейнер

Наконец, последний шаг контейнеризации — создание и запуск нашего контейнера! Запустите созданный с помощью следующей командыdream-clientЗеркало:

docker run -p 8080:80 --name client -d dream-client

Как и раньше, мы по-прежнему устанавливаем правило сопоставления портов как8080:80, имя контейнераclient, и через-dУстановите для работы в фоновом режиме. затем посетитеlocalhost:8080:

Это сработало! Три мечты, поставленные в начале, также сбылись!

намекать

Даже мы уже можем получить доступ к «списку желаний» через интранет. Студенты Linux или macOS могут печатать в терминалеifconfigКоманда для запроса IP-адреса локальной сети, студенты Windows вводят его в CMDipconfigЗапрос IP-адреса внутренней сети машины, обычно с помощью10,172.16~172.31или192.168начало. Например, мой внутренний IP-адрес192.168.0.2, то в той же локальной сети (обычно WiFi) вы можете использовать другие устройства (например, мобильный телефон) для доступа192.168.0.2:8080.

Воспоминания и сублимация

О зеркальных этикетках

Только что в реальном бою вы, возможно, заметили, что при извлечении и создании образов Docker всегда добавляет:latestэтикетка, это:latestЗначение является «последним» значением. Подобно механизму управления версиями программного обеспечения, изображения также могут быть «управлены версиями» с помощью тегов.

Уведомление

latestБуквально это означает «последний», но это просто общий ярлык, который не гарантирует, что он действительно «последний».не будет обновляться автоматически. Для более подробного обсуждения см.эта статья.

На самом деле вполне возможно указать теги при извлечении или создании изображения (обычно это считается хорошей практикой):

docker pull nginx:1.13
docker build -t dream-client:1.0.0

Вы также можете пометить существующие изображения:

# 把默认的 latest 镜像打上一个 newest 标签
docker tag dream-client dream-client:newest
# 甚至可以同时修改镜像的名称和标签
docker tag dream-client:1.0.0 dream-client2:latest

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

О Dockerfiles

Dockerfile на самом деле имя по умолчанию, мы, конечно, можем взять другое имя, напримерmyDockerfile, а затем указать при построении образа-f(--file) Параметры могут быть:

docker build -f myDockerfile -t dream-client .

Чтобы дать два классических сценария использования:

  1. Например, в веб-разработке создайтеDockerfile.devИспользуется для создания образов разработки, созданияDockerfile.prodСборка образа в производственной среде;
  2. При обучении модели ИИ создайтеDockerfile.cpuДля создания изображений, обученных с помощью ЦП, создайтеDockerfile.gpuСоздайте образ, обученный с помощью графического процессора.

Переосмыслите отношения между изображениями и контейнерами

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

В предыдущем сеансе «Попробуйте» (отмечено зелеными стрелками) мы:

  1. пройти черезdocker pullПеретащите образ из репозитория образов Docker в локальный
  2. пройти черезdocker runкоманда для создания и запуска контейнера из образа
  3. пройти черезdocker stopи другие команды для управления контейнером для выполнения различных переходов между состояниями.

И в этом разделе контейнеризации в действии (отмечено красными стрелками) мы:

  1. пройти черезdocker buildкоманда для создания образа из Dockerfile
  2. пройти черезdocker tagкоманда, пометить изображение, получить новое изображение
  3. (из-за нехватки места не указано) пройденоdocker commitкоманда для преобразования существующего контейнера в образ

С видом на панораму: схема архитектуры Docker

Пришло время придумать классическую архитектурную схему Docker:

Как видите, Docker следует классической архитектуре клиент-сервер (клиент-сервер), а основные компоненты включают в себя:

  • Сервер (также известный как демон Docker), который в системах LinuxdockerdЗаказ
  • REST API, предоставляемый сервером, предоставляет интерфейс для связи и работы с демоном.
  • Клиент (то есть программа командной строки, которую мы использовалиdocker)

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

Хотите узнать больше интересных практических технических руководств? ПриходитьСообщество ТукеМагазин вокруг.