a616652325 发表于 2019-2-21 12:12:02

Docker学习之网络篇

  Docker 中的网络功能介绍
  Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
  外部访问容器
  容器中运行的网络应用,外部要访问这些应用。可以通过-P 或 -p 参数指定端口映射。
  -P 参数,会随机映射一个端口到内部容器开放的网络端口。
  # docker run -d -P nginx
  # docker container ls
  CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS            PORTS
  44769d42111f      nginx               "nginx -g 'daemon of…"   8 seconds ago       Up 7 seconds       0.0.0.0:32768->80/tcp
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/b4261c30ad2844bb9f877c3a8e6b8f61/qq%E6%88%AA%E5%9B%BE20180516155802.jpghttp://s1.运维网.com/images/20180522/1526955584321004.jpg
  可以通过docker logs 查看容器应用的信息
  # docker logs agitated_visvesvaraya
  172.17.0.1 - - "HEAD / HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
  -p 可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。
  映射所有接口地址
  使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
  # docker run -d -p 8080:80 nginx
  此时默认会绑定本地所有接口上的所有地址。
  映射到指定地址的指定端口
  可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
  # docker run -d -p 127.0.0.1:8080:80 nginx
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/3607171418dd4b51bfdd69ac90f6d5c9/qq%E6%88%AA%E5%9B%BE20180516160929.jpghttp://s1.运维网.com/images/20180522/1526955604811165.jpg
  只能本地访问,浏览器访问192.168.20.11:8080 无法访问;
  

  

  映射到指定地址的任意端口
  # docker run -d -p 127.0.0.1::80 nginx
  绑定localhost的任意端口到容器80端口,本地会随机分配端口
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/17c62ac2a00f4f86b136bec7a2d1a4db/qq%E6%88%AA%E5%9B%BE20180516161313.jpghttp://s1.运维网.com/images/20180522/1526955628346558.jpg
  绑定本地ip地址,浏览器可以访问,localhost不能访问。
  # docker run -d -p 192.168.20.11::80 nginx
  # curl http://localhost:32768 -I
  curl: (7) Failed connect to localhost:32768; Connection refused
  # curl http://192.168.20.11:32768 -I
  HTTP/1.1 200 OK
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/278756672908426f92248016e4e2b135/qq%E6%88%AA%E5%9B%BE20180516161932.jpghttp://s1.运维网.com/images/20180522/1526955616799185.jpg
  

  还可以指定udp端口
  # docker run -d -p 127.0.0.1:8080:80/udp nginx
  通过nc命令监测udp端口状态
  # nc -vuz 127.0.0.1 8080
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/1964e57906414269be8cb8ea9b1fadaf/qq%E5%9B%BE%E7%89%8720180516164041.png
  查看映射端口配置
  查看当前映射的端口配置,也可以看到绑定的地址
  # docker port pedantic_wozniak 80
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/4af1e3a1570849ee999dbefecaba4a92/qq%E6%88%AA%E5%9B%BE20180516164538.jpghttp://s1.运维网.com/images/20180522/1526955647128971.jpg
  # docker port   80
  0.0.0.0:32768
  -p 可以多次使用来绑定多个端口
  # docker run -d -p 8080:80 -p 8888:80 nginx
  

  本地8080、8888都映射到容器的80端口
  # curl http://localhost:8080 -I
  HTTP/1.1 200 OK
  # curl http://localhost:8888 -I
  HTTP/1.1 200 OK
  

  容器互联
  建议将容器加入自定义的Dokcer网络来连接多个容器,少使用--link参数。
  新建docker网络
  # docker network create -d bridge my-net
  -d 参数指定docker网络类型,有bridge、 overlay(用于swarm mode)
  连接容器
  运行一个容器并连接到新建的my-net网络
  # dockerun -it --rm --name box1 --network my-net centos sh
  打开新的终端,再运行一个容器并加入到 my-net网络
  # docker run -it --rm --name box2 --network my-net centos sh
  再打开一个新终端,查看容器
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/ae482c5501cb432eae5fd2fc0779d457/qq%E6%88%AA%E5%9B%BE20180517143601.jpg
  通过ping 证明box1 和box2 容器建立互联关系
  在box1执行ping box2 ,解析为172.18.0.3
  sh-4.2# ping box2 -c 3
  PING box2 (172.18.0.3) 56(84) bytes of data.
  64 bytes from box2.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.048 ms
  64 bytes from box2.my-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.135 ms
  64 bytes from box2.my-net (172.18.0.3): icmp_seq=3 ttl=64 time=0.123 ms
  在box2执行ping box1,成功连接。
  sh-4.2# ping box1
  PING box1 (172.18.0.2) 56(84) bytes of data.
  64 bytes from box1.my-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.448 ms
  64 bytes from box1.my-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.134 ms
  64 bytes from box1.my-net (172.18.0.2): icmp_seq=3 ttl=64 time=0.130 ms
  box1和box2 在同一个局域网内。
  Docker Compose
  如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。
  

  配置DNS
  配置全部容器的 DNS ,也可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。

# cat /etc/docker/daemon.json
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}  这样每次启动的容器DNS自动配置为114.114.114.114和 8.8.8.8
  验证DNS是否生效
  # docker run -it --rm ubuntu cat /etc/resolv.conf
  nameserver 114.114.114.114
  nameserver 8.8.8.8
  如果用户想要手动指定容器的配置,可以在使用 docker run 命令启动容器时加入如下参数:
  -h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到。
  --dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
  --dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
  注意:如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。
  举例说明,没有指定参数,使用本机的DNS地址
  # cat /etc/resolv.conf
  nameserver 172.31.0.2
  # docker run -it centos
  # cat /etc/resolv.conf
  nameserver 172.31.0.2
  # exit
  exit
  举例说明,指定-h 主机名 --dns dns地址
  # docker run -it -h centos77 --dns=4.4.4.4 centos
  # cat /etc/resolv.conf
  nameserver 4.4.4.4
  # cat /etc/hostname
  centos77
http://blog.运维网.com/mofansheng/C:/Users/vst/AppData/Local/YNote/data/qqD53B40C087AE9EF0B35A96CA42610009/b2f536a282324c19a1f7acb4a9a3b109/qq%E6%88%AA%E5%9B%BE20180517163329.jpg



页: [1]
查看完整版本: Docker学习之网络篇