zoukankan      html  css  js  c++  java
  • Docker网络相关

    Docker中网络功能相关
    
        Docker是允许通过外部访问容器或者容器互联的方式来提供网络服务。
    
    外部访问容器:
    
        通过-P或者-p参数指定端口映射,-P是随机;-p是指定。
    
    -P : Docker会随机映射一个端口到内部容器开放的网络端口。
    
    用docker run -d -P training/webapp python app.py 创建启动一个容器。
    
    然后再用docker container ls -l (或者docker ps)看下

    容器内5000被映随机射到了本地的32768。(看下下面的测试)

    刷新几次上面的网址,然后看下log  (docker logs 1db63003b6b1)

    我本地windows电脑的ip是103,虚拟机(宿主机器)ip 104,容器是172.17.0.2 。
    
    -p: 则可以指定要映射的端口,并且,在一个端口上只可以绑定一个容器。支持的格式:
    
    ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
    
    端口一对一映射(所有ip)
    
    docker run -d -p 5000:5000 training/webapp python app.py 
    
    端口一对一映射,指定ip
    
    docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py 
    
    
    映射到指定地址的任意端口(我的docker是19.03.5版本,下面的这个命令失效,会随机映射一个端口出来)
    
    docker run -d -p 127.0.0.1::5000 training/webapp python app.py
    
    默认是tcp端口,可以指定udp端口
    
    docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
    
    -p标记可以多次使用来绑定多个端口docker run -d -p 5000:5000 -p 3000:80 training/webapp  python app.py
    
    可以通过docker port xxxx来查看端口映射情况

    然后是第二个姿势容器互联
    
    之前docker很多都是用--link进行互联,很多人已经建议不要这么用了,推荐是把容器加入自定义的Docker网络来进行互联操作。
    
    新建Docker网络:docker network create -d bridge my-net
    
    -d参数指定Docker网络类型,有bridge和overlay。其中overlay用于Swarm mode。
    
    运行一个容器并连接到新建的my-net网络
    
    
    
    分别打开三个终端,每个终端执行下面中的一条。
    
    docker run -it --rm --name busybox1 --network my-net busybox sh
    
    docker run -it --rm --name busybox2 --network my-net busybox sh
    
    docker container ls

     

    讲道理现在正在跑着的两个容易应该是可以互联的(在一个局域网下),分别在两个启动容器的终端里通过ping来确认彼此互联

     

    也能看到他们两个的ip,一个是172.18.0.3,另一个是172.18.0.2,有一点要清楚,他们现在都是在上面我们手动创建的那个my-net网络里。此时在宿主机上也是能ping通那两个ip的,但是记得是直接ping ip不是上面两台容器的那个操作方式。

    可以ifconfig看下此时宿主机的一些信息。

    如果是多个容器之间进行互联,推荐是直接Docker Compose,之后会整理这个相关的笔记。
    
    看到那个docker0了吗,到这我突然记得,貌似是不创建网络,直接默认大家是连接到docker0上的。我自己本地测试了一下,也是开启三个终端,然后分别执行上面那些命令,但是不指定network,然后发现确实是三个终端都彼此可以ping通的。(直接ping ip不是容器名字)
    
    配置DNS
    
    如果想要配置全部容器的DNS,直接在宿主机上  /etc/docker/daemon.json  文件中增加dns这个值
    
    {
    
        "dns" : [
    
            "114.114.114.114",
    
            "8.8.8.8"
    
        ]
    
    }
    
    就行了。这样每次启动容器自动配置为这两个。
    
    如果想要手动指定:
    
    --dns=IP_ADDRESS添加 DNS 服务器到容器的  /etc/resolv.conf  中。
    
    如果是改主机名可以用下面这个
    
    -h HOSTNAME  或者  --hostname=HOSTNAME  设定容器的主机名,它会被写到容器内的  /etc/hostname  和  /etc/hosts
    
    设定容器的搜索域
    
    --dns-search=DOMAIN  设定容器的搜索域,当设定搜索域为  .example.com时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索host.example.com
    
    还有一种改容器DNS的方式就是直接用之前说的 文件挂载的方式直接挂载容器的/etc/resolv.conf文件出来。这个不做演示了(这个是我自己想的,感觉应该可行,就算可行,也不建议直接把容器的DNS文件和本地的DNS文件绑定在一起,这样就会导致容器有修改宿主主机的DNS的权限了)。
    
    

     

  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/csnd/p/12061833.html
Copyright © 2011-2022 走看看