Docker: привязываем порты

Дополнительная информация

Ниже приведены несколько часто используемых полезных команд Docker Compose.

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

$ docker-compose down

Ознакомиться с журналами сервисов можно выполнив команду:

$ docker-compose logs -f 

Посмотреть список используемых сервисов можно командой (на примере данного проекта):

$ docker-compose ps

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

$ docker-compose exec  

Увидеть в терминале список образов можно, введя команду:

$ docker-compose images

Что такое Composefile?

Composefile используется в двух типах развертываний: в некластерном развертывании с помощью docker-compose и кластерном развертывании с docker swarm.

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

Компоновка файлов – это часть инструмента, называемого docker-compose. Это клиентское приложение для сервера демона докеров, что-то вроде docker клиента CLI, но вместо того, чтобы каждый раз запускать все команды docker-compose, вы можете повторно использовать один и тот же файл YAML снова и снова и развертывать один и тот же контейнер с тем же конфигурация, как и в первый раз.

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

Поддержка файла Compose будет частью клиента докеров по умолчанию, который написан на Go в качестве аргумента командной строки «docker compose». Обратите внимание на отсутствующий дефис. Это все еще экспериментально, поэтому в производстве по-прежнему рекомендуется использовать версию Python, т.е. docker-compose.. Давайте возьмем предыдущий образ и развернем его, используя файл набора

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

version: "3.3"

services:
    fortune:
        image: "fortune:alpine"

Сохраните файл как docker-compose.yml. Теперь запустите в том же каталоге следующую команду

docker-compose up

Вы не должны сохранить файл как docker-compose.yml, вы можете сохранить его, как вам нравится, но если это не так, docker-compose.yml или docker-compose.yaml, убедитесь, что вы используете опцию -f .

docker-compose -f docker-compose.yml up

Подождите и посмотрите, что произойдет.

Что такое файл стека?

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

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

Сначала инициализируйте кластер.

docker swarm init

Затем запустите команду, подобную следующей

docker stack deploy -c docker-compose.yml fortune

При таком развертывании необходимо проверить вывод, просмотрев журналы службы с помощью docker service logs ….

build

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

Это также может быть относительный путь, если контекст определен, файл Docker может быть прочитан.

Задайте корневой каталог контекста, а затем укажите файл Docker на основе этого каталога.

Обратите внимание, что build — это каталог. Если вы хотите указать Dockerfile, вам нужно использовать тег dockerfile в дочерних тегах тега build, как в примере выше

Если вы укажете как изображение, так и теги сборки, Compose создаст изображение и назовет его после изображения.

Поскольку задача сборки может быть определена в docker-compose.yml, тег arg должен быть обязательным. Как и инструкция ARG в Dockerfile, он может указывать переменные среды в процессе сборки, но может быть отменен после успешной сборки. Файл yml также поддерживает эту запись:

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

В отличие от ENV, ARG допускает нулевые значения. Например:

Таким образом, процесс сборки может присваивать им значения.

Для macOS и Windows

Docker v 18.03 и выше (с 21 марта 2018 года)

Используйте свой внутренний адрес IP или подключитесь к специальному имени DNS , которое будет преобразовано в внутренний адрес IP, используемый хостом.

Поддержка Linux до https://github.com/docker/for-linux/issues/264

MacOS с более ранними версиями Docker

Docker для Mac в 17.12 к V 18.02

То же самое, что и выше, но вместо этого используйте .

Docker для Mac от v 17.06 до v 17.11

То же самое, что и выше, но вместо этого используйте .

Docker для Mac 17.05 и ниже

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

Затем убедитесь, что ваш сервер прослушивает IP, упомянутый выше, или . Если он слушает на localhost , он не примет соединение.

Затем просто наведите свой контейнер docker на этот IP, и вы сможете получить доступ к хост-машине!

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

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

Решение и дополнительная документация здесь: путей

DNS services

By default, a container inherits the DNS settings of the host, as defined in the
configuration file. Containers that use the default
network get a copy of this file, whereas containers that use a

use Docker’s embedded DNS server, which forwards external DNS lookups to the DNS
servers configured on the host.

Custom hosts defined in are not inherited. To pass additional hosts
into your container, refer to
in the reference documentation. You can override these settings on
a per-container basis.

