Docker的网络与数据管理
Docker的网络管理
1、Docker默认的网络管理
使用下列命令查看Docker中的所有网络。
$ docker network ls
- (1) 创建并启动容器(容器名为networktest,镜像名为ubuntu),在终端窗口中执行如下命令:
$ docker run -itd --name=networktest ubuntu
- (2)使用网络查看指令查看网络详情:
$ docker network inspect birdge
2、Docker默认的网络管理
-
创建自定义网络
(1) 创建一个基于bridge驱动的名称为isolated_nw的网络(–driver bridge可以省略,默认使用bridge的驱动创建网络):
$ docker network create --driver bridge isolated_nw
(2) 创建网络完成后,查看是否创建成功:
$ docker network ls
(3) 创建网络完成后,查看所创建网络的详细信息:
$ docker network inspect isolated_nw
-
创建自定义网络启动容器
(1) 使用isolated_nw网络启动一个容器:
$ docker run --network=isolated_nw -itd --name=nwtest busybox
(2) 创建网络完成后,查看容器网络的详细信息:
$ docker inspect nwtest
-
为容器添加网络管理
(1) 容器已经创建完成,为容器添加其他网络管理方式:
$ docker network connect bridge nwtest
-
断开容器网络连接
(1) 断开nwtest容器的自定义网络isolated_nw:
$ docker network disconnect isolated_nw nwtest
容器之间的网络通信
-
创建容器
(1) 创建两个默认使用bridge网络的容器,容器名分别为container1和container2:
$ docker run -itd --name=container1 busybox
$ docker run -itd --name=container2 busybox
(2) 创建一个使用自定义的isolated_nw网络的容器,容器名为container3:
$ docker run --network=isolated_nw -itd --name=container3 busybox
(3) 为container2容器新增一个自定义的isolated_nw网络连接:
$ docker network connect isolated_nw container2
此时,container2容器同时拥有了bridge和isolated_nw两种网络管理方式
-
容器地址查看
(1) 进入容器container2,使用ifconfig指令查看当前容器被动态分布的IP地址:
$ docker attach container2
(2) 进入容器container1和container3,使用ifconfig指令查看当前容器被动态分布的IP地址:
$ docker attach container1
$ docker attach container3
容器的IP地址如下:
容器名 | eth0 | eth1 |
---|---|---|
container1 | 172.17.0.4 | |
container2 | 172.17.0.3 | 172.18.0.4 |
container3 | 172.18.0.3 |
- 容器通信测试
(1) 使用命令docker attach container1进入容器container1,使用ping指令连接container3来查看是否能够通信:
在container1容器内不管使用“ping -w 4 IP”还是“ping -w 4 容器名称”的指令都无法连通container3。验证了两个容器不再同一网络环境下,无法通信的判断。
(2) 使用命令docker attach container2进入容器container2,使用容器IP分别连接container1和container3进行通信测试:
结论:不同容器之间想要相互通信必须在同一个网络环境下;
默认使用bridge的网络管理的容器可以使用容器IP进行通信,但无法使用容器名进行通信;
使用自定义网络管理的榕树可以同时使用容器IP和容器名进行通信。
注意事项:
想要在默认网络下使用容器名通信,需要使用–link参数:
$ docker run -itd --name=container4 --link container1:c1 busybox
-itd:指定后台交互方式
–link container1:c1 :将新建的container4容器连接到container1容器且为容器container1定义了别名c1
Docker Swarm集群
1、Docker Swarm的使用
- 环境搭建
(1) 准备3台ubuntu系统主机,每台主机都需要安装Docker,且docker的版本为1.12及以上:
(2) 打开虚拟网络编辑器,新添加虚拟网卡VMnet4:
子网IP | 子网掩码 | 网关IP(G) | DHCP | 网络类型 |
---|---|---|---|---|
192.168.1.0 | 255.255.255.0 | 192.168.1.2 | 否 | NET |
(3) 打开主机的网络配置器,修改IP地址和DNS:
主机 | IP地址 | 子网掩码 | DNS |
---|---|---|---|
Ubuntu | 192.168.1.10 | 255.255.255.0 | 8.8.8.8 |
wokr1 | 192.168.1.11 | 255.255.255.0 | 8.8.8.8 |
work2 | 192.168.1.12 | 255.255.255.0 | 8.8.8.8 |
(4) 修改主机名和主机与IP的映射,b并使之生效:
$ sudo vi /etc/hostname //进入配置文件后删除原来的主机名,修改为新主机名
$ sudo /etc/init.d/hostname.sh start //使修改后的主机名生效
$ sudo vi /etc/hosts //进入配置文件后删除原来的映射关系 //修改映射关系为:IP地址 新的主机名
$ sudo /etc/init.d/networking start //使修改后的映射关系生效
主机 | 主机名 | 映射关系 |
---|---|---|
Ubuntu | Manager | 192.168.1.10 Manager |
wokr1 | Work1 | 192.168.1.11 Work1 |
work2 | Work2 | 192.168.1.12 Work2 |
-
创建Docker Swarm集群
(1) 在名为Manager的Docker机器上创建Docker Swarm集群:
$ docker swarm init --advertise-addr 192.168.1.10
(2) 在管理节点,使用docker node ls 指令查看集群节点信息:
-
创建Docker Swarm集群
(1) 启动另外两台Docker机器worker1和worker2,分别打开终端窗口,执行集群中加入工作节点的指令:
$docker swarm join --token SWMTKN-1-0zl5jl17u0odtk29grzm1dju0f8ubd pcg1z4rtyyrd1goon5iq-944d2ybe3zp74srigsi5bjv9k 192.168.1.10:2377docker service ls
(2) 再次在集群管理节点上使用docker node ls 指令查看集群节点信息:
$docker node ls
-
向Docker Swarm 集群部署服务
(1) 使用Docker Hub上自带的alpine镜像为例来部署集群服务:
$ docker service create --replicas 1 --name helloworld alpine ping docker.com
-
查看Docker Swarm 集群中的部署
(1) 当服务部署完成后,在管理节点上通过docker service ls指令查看当前集群中的服务列表信息:
$ docker service ls
(2) 使用docker service inspect指令,查看部署的服务具体详情:
$ docker service inspect helloworld
(3) 使用docker service ps指令查看制定服务在集群节点上的分配和运行情况:
$ docker service ps helloworld
-
更改Docker Swarm 集群服务副本数量
(1) 在管理节点Manager上,更改服务副本数量:
$ docker service scale helloword=5
-
删除服务
(1) 在集群管理节点Manager上对于不需要的服务,进行删除:
$ docker service rm helloworld
-
访问服务
(1) 在集群管理节点Manager上执行docker network ls指令查看网络列表:
$ docker network ls
在集群中发布任务时,如果没有指定网络,那么默认使用ingress网络连接,实际开发中,则会使用自定义为overlay的驱动网络进行网络管理。
(2) 在集群管理节点Manager上,a创建以overlay为驱动的自定义网络:
$ docker network create \
--driver overlay \
my-multi-host-network
(3) 在集群管理节点Manager,部署使用my-multi-host-network网络,服务名为my-web,对外服务端口为80,服务副本数量为2,基于nginx镜像的服务:
$ docker service create \
--network my-multi-host-network \
--name my-web \
--publish 8080:80
--replicas 2 \
nginx
(4) 在集群管理节点Manager上,使用docker service ps my-web指令查看服务的两个副本运行情况:
$ docker service ps my-web
(5) 打开外界浏览器,使用任意一台节点机器“IP+8080”端口进行访问:
Docker数据存储方式
- volumes: 存储在主机文件系统中(在Linux系统下存储在/var/lib/Docker/volumes/目录),并由Docker管理,非Docker进程无法修改文件系统的部分。
- bind mounts:可以存储在主机系统的任意位置,甚至可能是重要的系统文件或目录,在Docker主机或容器上的非Docker进程可以对它们进行任意修改。
- tmpfs mounts:只存储在主机系统的内存中,并没有写入到主机的文件系统中。
Volumes数据卷管理
1、Volumes数据卷使用
-
创建并管理数据卷
(1) 创建数据卷,在Docker主机终端,通过docker volume create指令创建一个名为my-vol的数据卷:
$ docker volume create my-vol
(2) 查看本地数据卷列表:
$ docker volume ls
(3) 核查数据卷,查看my-vol数据卷详情:
$ docker volume inspect my-vol
(4) 删除数据卷,删除my-vol数据卷:
$ docker volume rm my-vol
-
启动容器并加载数据卷
(1) 查看本机容器和数据卷,在Docker主机终端,通过docker ps-a和docker volume ls指令查看本地Docker机器上存在的容器和数据卷:
$ docker ps-a
$ docker volume ls
(2) 确认查看本机Docker文件系统中的容器和数据卷:
使用root用户,进入/var/lib/docker目录,即Docker默认在本机上的文件系统目录,查看信息。
$ su
# cd /var/lib/docker
# ll
此时containers和volumes目录为空
(3) 启动容器挂载数据卷:
使用docker run 指令创建并启动一个容器,同时挂载一个数据卷。
$ docker run -d \
-it \
--name devtest \
--mount source=myvol,target=/app \
busybox:latest
也可以使用-v参数关注数据卷:
$ docker run -d \
-it \
--name devtest \
-v myvol:/app \
busybox:latest
(4) 再次查看本机容器和数据卷列表:
$ docker ps-a
$ docker volume ls
(5)检查容器详情:
$ docker inspect
(6)再次确认本机Docker文件系统中的容器和数据卷:
使用root用户,进入/var/lib/docker目录,即Docker默认在本机上的文件系统目录,然后分别进入containers和volumes目录查看信息。
$ su
# cd /var/lib/docker
# ll
# cd containers
# ll
# cd volumes
# ll
知识点:
-
网络: Docker中默认非集群环境下有三种网络:bridge、host、none
bridge:容器创建时默认的网络管理方式,实现宿主机与互联网的通信功能。
host、none:属于无网络,容器添加这两个网络时不能与外界通信。
Docker Swarm集群网络列表中增加了一个以bridge和overlay为驱动的网络。在集群中发布服务时,如果没有指定网络,那么默认使用ingress网络连接,在实际开发中,则会使用自定义的overlay驱动网络进行服务连接。 -
Docker数据存储: 默认情况下,Docker中的数据存放在容器层,有较多的缺点
当容器不运行的时候,容器中的数据无法持久保持,很难从容器中获取数据;
当容器与正在运行的主机结合,不能轻易地移动数据;
容器层需要一个存储驱动程序来管理文件系统,存储驱动程序提供了一个使用Linux内核的联合文件系统,这种额外的抽象化降低了性能。 -
–mount的参数
-
type (挂载的类型):可以为bind、volume或tmpfs。
-
source (挂载源):数据卷名称,对匿名数据卷来说,该字段被省略,该字段可以用source或src表示。
-
destination (挂载点):将文件或目录挂载到容器中的具体路径,该字段可用destination、dst或target。
-
readonly :表示只读。
-
-v (-volume的缩写) 参数
-
命名卷:第一个字段为数据卷的名称,在给定的主机中是唯一的;
匿名卷:省略第一个字段。 -
第二个字段为在容器中挂载数据的文件或目录的路径。
-
第三个字段是可选字段,为逗号分隔的参数列表,如ro(readyonly,即只读)
注:–mount的参数的顺序可以改变,-v的参数不能改变。