Присоединение Docker-контейнера к сети другого контейнера с ключом --net = container: containerName - PullRequest
2 голосов
/ 28 марта 2019

Я читаю книгу Ярослава Крочмальского "Докер и Кубернетес для разработчиков Java", и наткнулся на следующий пример. Автор предлагает создать мостовую сеть myNetwork, а затем запустить два контейнера (Apache Tomcat и BusyBox), подключенные к этой сети, следующим образом (команды должны выполняться в отдельных терминальных сеансах):

$ docker run -it --name myTomcat --net=myNetwork tomcat
$ docker run -it --net container:myTomcat busybox

Автор специально говорит, что «мы хотим, чтобы наш контейнер busybox использовал ту же сеть, что и Tomcat. В качестве альтернативы, мы могли бы, конечно, пойти с явным указанием имени сети, используя опцию --net myNetwork».

Затем автор предлагает проверить связь между контейнерами, выполнив следующую команду в контейнере busybox:

$ wget localhost:8080

Это действительно сработало, но сразу смутило меня, так как у нас есть два разных контейнера, и неясно, почему они общаются через localhost. Оказывается, вышеупомянутая команда с ключом --net container:myTomcat точно не добавляет контейнер в сеть, но делает его каким-то образом видимым с тем же IP-адресом, что и контейнер myTomcat.

Это подтверждается наблюдением, что если вы запустите docker network inspect myNetwork, вы увидите, что на самом деле к сети подключен только один контейнер:

[
    {
        "Name": "myNetwork",
        ...
        "Containers": {
            "464ed70a0c31784226dc943bcbcb79f7c4666b9d7825183706505731ac06a9bf": {
                "Name": "myTomcat",
                "EndpointID": "a4c384f17c6f8e443a430f130093ff6936bb59b1b54d0f056d1f0b4c703c1489",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            }
        },
        ...
    }
]

Напротив, если вы запустите контейнер busybox следующим образом:

$ docker run -it --net=myNetwork busybox

видимость через localhost не будет работать, но docker network inspect myNetwork покажет оба контейнера, подключенные к сети под разными IP-адресами:

[
    {
        "Name": "myNetwork",
        ...
        "Containers": {
            "41c607b78af36cf6512124b6c057ed31997ddd6067a99ae579fe25b53753178e": {
                "Name": "vigorous_clarke",
                "EndpointID": "9bf6d6a294d885febcfe7f38e388f68af3f8bc7c0334c1dcea13512c3ead23d5",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            },
            "464ed70a0c31784226dc943bcbcb79f7c4666b9d7825183706505731ac06a9bf": {
                "Name": "myTomcat",
                "EndpointID": "a4c384f17c6f8e443a430f130093ff6936bb59b1b54d0f056d1f0b4c703c1489",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            }
        },
        ...
    }
]

Похоже, что вопреки утверждению автора ключи --net=container:myTomcat и --net=myNetwork имеют совершенно разные значения. Проблема в том, что я не смог найти никакой документации по нотации --net=container:containerName, поэтому я не уверен, что именно это означает и как это работает. У кого-нибудь есть понимание этого?

1 Ответ

1 голос
/ 28 марта 2019

--network=container:containerName имеет следующее значение, согласно документации :

Если для сети установлено значение container, контейнер будет совместно использовать сетевой стек другого контейнера. [...] Пример запуска контейнера Redis с привязкой Redis к localhost, затем запуском команды redis-cli и подключением к серверу Redis через интерфейс localhost.

$ docker run -d --name redis example/redis --bind 127.0.0.1
$ # use the redis container's network stack to access localhost
$ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1

По этой причине контейнер busybox может обращаться к приложению tomcat через http://localhost:8080 в примере книги.

Спасибо @tgogos за указание в правильном направлении.

...