Усердно работать, а затем засыпать, кажется, нет никакой связи между «работой» и «мечтанием»; написание кода, а затем развертывание приложения, кажется, на противоположной стороне. Но так ли это на самом деле? Эта статья откроет Docker через «Начало», что позволит вам добиться существенного перехода от «мечты» к «строительству мечты». На исходном этапе «мечта» (ручная настройка и развертывание) все полно случайности и неконтролируемости, и вы иногда даже не можете вспомнить каждый шаг, который вы сделали; на этапе «строительства мечты» (с Docker) вы будете легко выполнять любые задачи по настройке и развертыванию автоматизированным, воспроизводимым и отслеживаемым образом. Я надеюсь, что после прочтения этой статьи вы тоже сможете стать отличным «Строителем мечты»!
Готов к работе
слова, написанные впереди
Многие друзья говорили нам, что «чашка чая» предназначена исключительно для того, чтобы одурачить людей, как это возможно читать во время чашки чая? На самом деле способ «пития чая» варьируется от человека к человеку, и у разных читателей разные ритмы. Вы можете выбрать десять строк за раз или даже просто просмотреть иллюстрации, и вы можете прочитать их за несколько минут; вы также можете следовать за нами шаг за шагом и даже остановиться и подумать в некоторых местах, хотя это занимает больше времени. время, но мы считаем, что затраты времени должны быть оправданы.
Во-вторых, мы хотим подтвердить, являетесь ли вы аудиторией этой статьи:
- Если вы уже являетесь специалистом по DevOps и ежедневно манипулируете тысячами контейнеров, простите за беспокойство, эта статья может показаться вам слишком упрощенной;
- Если вы уже знакомы с Docker и хотите получить больше практического опыта, эта статья поможет вам просмотреть и закрепить ключевые моменты знаний;
- Если вы только слышали о 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 молча делает за нас следующее:
- Проверить, является ли указанный локальный
hello-world:latest
зеркало (latest
это метка изображения, которая будет подробно рассмотрена позже), если нет, то переходим к шагу 2, в противном случае сразу переходим к шагу 3 - Локально не указано зеркало (невозможно найти xxx локально), изDocker Hubскачать на локальный
- согласно местным
hello-world:latest
Image создает новый контейнер и запускает в нем программу - После запуска контейнер закрывается и управление возвращается пользователю
Второй эксперимент: запустить сервер Nginx
Чувствуете себя слишком просто? Давайте попробуем продвинутый: запуститеNginx-сервер. выполните следующую команду
docker run -p 8080:80 nginx
После запуска вы обнаружите, что он завис и нет вывода, но будьте уверены, что ваш компьютер не сломался. Давайте откроем браузер, чтобы посетитьlocalhost:8080
:
В это время друзья, знакомые с Nginx, могут не усидеть на месте: достаточно простогоdocker run
Команда для установки и развертывания сервера Nginx? ? Да, вы можете по-прежнему получать доступ к некоторым несуществующим маршрутам, таким какlocalhost:8080/what
Это также будет подскажет 404. На этот раз мы смотрим на контейнер Dock Docker, есть контент (журналы сервера):
Подводя итог тому, что только что сделал Docker:
- Проверить, является ли указанный локальный
nginx:latest
зеркальное отображение (оlatest
метка, которая будет подробно рассмотрена позже), если нет, то переходим к шагу 2, иначе сразу переходим к шагу 3 - Локально не указано зеркало (невозможно найти xxx локально), изDocker Hubскачать на локальный
- согласно местным
nginx:latest
image создает новый контейнер,и через-p
(--publish
) параметр для установления сопоставления между портом 8080 машины и портом 80 контейнера., а затем запустить в нем программу - Программа сервера 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...
Изображение визуально бросается в глаза с первого взгляда и может даже заставить вас почувствовать себя ошеломленным. Ничего страшного, давайте примерно интерпретируем четыре типа элементов на этой картинке:
- состояние контейнера(цветной круг): включая «Создано», «Выполняется», «Приостановлено», «Остановлено» и «Удалено».
-
Докер-команды(стрелка выше
docker
начальный текст): включитьdocker run
,docker create
,docker stop
так далее -
мероприятие(прямоугольная рамка): в комплекте
create
,start
,die
,stop
а такжеOOM
(нет памяти) и так далее - Существует также условное суждение в соответствии с политикой перезапуска (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:
-
руководство: создайте и запустите контейнер на основе существующего образа, введите его, чтобы изменить, а затем запустите.
docker commit
команда для создания нового образа на основе измененного контейнера -
автоматический: создайте 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 .
Чтобы дать два классических сценария использования:
- Например, в веб-разработке создайте
Dockerfile.dev
Используется для создания образов разработки, созданияDockerfile.prod
Сборка образа в производственной среде; - При обучении модели ИИ создайте
Dockerfile.cpu
Для создания изображений, обученных с помощью ЦП, создайтеDockerfile.gpu
Создайте образ, обученный с помощью графического процессора.
Переосмыслите отношения между изображениями и контейнерами
Я полагаю, что после практики контейнеризации у вас появилось новое понимание взаимосвязи между изображениями и контейнерами. Пожалуйста, посмотрите на картинку ниже:
В предыдущем сеансе «Попробуйте» (отмечено зелеными стрелками) мы:
- пройти через
docker pull
Перетащите образ из репозитория образов Docker в локальный - пройти через
docker run
команда для создания и запуска контейнера из образа - пройти через
docker stop
и другие команды для управления контейнером для выполнения различных переходов между состояниями.
И в этом разделе контейнеризации в действии (отмечено красными стрелками) мы:
- пройти через
docker build
команда для создания образа из Dockerfile - пройти через
docker tag
команда, пометить изображение, получить новое изображение - (из-за нехватки места не указано) пройдено
docker commit
команда для преобразования существующего контейнера в образ
С видом на панораму: схема архитектуры Docker
Пришло время придумать классическую архитектурную схему Docker:
Как видите, Docker следует классической архитектуре клиент-сервер (клиент-сервер), а основные компоненты включают в себя:
- Сервер (также известный как демон Docker), который в системах Linux
dockerd
Заказ - REST API, предоставляемый сервером, предоставляет интерфейс для связи и работы с демоном.
- Клиент (то есть программа командной строки, которую мы использовали
docker
)
На этом краткое практическое руководство по Docker завершено, и я надеюсь, что у вас есть предварительное представление о концепции и использовании Docker. В будущем мы также опубликуем расширенный контент Docker (например, сетевую сеть, объем данных тома, Docker Compose и т. облачный хост (или любой компьютер, на который вы можете войти). Пожалуйста, с нетерпением ждите его ~
Хотите узнать больше интересных практических технических руководств? ПриходитьСообщество ТукеМагазин вокруг.