Flag Description
The IP address of a DNS server. To specify multiple DNS servers, use multiple flags. If the container cannot reach any of the IP addresses you specify, Google’s public DNS server is added, so that your container can resolve internet domains.
A DNS search domain to search non-fully-qualified hostnames. To specify multiple DNS search prefixes, use multiple flags.
A key-value pair representing a DNS option and its value. See your operating system’s documentation for for valid options.
The hostname a container uses for itself. Defaults to the container’s ID if not specified.

Отличия

– приложение, реализованное на языке . Изначально существовал проект под названием , который использовался, чтобы анализировать файлы для создания стеков контейнеров Docker. Проект был довольно популярным, особенно среди тех, кто работает с Docker, поэтому команда Docker решила создать свою собственную версию, основанную на . Они назвали свою новую разработку Docker Compose. Она также создана на Python и работает на базе Docker Engine. Внутри Docker Compose используется Docker API для создания контейнеров в соответствии со спецификацией. Чтобы использовать с Docker на вашей машине, вам придется установить его отдельно.

Функциональность реализована внутри Docker, поэтому для его использования не нужно устанавливать дополнительные пакеты. Развертывание стеков контейнеров является частью режима swarm. Docker Stack поддерживает те же файлы compose, но их обработка производится внутри ядра Docker. Прежде, чем использовать команду stack, необходимо создать “рой” из одной машины, но это не является проблемой.

Есть некоторые различия между Docker Compose и Docker Stack:

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

Спецификация. Также, есть части спецификации файла compose, которые игнорируются командой или командой . Например, игнорирует свойство , а игнорирует . Есть и другие .

Версии. не поддерживает файлы , оформленные согласно спецификации версии 2. Версия должна быть последней, на момент написания данной статьи это была версия 3. А может без проблем работать с версиями 2 и 3.

Начнём с контейнера Nginx Docker

Ничего страшного, если вы ничего не знаете о Docker. Я попробую подробно всё объяснить. Во-первых, мне нужно убедиться, что вы понимаете разницу между контейнером Docker и образом Docker.

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

Мы все устанавливали программы на Windows, Mac или Linux. Когда программе чего-то не хватает, она сообщает об этом и всё. Это раздражает. Наверное, можно тоже просто установить её, да? Тогда не хотите ли вы установить и эту программу? Ох… В конце концов вы получаете множество программ. При этом часто нужно настроить системные переменные и так далее. В худшем случае это может повредить систему. Вы же не хотите, чтобы все ваши коллеги прошли через это? Так вот, образ Docker содержит все необходимое для установки программы, а контейнер Docker  —  это запущенный экземпляр образа.

Итак, Docker решает проблему установки. Контейнер содержит все необходимое для работы и ничего больше. Вы можете запустить его на Windows, Linux или Mac и, в принципе, везде, где установлен Docker. Но хватит о преимуществах. Мы здесь для того, чтобы поднять и запустить контейнер.

Давайте, наконец, начнём с Nginx Docker. Nginx  —  это веб-сервер, работающий на 80 порту. Я сразу же запущу контейнер Docker (в отсоединенном режиме), используя образ Nginx Docker:

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

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

 —  Но почему? В Docker-файле говорится, что порт 80 открыт… я его не понимаю. 

 —  Не волнуйтесь, я объясню это в следующей части статьи!

Немного теории ¶

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

Именно на идеи изоляции процесса построена основная часть логики докера. Контейнер работает, пока работает начальный процесс (его называют entry point или command). Как только процесс завершается, контейнер останавливается. Это ключевое отличие докера от привычных виртуальных машин (вроде VirtualBox).

Благодаря изоляции процессов, на одной машине можно запускать много версий приложения, которое в обычных условиях будет конфликтовать. Например, можно запустить сразу MySQL 8 и MySQL 5, nodejs 8 и nodejs 10. Без докера сделать это тоже можно, но проблематичней.

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

Exposing vs publishing a port in Docker

There are two ways to handle ports in Docker: exposing the ports and publishing the ports.

Exposing a port simply means letting others know on which port the containerized application is going to be listening on, or accepting connections on. This is for communicating with other containers, not with the outside world.

Publishing a port is more like mapping the ports of a container with ports of the host. This way, the container is able to communicate with external systems, the real world, the internet.

This graphics will help you understand.

