Docker 網路基礎配置一(埠對映)

weixin_34214500發表於2019-03-04

大量的網際網路應用服務包含多個服務元件,這往往需要多個容器之間通過網路通訊進行相互配合。Docker 目前提供了對映容器埠到宿主主機和容器互聯機制來為容器提供網路服務。

Docker的四種網路模式

1. host模式 :
    docker run 使用 --net=host指定
    docker使用的網路實際上和宿主機一樣
2. container模式:
    使用 --net=container:container_id/container_name
    多個容器使用共同的網路,看到的ip是一樣的。
3. none 模式
    使用 --net=none指定
    這種模式下,不會配置任何網路。
4. bridge模式
    使用 --net=bridge指定,預設模式,不會指定
    此模式會為每個容器分配一個獨立的network namespace

埠對映實現訪問容器

外部網路訪問容器 :外部的使用者要訪問容器,先將容器的ip對映出去,然後客戶利用宿主機的ip來訪問

[root@30c1fec5df6a /]# [root@langzi01 ~]# docker run -d -P training/webapp python app.py
[root@langzi01 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
4986deb00c32        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        0.0.0.0:32768->5000/tcp   musing_haibt

通過docker ps檢視發現 32768 埠對映到了容器的 5000 埠。此時訪問主機的 32768 埠就可以訪問容器內 web 應用提供的內容

通過docker logs檢視容器資訊

[root@langzi01 ~]# docker logs -f musing_haibt
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

對映所有介面的地址:

使用 hostPort:containerPort 格式將本地的 5000 埠對映到容器的 5000 埠,可以執行如下命令:

[root@langzi01 ~]# docker run -d -p 5000:5000 training/webapp python app.py
ab2c757be1b4515b37859704cc5ca67af00190d8a067093dba2fecb92f65ae3d
[root@langzi01 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
ab2c757be1b4        training/webapp     "python app.py"     5 seconds ago       Up 3 seconds        0.0.0.0:5000->5000/tcp   eloquent_kilby

此時預設會繫結本地所有介面上的所有地址(如果主機有多個 IP,那麼每個 IP 的 5000 埠都對映到了容器的 5000 埠)。

多次使用 -p 引數可以繫結多個埠:

[root@langzi01 ~]# docker run -d -p 5001:5001 -p 3000:8000 training/webapp python app.py
8081850a70fd7e76fb34a8e205ef9f315ffb0f5028eded4630b7763c3a4c2816
[root@langzi01 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
8081850a70fd        training/webapp     "python app.py"     4 seconds ago       Up 3 seconds        5000/tcp, 0.0.0.0:5001->5001/tcp, 0.0.0.0:3000->8000/tcp   jovial_ptolemy

對映指定地址到指定的埠:

可以使用 ip:hostPort:containerPort 格式的引數指定對映使用一個特定地址,比如 localhost 地址 127.0.0.1:

[root@langzi01 ~]# docker run -d -p 127.0.0.1:5002:5002 training/webapp python app.py
7f9341d8a64ca56cae2c7d47fbaf7327542e0ca0ef1b4b215b683b9e005c5d46
[root@langzi01 ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                                NAMES
7f9341d8a64c        training/webapp     "python app.py"     About a minute ago   Up About a minute   5000/tcp, 127.0.0.1:5002->5002/tcp   trusting_euler

對映指定地址到指定的任意埠:

使用 ip::containerPort 格式的引數可以繫結 localhost 的任意埠到容器的 5000 埠,本地主機會自動分配一個埠:

[root@langzi01 ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
ba45085521a63529bb353fa3e926eb7d9b38f7df8b3332740b163f61d7627620

檢視對映埠配置

[root@langzi01 ~]# docker port peaceful_franklin 5000
127.0.0.1:32769
[root@langzi01 ~]# docker port jovial_ptolemy 8000
0.0.0.0:3000

Docker 給已經建立並執行的容器新增埠對映

建立時沒有新增埠對映,通過commit提交一個執行中的容器,重新執行映象新增埠

[root@langzi01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
06f21b81bf7c        centos              "/bin/bash"         2 days ago          Up 2 days                               data03
127de2f57a5b        centos              "/bin/bash"         2 days ago          Up 2 days                               data02
2f5f9417b073        centos              "/bin/bash"         2 days ago          Up 2 days                               data01

#提交一個容器
[root@langzi01 ~]# docker commit -m "centos_with_httpd" -a "frankie" 2f5 centos_with_httpd:frankie
sha256:a78cc36474c845328fc44daf6bb3f1cc489a5c2a908061b07757d5990bdd0c77

[root@langzi01 ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
centos_with_httpd           frankie             a78cc36474c8        9 seconds ago       312 MB
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                    NAMES
67f671d4bf82        centos_with_httpd:frankie   "bash"              9 seconds ago       Up 8 seconds        0.0.0.0:5123->8000/tcp   lucid_almeida

[root@langzi01 ~]# docker run -itd -p 5123:80 centos_with_httpd:frankie bash
67f671d4bf82472a9e70f30d59fe161fb085a55005a95c6c1d9e4edb9bdff345
[root@langzi01 ~]# docker ps -l
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                    NAMES
67f671d4bf82        centos_with_httpd:frankie   "bash"              9 seconds ago       Up 8 seconds        0.0.0.0:5123->80/tcp   lucid_almeida
 
[root@langzi01 ~]# docker exec -it 15d bash
[root@15dee97e8218 /]# /usr/sbin/httpd
[root@15dee97e8218 /]# curl 'localhost/hello.html'
Hello,World

在主機裡面訪問

[root@langzi01 ~]# curl '172.17.0.1:5123/hello.html'
Hello,World

檢視容器的名字

[root@langzi01 ~]# docker inspect -f "{{ .Name }}" 15dee97e8218
/eager_agnesi

相關文章