您好,登錄后才能下訂單哦!
docker除了通過網絡訪問外,還提供了兩個功能來滿足服務訪問的基本需求:一個是允許映射容器內應用的服務端口到本地宿主主機;另一個是互聯機制實現多個容器間通過容器名來快速訪問。
1、從外部訪問容器應用,從啟動容器的時候,如果不指定對應參數,在容器外部是無法通過網絡來訪問容器內的網絡應用和服務的。可以通過-P或-p參數來指定端口映射。
-P:會隨機映射一個49000~49900的端口到內部容器開放的網絡端口
[root@docker01 ~]# docker run -d -P training/webapp python app.py
75b2c32292d290aa3004b5b6cbb49775cc6f360796736473978cc32a682fdad9
[root@docker01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75b2c32292d2 training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:32770->5000/tcp musing_carson
查看應用的信息
[root@docker01 ~]# docker logs -f musing_carson
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
2、映射所有接口地址,使用HostPort:ContainerPort吧本地的5000端口映射到容器的5000端口
[root@docker01 ~]# docker run -d -p 5000:5000 training/webapp python app.py
6368e0f567714ad90d2b20ff71afb2231e404b35639055a665cc3715a85f010a
或使用連續的-p綁定多個端口
[root@docker01 ~]# docker run -d -p 5000:5000 -p3000:80 training/webapp python app.py
80bfe8e1f7fd53099e3f350c5efd1160a7247d065233965cc2bc2130e2fdcbb2
3、映射到指定地址的指定端口,使用IP:HostPort:ContainerPort格式指定映射使用一個特定地址。
[root@docker01 ~]# docker run -d -p 10.10.17.199:5000:5000 training/webapp python app.py
ac228c0f2334a59856d9993e6a3eb652b50eb08ec41cedff87b331aa8d5d5f86
[root@docker01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac228c0f2334 training/webapp "python app.py" 5 seconds ago Up 5 seconds 10.10.17.199:5000->5000/tcp eager_noether
4、映射到指定地址的任意端口,使用IP::ContainerPort綁定localhost的任意端口到容器的5000端口,本地主機會自動分配一個端口
[root@docker01 ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
e72dec38ae77c113418156c4ad50b601fe31d0a38b4b8f995aabdcfcc510fdcc
使用UDP標記來指定udp端口
[root@docker01 ~]# docker run -d -p 127.0.0.1:5001:5001/udp training/webapp python app.py
581ff1531c6b604c1b66ece82c87529a02c8da0b7b19e98bd336122c151b524f
5、查看映射端口配置,使用docker port來查看映射的端口配置
[root@docker01 ~]# docker port laughing_faraday 5000
127.0.0.1:32768
容器的互聯是一種讓多個容器中的應用進行快捷交互的方式,它會在源和接收容器之間創建連接關系,接收容器可以通過容器名快速訪問到源容器,而不用指定具體的IP地址。
1、自定義容器命名,連接系統依據容器的名稱來執行。首先需要一個好記的容器命名,雖然不指定系統會默認分配一個,但是指定的好處在于:名稱好記,基于應用來取名如web。需要連接其他容器時,也可以使用容器名而不用改變。
[root@docker01 ~]# docker run -d -P --name web training/webapp python app.py
6ae6d11614f99762a519d55beb8b38f3fbff667af34be90b33d6a11477b8d99a
[root@docker01 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ae6d11614f9 training/webapp "python app.py" 7 seconds ago Up 6 seconds 0.0.0.0:32771->5000/tcp web
2、容器互聯,使用--link參數可以讓容器之間安全的進行交互
創建一個新的數據庫容器
[root@docker01 ~]# docker run -d --name db training/postgres
Unable to find image 'training/postgres:latest' locally
latest: Pulling from training/postgres
Image docker.io/training/postgres:latest uses outdated schema1 manifest format. Please upgrade to atibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
a3ed95caeb02: Pull complete
6e71c809542e: Pull complete
2978d9af87ba: Pull complete
e1bca35b062f: Pull complete
500b6decf741: Pull complete
74b14ef2151f: Pull complete
7afd5ed3826e: Pull complete
3c69bb244f5e: Pull complete
d86f9ec5aedf: Pull complete
010fabf20157: Pull complete
Digest: sha256:a945dc6dcfbc8d009c3d972931608344b76c2870ce796da00a827bd50791907e
Status: Downloaded newer image for training/postgres:latest
67b752f9c5d6f19f2811674be780673b5475c845be6f43d9b15df139ff01c0fd
刪除之前的web容器,然后創建一個新的web容器,把他連接到db容器
[root@docker01 ~]# docker rm -f web
web
[root@docker01 ~]# docker run -d -P --name web --link db:db training/webapp python app.py
de3f340d554dd01789859d6dc0fc3a0bb406e3111ca60e27f78da208def08dca
--link參數的格式為--link name:alias,其中name是要鏈接的容器名稱,alias是別名。
使用docker ps查看容器的鏈接
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
de3f340d554d training/webapp "python app.py" 4 minutes ago Up 4 minutes 0.0.0.0:32772->5000/tcp web
67b752f9c5d6 training/postgres "su postgres -c '/us…" 13 minutes ago Up 13 minutes 5432/tcp db
相當于在兩個容器之間創建了一個虛擬通道,而且不用映射他們的端口到宿主機上,在啟動db容器的時候沒有使用-p或-P標記,避免了暴露數據庫服務端到外部網絡上。
docker通過兩種方式為容器公開連接信息
#更新環境變量
#更新/etc/hosts文件
使用env命令來查看web容器的環境變量:
[root@docker01 ~]# docker run --rm --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=2ff63f7eb1d2
DB_PORT=tcp://172.17.0.3:5432
DB_PORT_5432_TCP=tcp://172.17.0.3:5432
DB_PORT_5432_TCP_ADDR=172.17.0.3
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root
除了環境變量docker還添加了host信息到父容器的/etc/hosts中
[root@docker01 ~]# docker run -t -i --rm --link db:db training/webapp /bin/bash
root@8ed896541b8d:/opt/webapp# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 db 67b752f9c5d6
172.17.0.4 8ed896541b8d
root@8ed896541b8d:/opt/webapp# ping db
PING db (172.17.0.3) 56(84) bytes of data.
64 bytes from db (172.17.0.3): icmp_seq=1 ttl=64 time=0.239 ms
64 bytes from db (172.17.0.3): icmp_seq=2 ttl=64 time=0.154 ms
64 bytes from db (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms
64 bytes from db (172.17.0.3): icmp_seq=4 ttl=64 time=0.111 ms
^C
--- db ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.110/0.153/0.239/0.053 ms
用戶可以鏈接多個子容器到父容器,比如可以鏈接多個web到同一個db容器上。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。