You see, how the SERVER container’s port 80 is mapped to the port 80 of the host system? This way, the container is able to communicate to the outside world using the public IP address of the host system.

The exposed ports, on the other hand, cannot be accessed directly from outside the container world.

To remember:

  • Exposed ports are used for internal container communication, within the container world.
  • Published ports are used for communicated with systems outside the container world.

Как использовать ресурсы контейнера ¶

По умолчанию контейнер закрыт от любых контактов извне. Вы не можете ни скопировать в него файл, ни подключиться к сокету. Он закрыт. Но при запуске контейнера можно пробросить порт или папку. Тогда к нему можно будет подключиться, добавить файл или что-то скачать. Всё это делается при создании (запуске) контейнера через аргументы.

Проброс портов

Для примера запустим контейнер с Debian 9 и пробросим локальный порт 3132 на 80 порт контейнера:

Пояснения к команде:

  • — создаёт и запускает новый контейнер.
  • — подключает виртуальную консоль. Это нужно, чтобы команда не завершала работу, иначе контейнер остановится.
  • — запускает выполнение контейнера в фоне. Без этого аргумента консоль будет ждать, когда контейнер остановится (для остановки придётся использовать другую консоль).
  • — использовать в качестве процесса системную утилиту . Просто потому, что она не завершится пока не закроется stdin, а значит и контейнер будет работать.
  • — уникальное имя, которое используется для управления контейнером. Если его не указывать, то докер сам придумает какое-нибудь имя.
  • — проброс портов. Сначала надо указать порт машины (можно указать вместе с IP), потом порт в контейнере.

Общий принцип запуска контейнеров довольно простой:

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

Теперь давайте рассмотрим, как выполнять команды внутри контейнера. Для примера установим и запустим консольный сервер php 7:

Пояснения к команде:

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

Чтобы проверить, работает сервер или нет, нужно подключиться на 3132 порт основной машины, например так:

В этом примере я использовал две разные консоли. На одной я запускал сервер, а на другой curl. Ещё можно использовать браузер, если докер установлен у вас в системе.

Проброс папки

В предыдущем примере я создал index.php прямо в контейнере. Это не самый удобный способ разработки проектов в через докер. Во-первых, много файлов так не создашь, во-вторых ими сложно управлять, а, в-третьих, если удалить контейнер, они тоже удалятся. Чтобы решить эти проблемы, можно пробросить (примонтировать) папку из реальной машины в виртуальный контейнер. Делается это, как всегда, при создании контейнера, через аргумент .

Прежде, чем начать что-то менять, надо удалить старый контейнер:

Теперь подготовим наш «проект»:

А теперь запускаем контейнер с пробросом папки проекта:

Если вы помните, я удалил контейнер, в котором был установлен php, а это значит, что мне заново придётся установить пакет php7.0-cli:

Теперь в контейнере есть и проект, и php, можно запускать сервер:

Теперь проверяем, как работает наш проект:

Для наглядности давайте создадим ещё один файл в «проекте», чтобы удостовериться, что всё работает как надо:

Должно вывести что-то вроде этого:

Если у вас получилось, смело пишите в резюме, что владеете докером!

6 ответов

Лучший ответ

Короткий ответ:

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

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

  • получит весь контейнер: как снимок обычной виртуальной машины. Сохраняет, конечно, ОС, но также и любые внесенные вами изменения, любой файл данных, записанный в течение срока службы контейнера. Этот больше похож на традиционную резервную копию.

    Это даст вам плоский архив .tar, содержащий файловую систему вашего контейнера.

Изменить: поскольку мое объяснение все еще может привести к путанице, я думаю, что важно понимать, что одна из этих команд работает с контейнерами, а другая — с изображениями

  • Изображение следует рассматривать как «мертвое» или неизменяемое, поскольку начало от него 0 или 1000 контейнеров не изменит ни одного байта. Вот почему я сравнил систему с установкой ISO ранее. Возможно, это даже ближе к live-CD.

  • контейнер «загружает» изображение и добавляет поверх него дополнительный слой. Этот слой хранит любые изменения в контейнере (созданные / измененные / удаленные файлы …).

180

Miguel Mota
11 Июн 2015 в 21:12

Docker save создает репозиторий tar-файла, который содержит все родительские слои и все теги + версии или указанный тег repo: tag для каждого аргумента, предоставленного из изображения .

