Я читаю книгу Ярослава Крочмальского "Докер и Кубернетес для разработчиков 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
, поэтому я не уверен, что именно это означает и как это работает. У кого-нибудь есть понимание этого?