zoukankan      html  css  js  c++  java
  • Title

    Docker 容器连接

    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P-p 参数来指定端口映射

    网络端口映射

    创建一个 python 应用的容器

    tianbao@tianbao:~$ docker run -d -P training/webapp python app.py
    d16b33e25b71d7ae69bc287145fd09a716d0b7d3e1f0bf52e1eb83089bd4ac36
    tianbao@tianbao:~$ 
    

    另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1

    我们使用 -P 参数创建一个容器,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32769

    tianbao@tianbao:~$ sudo docker ps
    [sudo] password for tianbao: 
    CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS              PORTS                     NAMES
    d16b33e25b71        training/webapp                "python app.py"          About a minute ago   Up About a minute   0.0.0.0:32769->5000/tcp   suspicious_shaw
    

    我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

    两种方式的区别是:

    • -P :是容器内部端口随机映射到主机的高端口。
    • -p : 是容器内部端口绑定到指定的主机端口
    tianbao@tianbao:~$ sudo docker run -d -p 5006:5000 training/webapp python app.py
    3ad0c1bef4b64d43eb0b52d55543668a5d32d7589716018c3a582dcb850cadf3
    tianbao@tianbao:~$
    tianbao@tianbao:~$ sudo docker ps
    CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                     NAMES
    3ad0c1bef4b6        training/webapp                "python app.py"          2 minutes ago       Up 2 minutes        0.0.0.0:5006->5000/tcp    romantic_mendel
    d16b33e25b71        training/webapp                "python app.py"          7 minutes ago       Up 7 minutes        0.0.0.0:32769->5000/tcp 
    

    可以指定容器绑定的网络地址,比如绑定 127.0.0.1

    tianbao@tianbao:~$ docker run -d -p 127.0.0.1:5002:5000 training/webapp python app.py
    21ef26f75f408b196d965200deb0032cb4c5e0baa512b5ef8d60884b96fe033f
    tianbao@tianbao:~$ sudo docker ps
    CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                      NAMES
    21ef26f75f40        training/webapp                "python app.py"          6 seconds ago       Up 6 seconds        127.0.0.1:5002->5000/tcp   hopeful_heisenberg
    3ad0c1bef4b6        training/webapp                "python app.py"          3 minutes ago       Up 3 minutes        0.0.0.0:5006->5000/tcp     romantic_mendel
    d16b33e25b71        training/webapp                "python app.py"          9 minutes ago       Up 9 minutes        0.0.0.0:32769->5000/tcp
    

    这样我们就可以通过访问 127.0.0.1:5002 来访问容器的 5000 端口

    上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

    tianbao@tianbao:~$ docker run -d -p 127.0.0.1:5002:5000/udp training/webapp python app.py
    1bdbd19e18a0b6e90d7ae783d08a7809aa58fdc96371d3108c55b2028bd1e79d
    tianbao@tianbao:~$ sudo docker ps
    CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS              PORTS                                NAMES
    1bdbd19e18a0        training/webapp                "python app.py"          5 seconds ago        Up 3 seconds        5000/tcp, 127.0.0.1:5002->5000/udp   funny_shirley
    21ef26f75f40        training/webapp                "python app.py"          About a minute ago   Up About a minute   127.0.0.1:5002->5000/tcp             hopeful_heisenberg
    3ad0c1bef4b6        training/webapp                "python app.py"          5 minutes ago        Up 5 minutes        0.0.0.0:5006->5000/tcp               romantic_mendel
    d16b33e25b71        training/webapp                "python app.py"          10 minutes ago       Up 10 minutes       0.0.0.0:32769->5000/tcp
    

    docker port 命令可以让我们快捷地查看端口的绑定情况

    tianbao@tianbao:~$ sudo docker port funny_shirley
    5000/udp -> 127.0.0.1:5002
    tianbao@tianbao:~$ 
    

    Docker 容器互联

    端口映射并不是唯一把 docker 连接到另一个容器的方法

    docker 有一个连接系统允许将多个容器连接在一起,共享连接信息

    docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息

    容器命名

    当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器

    tianbao@tianbao:~$ sudo docker run -d -P --name tianbao training/webapp python app.py
    [sudo] password for tianbao: 
    5691a9738020c8a0f51cd2273b65c915fa73e1e03bae7d873f3d63cb0d68e109
    

    显示最近修改的镜像

    tianbao@tianbao:~$ docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
    5691a9738020        training/webapp     "python app.py"     20 minutes ago      Up 20 minutes       0.0.0.0:32770->5000/tcp   tianbao
    

    新建网络

    先创建一个新的 Docker 网络

    tianbao@tianbao:~$ docker network create -d bridge test-net
    

    参数说明:

    -d:参数指定 Docker 网络类型,有 bridge、overlay。

    其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它

    连接容器

    运行一个容器并连接到新建的 test-net 网络

    tianbao@tianbao:~$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
    

    打开新的终端,再运行一个容器并加入到 test-net 网络

    tianbao@tianbao:~$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
    

    下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

    如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)

    发现没有ping命令时,先安装其包

    apt-get update
    apt install iputils-ping
    

    如果你有多个容器之间需要互相连接,推荐使用 Docker Compose

    配置 DNS

    我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS

    设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。

    配置完,需要重启 docker 才能生效/etc/init.d/docker restart

    查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息

    tianbao@tianbao:~/oc$ sudo docker run -it --rm  ubuntu  cat etc/resolv.conf
    # This file is managed by man:systemd-resolved(8). Do not edit.
    #
    # This is a dynamic resolv.conf file for connecting local clients directly to
    # all known uplink DNS servers. This file lists all configured search domains.
    #
    # Third party programs must not access this file directly, but only through the
    # symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
    # replace this symlink by a static file or a different symlink.
    #
    # See man:systemd-resolved.service(8) for details about the supported modes of
    # operation for /etc/resolv.conf.
    
    nameserver 8.8.8.8
    tianbao@tianbao:~/oc$ 
    

    手动指定容器DNS配置

    tianbao@tianbao:~/oc$ sudo docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu
    root@host_ubuntu:/# cat /etc/hostname 
    host_ubuntu
    root@host_ubuntu:/# cat /etc/hosts
    127.0.0.1	localhost
    ::1	localhost ip6-localhost ip6-loopback
    fe00::0	ip6-localnet
    ff00::0	ip6-mcastprefix
    ff02::1	ip6-allnodes
    ff02::2	ip6-allrouters
    172.17.0.2	host_ubuntu
    root@host_ubuntu:/# cat /etc/resolv.conf 
    search test.com
    nameserver 114.114.114.114
    root@host_ubuntu:/# 
    

    如果在容器启动时没有指定 --dns--dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS

  • 相关阅读:
    005.python-anaconda报错没有pymysql .pip install 安装 jupyter仍然报错
    018.hive-hive两个表leftjoin,由于关联字段类型不同导致的数据错误(bigint、string)
    031.mysql-mysql 不等于会过滤null值问题,解决办法IFNULL(B1,'') != 1
    理解JavaScript的执行机制
    H5页面调app方法
    记录video 开发中遇到的问题
    i++ 与 ++i的区别
    text-align: justify
    请教一个问题:关于 webrtc 通信的问题
    模拟video播放器
  • 原文地址:https://www.cnblogs.com/guotianbao/p/13965179.html
Copyright © 2011-2022 走看看