Docker export Создает указанный файл (может быть tar или tgz) с плоским содержимым без содержимого указанных томов из Контейнера .

Докер сохранить необходимо использовать в образе докера, а докер экспорт необходимо использовать в контейнере (как и в запущенном образе)

Сохранить использование

Экспорт Использование

1

Sachin Gade
1 Фев 2016 в 11:00

: -> . : -> . Только один слой.

: -> . : -> . Все слои будут восстановлены.

Из Docker в действии, второе издание p190.

2

youngsend
12 Июл 2020 в 12:07

Технически, save / load работает с репозиториями, которые могут быть одним или несколькими изображениями, также называемыми слоями. Изображение — это один слой в репо. Наконец, контейнер — это созданный образ (запущенный или нет).

3

fatherlinux
2 Окт 2014 в 00:58

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

Сохраненное изображение будет содержать информацию о слое и истории, поэтому оно будет больше.

Если вы даете это клиенту, вопрос в том, хотите ли вы сохранить эти слои или нет?

5

Neil McGill
30 Мар 2015 в 20:59

Есть два основных различия между командами и .

  1. Команда сохраняет все изображение с историей и метаданными, но команда экспортирует только структуру файлов (без истории и метаданных). Таким образом, экспортированный tar-файл будет меньше сохраненного.

  2. Когда вы используете экспортированную файловую систему для создания нового образа, этот новый образ не будет содержать никаких команд , , и т. Д. Из вашего Dockerfile. Будет передана только файловая структура. Поэтому, когда вы используете упомянутые ключевые слова в своем Dockerfile, вы не можете использовать команду экспорта для передачи изображения на другой компьютер — вам всегда нужно использовать команду сохранения.

27

tgogos
11 Дек 2018 в 12:45

docker run —network=»bridge» (по умолчанию)

Docker создает мост с именем по умолчанию. И хост docker, и контейнеры docker имеют адрес IP на этом мосту.

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

Итак, здесь мой хост docker имеет адрес IP на сетевом интерфейсе .

Теперь запустите новый контейнер и получите на нем shell: и внутри контейнера тип , чтобы узнать, как настроен его основной сетевой интерфейс:

Здесь мой контейнер имеет адрес IP . Теперь взгляните на таблицу маршрутизации:

Таким образом, IP-адрес узла docker устанавливается в качестве маршрута по умолчанию и доступен из вашего контейнера.

Publishing a port in Docker

Port publishing is a synonym for port forwarding where the requests from an incoming connection on a public port is forwarded to the container’s port.

Similarly, the responses sent from the container through its port is sent to the client by forwarding the traffic to the the specified port in the host’s port space.

There are two ways of publishing a port, one through the CLI and another using a compose file. Both methods also have one long syntax and one short syntax.

Method 1: Publish ports via Docker command

The two syntaxes are as follows:

You’re going to use the first one the most. The second one is more readable. Let’s see an example using an nginx container. Run the following command:-

With this command I’m simply binding the container’s port 80 to my host’s 8081 port on localhost. Now if you head over to http://localhost:8081 you’ll see nginx running.

The previous command can be easily converted to the shorter form like so

Although it’s shorter, it’s harder to read.

You can also use or multiple times to publish multiple ports.

Method 2: Publishing a port through a compose file

To publish a port using a compose file you’ll need an array named in the service definition. This array can be a list of strings which looks similar to the short syntax of the CLI, or you can use a list of objects which is similar to the long syntax.

If I were to convert the previous nginx deployment using a compose file with an array of strings for the ports section it’d look like the following:-

Let me also show how to use the array of objects syntax.

To see the list of all published ports, you can inspect the container like so-

If run you’ll see the following output:-

There is another, an easier way to list the published ports, using the command.

Example output:-

5.depends_on

При использовании Compose самое большое преимущество состоит в том, что требуется меньше команд запуска, но требуется общий порядок запуска контейнера проекта. Если вы запустите контейнер напрямую сверху вниз, он неизбежно потерпит неудачу из-за проблем с зависимостью от контейнера. Например, контейнер приложения запускается, когда контейнер базы данных не запускается. В настоящее время контейнер приложения выйдет из-за невозможности найти базу данных. Чтобы избежать этого, нам нужно добавить метку, которая зависит от типа_on Этот тег решает проблему зависимостей контейнера и последовательности запуска. Например, следующий контейнер запустит службы redis и db перед запуском веб-службы:

