设为首页 收藏本站
查看: 1168|回复: 0

[经验分享] Docker学习之网络篇

[复制链接]

尚未签到

发表于 2019-2-21 12:12:02 | 显示全部楼层 |阅读模式
  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

  可以通过docker logs 查看容器应用的信息
  # docker logs agitated_visvesvaraya
  172.17.0.1 - - [16/May/2018:07:57:27 +0000] "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

  只能本地访问,浏览器访问192.168.20.11:8080 无法访问;
  

  

  映射到指定地址的任意端口
  # docker run -d -p 127.0.0.1::80 nginx
  绑定localhost的任意端口到容器80端口,本地会随机分配端口

  绑定本地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

  

  还可以指定udp端口
  # docker run -d -p 127.0.0.1:8080:80/udp nginx
  通过nc命令监测udp端口状态
  # nc -vuz 127.0.0.1 8080

  查看映射端口配置
  查看当前映射的端口配置,也可以看到绑定的地址
  # docker port pedantic_wozniak 80

  # 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
  再打开一个新终端,查看容器

  通过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地址
  [root@ip-172-31-10-118 ~]# cat /etc/resolv.conf
  nameserver 172.31.0.2
  [root@ip-172-31-10-118 ~]# docker run -it centos
  [root@814a44d43938 /]# cat /etc/resolv.conf
  nameserver 172.31.0.2
  [root@814a44d43938 /]# exit
  exit
  举例说明,指定-h 主机名 --dns dns地址
  [root@localhost docker]# docker run -it -h centos77 --dns=4.4.4.4 centos
  [root@centos77 /]# cat /etc/resolv.conf
  nameserver 4.4.4.4
  [root@centos77 /]# cat /etc/hostname
  centos77





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675340-1-1.html 上篇帖子: /usr/bin/docker: symbol dm_task_get_info_with_def 下篇帖子: Network Policy
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表