Docker学习第三天——Docker容器技术(三)

目录

一、Docker容器

        1、通过现有容器生成镜像

        2、复制文件至容器

         3、容器监控

         4、容器日志管理

二、Docker网络基础

        1、 Docker容器网络模型:

         2、Docker本地网络驱动:

       3、选择Docker网络驱动的基本原则:

         4、单主机与多主机的Docker网络

        5、 docker run命令的网络配置用法

         6、docker network命令的网络配置用法

三、配置容器的网络连接

        1、概述

        2、应用场合

        3、配置实例


一、Docker容器

        1、通过现有容器生成镜像

        基于现有运行中的容器创建新的镜像:

docker commit 容器名称或ID 新repository:tag

        生成实例: 

        ①启动一个centos7容器,并在其中安装nginx;

Docker学习第三天——Docker容器技术(三)_第1张图片

②基于该容器生成新的镜像;

Docker学习第三天——Docker容器技术(三)_第2张图片

③基于新的镜像启动新容器。

Docker学习第三天——Docker容器技术(三)_第3张图片

        2、复制文件至容器

docker cp 文件名 容器名或ID:/拷贝路径

         3、容器监控

查看容器运行进程 docker top 容器名称或ID

查看容器资源使用 docker stats 容器名称或ID

         4、容器日志管理

• 查看容器日志命令:docker logs [OPTIONS] CONTAINER

        选项: --details:显示更为详细的日志信息。

                    --follow(-f):跟踪日志输出。

                    --since:显示自某个开始时间的所有日志。

                    --tail:仅列出最新的N条容器日志。

                    --timestamps(-t):显示时间戳。

                    --until:显示到某个截止时间的所有日志。

 • 配置容器的日志驱动:--log-driver

Docker学习第三天——Docker容器技术(三)_第4张图片

二、Docker网络基础

        1、 Docker容器网络模型:

Docker学习第三天——Docker容器技术(三)_第5张图片

▪ 沙箱(SandBox):包含容器的网络栈配置,涉及容器的接口、路由表和DNS设置的管理。

▪ 端点(Endpoint):将沙箱连接到网络。

▪ 网络(Network):CNM并没有定义OSI模型中的网络层,这里的网络可以由Linux网桥、虚拟局域网(Virtual Local Area Network,VLAN)等来实现。

         2、Docker本地网络驱动:

▪ bridge:桥接网络,这是默认的网络驱动程序。

▪ host:主机网络,通过该驱动容器可以使用主机的网络栈。

▪ overlay:该驱动组合使用本地Linux桥接网络和VxLAN技术,在物理网络架构之上叠加一个容器之间的通信连接。

▪ macvlan:该驱动使用macvlan桥接模式建立容器接口和主机接口之间的连接,为容器提供在物理网络中可路由的IP地址。

▪ none:表示关闭容器的所有网络连接。

       3、选择Docker网络驱动的基本原则:

▪ 用户自定义桥接网络最适合用于同一个Docker主机上运行的多个容器之间需要通信的场景。

▪ host网络最适用于当网络栈不能与Docker主机隔离,而容器的其他方面需要被隔离的场景。

▪ overlay网络适用于不同Docker主机上运行的容器需要通信的场景,或者多个应用程序通过Swarm集群服务一起工作的场景。

▪ macvlan网络适用于从虚拟机迁移过来的场景,或者容器需要像网络上的物理机一样,拥有独立MAC地址的场景。

▪ 第三方网络插件适用于将Docker与专用网络栈进行集成的场景。

         4、单主机与多主机的Docker网络

• 从覆盖范围上,可以将Docker网络划分为单主机的网络和跨主机的网络。

• Docker无论是在单主机上进行部署,还是在多主机的集群上部署,都需要和网络打交道。

• 对于大多数单主机部署来说,可以使用网络在容器之间和容器与主机之间进行数据交换。

• 由于单主机的能力有限,实际应用中多主机部署通常是很有必要的。

        5、 docker run命令的网络配置用法

• 设置容器网络连接:--network

• 设置IP地址:--ip或--ip6 明确指定所分配的IP地址

• 设置MAC地址:--mac-address

• 设置容器DNS与主机名:

        ◇ 默认情况下,容器继承Docker守护进程的DNS设置。

        ◇ --dns选项为容器设置DNS服务器的IP地址。

        ◇ --dns-search选项为容器指定一个DNS搜索域,用于搜索非全称主机名。

        ◇ --hostname选项为容器指定自定义的主机名。

• 设置容器的发布端口和连接:-p(--publish)或-P(--publish-all)

         6、docker network命令的网络配置用法

• docker network connect:将容器连接到指定的网络。

• docker network create:创建一个网络。

• docker network disconnect:断开容器与指定网络的连接。

• docker network inspect:显示一个或多个网络的详细信息。

• docker network ls:显示网络列表。

• docker network prune:删除所有未使用的网络。