Обратите внимание, что по умолчанию, когда вы запускаете веб-сервис с помощью docker-compose up web, вы также запускаете два сервиса, redis и db, потому что зависимости определены в файле конфигурации

3 ответа

Лучший ответ

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

Вы можете просто использовать:

Порт 3000 на вашем локальном хосте будет перенаправлен на порт 80, который используется образами nginx для ожидания http-соединений.

Я также рекомендую вам прочитать эти официальные документы .

12

Miguel A. C.
18 Дек 2019 в 17:06

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

Теперь, если я вас правильно понял и с тем фактом, что вы используете nginx с докером , думаю, вы захотите настроить порт контейнера (а не порт хоста, потому что это довольно просто).

У @ mancini0 хорошее направление, но я покажу, как сделать это более динамично.

Мы будем использовать envsubst, которая заменяет переменные среды в строки формата оболочки. Эта команда доступна в официальном изображении nginx, а также в альпийской версии.

Теперь для решения.

Шаг №1 запишите вашу конфигурацию nginx в файл шаблона — давайте назовем его: :

Обратите внимание на заполнитель PORT. Шаг № 2 — с помощью docker-compose Смонтируйте его внутри каталога и затем выполните команду , чтобы использовать шаблон в качестве ссылки для , который будет использоваться для настройки конфигурации порта внутри контейнера:

Шаг № 2 — с помощью docker-compose Смонтируйте его внутри каталога и затем выполните команду , чтобы использовать шаблон в качестве ссылки для , который будет использоваться для настройки конфигурации порта внутри контейнера:

Обратите внимание: 1. После этого вам необходимо запустить демон nginx

2. Я использовал , а не , потому что мое базовое изображение альпийское.

Шаг № 2 (другой вариант) — встроенный докер работает Если по какой-то причине вы не хотите работать с docker-compose, вы можете использовать следующий скрипт bash:

(*) Вы также можете записать его в свой Dockerfile с помощью команды , но я не рекомендую вам это делать.

1

RtmY
25 Сен 2019 в 21:21

Принятый ответ не меняет фактический порт, на котором запускается nginx.

Если вы хотите изменить порт, запускаемый nginx в внутри контейнера, вы должны изменить файл /etc/nginx/nginx.conf внутри контейнера.

Например, для запуска на порту 9080:

Dockerfile

nginx.conf

Теперь для доступа к серверу с вашего компьютера:

Перейдя на localhost: 3333 в браузере, вы увидите свой контент.

Вероятно, есть способ включить nginx.conf по умолчанию и переопределить только свойство server.listen = PORT, но я не слишком знаком с конфигурацией nginx, поэтому я просто переписал всю конфигурацию по умолчанию.

12

mancini0
1 Сен 2019 в 16:57

Что дальше ¶

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

Попробуйте выполнить следующие шаги:

  • Протестировать холодную перезагрузку сервера (лучше в VirtualBox). В реальной жизни это нечастое явление, но случается, поэтому лучше заранее знать, как поведёт себя докер.
  • Поднять несколько контейнеров и настроить между ними сеть. Пожалуй, это самая частая задача, с которой вы будете сталкиваться.
  • Научиться передавать переменные окружения в контейнер.
  • Научиться работать с документацией докера. Конечно, в интернетах есть много статей, но уметь найти нужную информацию в первоисточнике — бесценно.
  • Почитать про docker-compose. Рано или поздно это вам точно пригодится.

Заключение

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

Я надеюсь, эта статья прояснила для вас привязку портов.

Спасибо за чтение!

  • Список важнейших команд в Docker
  • Сканируем образы Docker на уязвимости
  • Docker для разработки Go с горячей перезагрузкой

Перевод статьи Dieter JordensHow Does Docker Port Binding Work?

Заключение

Обе команды – и , и сравнительно новая команда – могут использоваться с файлами , написанными в соответствии со спецификацией версии 3. Для проектов, работающих с версией 2, можно использовать или обновить файл для соответствия новой версии.

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

Перевести рабочий процесс на несложно. Это легко можно сделать при обновлении файлов docker compose с версии 2 на версию 3.

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

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

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: