Docker網絡基礎配置

簡介 

  大量的互聯網應用服務包括多個服務組件,這每每須要多個容器之間經過網絡通訊進行相互配合。
  Docker 目前提供了映射容器端口到宿主主機和容器互聯機制來爲容器提供網絡服務。
  本文將講解如何使用Docker的網絡功能。包括使用端口映射機制來將容器內應用服務提供給外部網絡,以及經過容器互聯繫統讓多個容器之間進行快捷的網絡通訊。web

端口映射實現容器訪問

從外部訪問容器應用

  在啓動容器的時候,若是不指定對應參數,在容器外部是沒法經過網絡來訪問容器內的網絡應用和服務的。
  當容器中運行一些網絡應用,要讓外部訪問這些應用時,能夠經過-P或-p參數來指定端口映射。當使用-P標記時,Docker會隨機映射一個49000~49900的端口至容器內部開放的網絡端口:sql

[root@gavin ~]# sudo docker run -d -P tomcat:latest
afe8064a2e604ebd212ec2a620fde7d0c2f72b51d298066f3e4c454df1b74e6e
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
afe8064a2e60        tomcat:latest       "catalina.sh run"   13 seconds ago      Up 12 seconds       0.0.0.0:32769->8080/tcp   festive_panini

  此時,可使用docker ps看到,本地主機的32769被映射到了容器的8080端口。
  訪問宿主主機的32769端口便可訪問容器內Web應用提供的界面。docker

  一樣,能夠經過docker logs命令來查看應用的信息:數據庫

[root@gavin ~]# sudo docker logs afe8
28-Aug-2019 14:18:27.546 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.45
28-Aug-2019 14:18:27.548 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Aug 14 2019 22:21:25 UTC
28-Aug-2019 14:18:27.548 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.5.45.0
28-Aug-2019 14:18:27.549 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
28-Aug-2019 14:18:27.549 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-957.el7.x86_64
...

  -p(小寫的)則能夠指定要映射的端口,而且,在一個指定端口上只能夠綁定一個容器。支持的格式有ip:hostport:containerPort l ip::containerPort I hostPort:containerPort。apache

映射全部接口地址

  使用hostPort:containerPort格式將本地的8080端口映射到容器的8080端口,能夠執行以下命令:tomcat

[root@gavin ~]# sudo docker run -d -p 8080:8080 tomcat:latest
b7b692ed0bc99bf73f68b92ddca20a1ae5ab510c42ae234f76a4b36093e1fd31
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
b7b692ed0bc9        tomcat:latest       "catalina.sh run"   9 seconds ago       Up 8 seconds        0.0.0.0:8080->8080/tcp    tender_wescoff

  此時默認會綁定本地全部接口上的全部地址。屢次使用-p標記能夠綁定多個端口。
  例如:安全

[root@gavin ~]# sudo docker run -d -p 8088:8088 -p 8099:8099 tomcat:latest
c1629208e59a8953369b2229de6c352ae83faa00154c7acdb5178931e84bedce
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
c1629208e59a        tomcat:latest       "catalina.sh run"   6 seconds ago       Up 5 seconds        0.0.0.0:8088->8088/tcp, 8080/tcp, 0.0.0.0:8099->8099/tcp   nervous_robinson

映射到指定地址的指定端口

  可使用ip:hostPort:containerPort格式指定映射使用一個特定地址,好比個人IP爲192.168.1.16:bash

[root@gavin ~]# sudo docker run -d -p 192.168.1.16:8081:8080 tomcat:latest 
7f5eab8748fe3fcb0ffd3b2828928be05f8193d88ff80d2f88aee9ae262f6114
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
7f5eab8748fe        tomcat:latest       "catalina.sh run"   10 seconds ago      Up 9 seconds        192.168.1.16:8081->8080/tcp                                stoic_robinson

映射到指定地址的任意端口

  使用ip::containerPort綁定192.168.1.16的任意端口到容器的8080端口,本地主機會自動分配一個端口:網絡

[root@gavin ~]# sudo docker run -d -p 192.168.1.16::8080 tomcat:latest 
8108af81e853076df2a55d125b559476422df4d16c4560afd6439f51cb67bcfc
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
8108af81e853        tomcat:latest       "catalina.sh run"   7 seconds ago       Up 6 seconds        192.168.1.16:32768->8080/tcp                               inspiring_zhukovsky