• docker network rm:删除一个或多个网络。

三、配置容器的网络连接

Docker学习第三天——Docker容器技术(三)_第6张图片

        1、概述

 ◇ 桥接网络通过软件网桥让连接到同一桥接网络的容器之间可以相互通信,同时隔离那些没有连接到该桥接网络的容器。

◇ 桥接网络用于运行在同一Docker主机上的容器之间的通信。

        2、应用场合

 •  bridge是Docker的默认网络模式,Docker容器拥有独立、隔离的网络栈。容器不具有一个公有IP,因为主机的IP地址与veth对的IP地址不在同一个网段内。

• Docker采用NAT(网络地址转换)方式将容器内部服务监听的端口与主机的某一个端口进行绑定,使得主机以外的节点可以将包发送至容器内部。外界访问容器内的服务时,需要访问主机的IP地址以及主机的端口。

• 默认桥接网络作为Docker传统方案将来可能会被弃用,只适合一些演示或实验场合,不建议用于生产用途。

        3、配置实例

         默认情况下,容器被连接到默认桥接网络,这些容器之间可以进行通信,但只能通过容器IP地址进行通信。容器之间如果要通过容器名称进行通信,需要使用传统的选项--link进行连接。

        ①docker network ls命令列出当前已有的网络。

[root@goodwood ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
69d27db6e1df   bridge    bridge    local
aaada6e5f29b   host      host      local
304839a4ee25   none      null      local

        ②启动两个运行ash的alpine容器,并查看brige网络的详细信息系。

[root@goodwood ~]# docker run -dit --name alpine1 alpine ash
75fc1f0d9a59def26a8e73e8aeeab4dfc414a966cebeb995f7722c7e8707626e
[root@goodwood ~]# docker run -dit --name alpine2 alpine ash
9151c63b6375d69bde3731153ede4cb3e1b02c35bc491f37e71a08df863515bc
[root@goodwood ~]# docker ps -a
CONTAINER ID   IMAGE                       COMMAND       CREATED             STATUS                        PORTS     NAMES
9151c63b6375   alpine                      "ash"         6 seconds ago       Up 5 seconds                            alpine2
75fc1f0d9a59   alpine                      "ash"         10 seconds ago      Up 9 seconds                            alpine1
[root@goodwood ~]# docker network inspect bridge

可以看到:

 Docker学习第三天——Docker容器技术(三)_第7张图片

③通过docker attach命令连接alpine1容器,尝试检查其网络及与alpine2容器的连接状态:

[root@goodwood ~]# docker attach alpine1
/ # ping -c 4 www.baidu.com
PING www.baidu.com (220.181.38.150): 56 data bytes
64 bytes from 220.181.38.150: seq=0 ttl=127 time=31.299 ms
64 bytes from 220.181.38.150: seq=1 ttl=127 time=40.642 ms
64 bytes from 220.181.38.150: seq=2 ttl=127 time=37.574 ms
64 bytes from 220.181.38.150: seq=3 ttl=127 time=36.690 ms

--- www.baidu.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 31.299/36.551/40.642 ms
/ # ping 172.17.0.5
PING 172.17.0.5 (172.17.0.5): 56 data bytes
64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.155 ms
64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.104 ms
64 bytes from 172.17.0.5: seq=2 ttl=64 time=0.104 ms
^C
--- 172.17.0.5 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.104/0.121/0.155 ms
/ # exit

④ 容器间通信,方法一:修改容器内hosts文件:

/ # ping 172.17.0.5
PING 172.17.0.5 (172.17.0.5): 56 data bytes
64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.235 ms
64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.105 ms
^C
--- 172.17.0.5 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.105/0.170/0.235 ms
/ # echo "172.17.0.5 alpine" >> /etc/hosts
/ # ping alpine
PING alpine (172.17.0.5): 56 data bytes
64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.130 ms
64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.093 ms
64 bytes from 172.17.0.5: seq=2 ttl=64 time=0.098 ms
^C
--- alpine ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.093/0.107/0.130 ms

        方法二:创建容器时使用--link选项在源容器与接收容器之间建立一个安全通道:

[root@goodwood ~]# docker run -itd --name alpine3 --link alpine2 alpine ash
f20c54c065d2e677c1f0b3f2dd106d29e3293d0a7567749726fa113f0ecd9208
[root@goodwood ~]# docker exec -it alpine3 ash
/ # ping alpine2
PING alpine2 (172.17.0.5): 56 data bytes
64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.237 ms
64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.110 ms
64 bytes from 172.17.0.5: seq=2 ttl=64 time=0.111 ms
^C
--- alpine2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.110/0.152/0.237 ms
/ # 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.5      alpine2 9151c63b6375
172.17.0.3      f20c54c065d2

        该方法实际与修改hosts文件一致,所以接收容器上无法通过ping源容器的别名来连接。

你可能感兴趣的:(docker,学习,容器)