容器網絡映射html
容器中能夠運行一些網絡應用,要讓外部也能夠訪問這些應用,能夠經過 -P 或 -p 參數來指定端口映射。python
當使用 -P 標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。nginx
使用-P映射隨機端口 ****理論上是49000~49900,可是服務器映射的端口是32769,緣由待確認web
[root@localhost opt]# docker -d -v /data:/var/www/html -P nginx:v2 root@localhost opt]# docker ps |grep nginx a42f85890719 nginx:v2 "nginx -g 'daemon of��" 12 minutes ago Up 12 minutes 0.0.0.0:32769->80/tcp hardcore_ramanujan
訪問測試:docker
容器日誌查看json
[root@localhost opt]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a42f85890719 nginx:v2 "nginx -g 'daemon of��" 41 minutes ago Up 41 minutes 0.0.0.0:32769->80/tcp hardcore_ramanujan ce4ccea0bde8 ansible/centos7-ansible "bash" 2 days ago Up 2 days web3 [root@localhost opt]# docker logs -f a42 172.16.204.1 - - [31/Aug/2019:10:32:23 +0000] "GET / HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-" 2019/08/31 10:32:23 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.16.204.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "172.16.204.133:32769", referrer: "http://172.16.204.133:32769/" 172.16.204.1 - - [31/Aug/2019:10:32:23 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://172.16.204.133:32769/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-" 172.16.204.1 - - [31/Aug/2019:10:34:09 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-" 172.16.204.1 - - [31/Aug/2019:10:34:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
映射全部接口地址vim
使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,能夠執行centos
$ docker run -d -p 5000:5000 training/webapp python app.py
映射到指定地址的指定端口bash
能夠使用 ip:hostPort:containerPort 格式指定映射使用一個特定地址,好比 localhost 地址127.0.0.1服務器
$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort 綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
還能夠使用 udp 標記來指定 udp 端口
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
[root@localhost opt]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a42f85890719 nginx:v2 "nginx -g 'daemon of��" 52 minutes ago Up 52 minutes 0.0.0.0:32769->80/tcp hardcore_ramanujan ce4ccea0bde8 ansible/centos7-ansible "bash" 2 days ago Up 2 days web3 [root@localhost opt]# docker port a42f8 80 0.0.0.0:32769
注意:
容器有本身的內部網絡和 ip 地址(使用 docker inspect 能夠獲取全部的變量,Docker
還能夠有一個可變的網絡配置。)
-p 標記能夠屢次使用來綁定多個端口
例如
$ docker run -d \ -p 5000:5000 \ -p 3000:80 \ training/webapp \ python app.py
容器互聯
若是你以前有 Docker 使用經驗,你可能已經習慣了使用 --link 參數來使容器互聯。
隨着 Docker 網絡的完善,強烈建議你們將容器加入自定義的 Docker 網絡來鏈接多個容器,
而不是使用 --link 參數。
新建網絡
下面先建立一個新的 Docker 網絡。
[root@localhost opt]# docker network create -d bridge my-net
-d 參數指定 Docker 網絡類型,有 bridge overlay 。其中 overlay 網絡類型用於Swarm mode,在本小節中你能夠忽略它。
鏈接容器
[root@localhost opt]# docker run -d -p 5000:80 -v /data:/data --name server2 --network my-net nginx:v2 b6cee94c2f58dc87622a65290d5d786c764731d9aa57c4f46b66d5e718b76a3d [root@localhost opt]# docker run -d -p 6000:80 -v /data:/data --name server3 --network my-net nginx:v2 e5ec88002b3d80bff645d692ebc9a7ef62f5eefb9244af544c55af6106da1e59
配置DNS
手動指定容器dns
[root@localhost ~]# docker run -it --rm --dns=114.114.114.114 nginx:v2 cat /etc/resolv.conf nameserver 114.114.114.114 failed to resize tty, using default size
經過修改配置文件來讓新啓動的容器走默認dns配置 (測試後不生效! 待定爲緣由😂)
vim /etc/docker/daemon.json
{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
指定主機名(--hostname)
[root@localhost ~]# docker run -it --rm --dns=114.114.114.114 --hostname=nginx nginx:v2 cat /etc/hostname nginx failed to resize tty, using default size