查看映射端口配置

  使用docker port來查看當前映射的端口配置,也能夠查看到綁定的地址:tcp

[root@gavin ~]# sudo docker port 8108
8080/tcp -> 192.168.1.16:32768

容器互聯實現容器間通訊

  容器的鏈接(linking)系統是除了端口映射外另外一種能夠與容器中應用進行交互的方式。
  它會在源和接收容器之間建立一個隧道,接收容器能夠看到源容器指定的信息。

自定義容器命名

  鏈接系統依據容器的名稱來執行。所以,首先須要自定義一個好記的容器命名。
  雖然當建立容器的時候,系統默認會分配一個名字,但自定義命名容器有兩個好處:

  1. 自定義的命名,比較好記,好比一個Web應用容器,咱們能夠給它起名叫web。
  2. 當要鏈接其餘容器時候,能夠做爲一個有用的參考點,好比鏈接Web容器到db容器。

  使用--name標記能夠爲容器自定義命名:

[root@gavin ~]# sudo docker run -d -P --name web tomcat:latest
47a03555a3aa0c4581df781f906baaa0e3c0b8fcc1ebc5764ad94eb0c14716a8

  使用docker ps來驗證設定的命名

[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
47a03555a3aa        tomcat:latest       "catalina.sh run"   46 seconds ago      Up 45 seconds       0.0.0.0:32770->8080/tcp                                    web

容器互聯

  使用--link參數可讓容器之間安全的進行交互。
  下面先建立一個新的數據庫容器:

[root@gavin ~]# sudo docker run -d --name db postgres

  刪除以前建立的web容器

[root@gavin ~]# sudo docker rm -f web

  而後建立一個新的web容器,並將它鏈接到db容器:

[root@gavin ~]# sudo docker run -d -P --name web --link db:db tomcat:latest 

  此時,db容器和web容器創建互聯關係。
  --link參數的格式爲--link name:alias,其中name是要連接的容器的名稱,alias是這個鏈接的別名。
  使用docker ps查看容器的鏈接:

[root@gavin ~]# sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
ea74df6bc843        tomcat:latest       "catalina.sh run"        2 minutes ago       Up 2 minutes        0.0.0.0:32774->8080/tcp                                    web
44c6d026afe2        postgres            "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        5432/tcp                                                   db

  進入web容器中ping db容器:

[root@gavin ~]# sudo docker exec -ti web /bin/bash
root@ea74df6bc843:/usr/local/tomcat# ping db
PING db (172.17.0.7) 56(84) bytes of data.
64 bytes from db (172.17.0.7): icmp_seq=1 ttl=64 time=0.299 ms
64 bytes from db (172.17.0.7): icmp_seq=2 ttl=64 time=0.105 ms
64 bytes from db (172.17.0.7): icmp_seq=3 ttl=64 time=0.067 ms

  能夠看到web容器能夠訪問到db容器。
  Docker在兩個互聯的容器之間建立了一個安全隧道,並且不用映射它們的端口到宿主主機上。在啓動db容器的時候並無使用-p和-P標記,從而避免了暴露數據庫端口到外部網絡上。
  Docker經過環境變量查看公開鏈接信息,使用env命令來查看web容器的環境變量:

[root@gavin ~]# sudo docker run --name web2 --link db:db tomcat:latest env
...
DB_PORT=tcp://172.17.0.7:5432
DB_PORT_5432_TCP=tcp://172.17.0.7:5432
DB_PORT_5432_TCP_ADDR=172.17.0.7
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_GOSU_VERSION=1.11
DB_ENV_LANG=en_US.utf8
DB_ENV_PG_MAJOR=11
DB_ENV_PG_VERSION=11.5-1.pgdg90+1
DB_ENV_PGDATA=/var/lib/postgresql/data
...

  其中DB開頭的環境變量是供web容器鏈接db容器使用,前綴採用大寫的鏈接別名。
  用戶能夠連接多個子容器到父容器,好比能夠連接多個web到db容器上。

 

這篇文章是我學習 Docker 的記錄,內容參考自《Docker技術入門與實戰》
相關文章
相關標籤/搜索