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的权限了)。
    
    

     

  • 相关阅读:
    数据结构学习笔记——串
    XHTML学习笔记
    Java之父James Gosling
    MultiVersion Concurrency Control 多版本并发控制
    给Parser设置代理
    Doug Lea : 世界上对Java影响力最大的个人
    nginx rewrite
    互联网公司客户支持
    Java客户端HttpClient和HttpURLConnection修改请求头Host问题
    python urllib2 设置代理 自定义header
  • 原文地址:https://www.cnblogs.com/csnd/p/12061833.html
Copyright © 2011-2022 走看看