Dawn's Blogs

分享技术 记录成长

0%

Docker学习笔记 (4) 数据管理和网络

数据管理

在容器中管理数据主要有两种方式:

  • 数据卷(Volumes)
  • 挂载主机目录(Bind mounts)

数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立马生效
  • 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

数据卷的操作

  • docker volume create 命令:创建数据卷。
1
2
C:\Users\63544>docker volume create my-vol
my-vol
  • docker volume ls 命令:查看所有的数据卷。
1
2
3
C:\Users\63544>docker volume ls
DRIVER VOLUME NAME
local my-vol
  • docker volume inspect 命令:查看指定数据卷。
1
2
3
4
5
6
7
8
9
10
11
12
C:\Users\63544>docker volume inspect my-vol
[
{
"CreatedAt": "2022-05-12T13:46:43Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
  • 在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷

  • 在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷

1
2
3
--mount source=数据卷名,target=容器目录
# 等价于
-v 数据卷名:容器目录
  • docker volume rm 命令:删除数据卷。docker volume prune 命令:删除所有无主的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

挂载主机目录

  • 使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。
1
2
3
--mount type=bind,source=主机目录,target=挂载点
# 等价于
-v 宿主机绝对路径目录:容器内挂载点

也可以挂载一个主机文件到容器中:

1
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history

这样就可以记录在容器输入过的命令了。

docker 目录主机目录/数据卷出现 cannot open directory. Permission denied 错误,解决方法:

加上 –privileged=true 参数。在SELinux里面挂载目录被禁止了,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题。即使用该参数,container内的root拥有真正的root权限;否则,container内的root只是外部的一个普通用户权限。

读写权限设置:

  • 读写(read write,rw):容器可以对主机目录/数据卷进行读写操作,默认。

    1
    -v /宿主机绝对路径目录或者数据卷名:/容器内目录:rw
  • 只读(read only,ro):容器实例内部被限制,只能读取不能写。

    1
    -v /宿主机绝对路径目录或者数据卷名:/容器内目录:ro

网络

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥。同时,Docker 随机分配一个本地未占用的私有网段中的一个地址给 docker0 接口。此后启动的容器内的网口也会自动分配一个同一网段的地址。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络:

Docker 网络

介绍

作用

Docker 网络的作用如下:

  • 容器间的互联通信端口映射

  • 把多个容器放在同一个 Docker 网桥下,可以通过服务名(容器名)直接网络通信,而不使用 IP 地址。

外部访问容器

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

  • 当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
  • -p 则可以指定要映射的端口。

容器互联

  • docker network create -d bridge my-net 命令:创建网络。
  • docker run 运行容器时,可以使用 --network 加入到一个网络中。

多个容器可以加入到同一个网络中,实现容器之间的互联。

常用命令

docker 网络的常用命令如下:

  • 新建网络(网桥):docker network 网络名字

  • 查看网络:docker network ls

  • 查看网络信息:docker network inspect 网络名字

  • 删除网络:docker network rm 网络名字

网络模式

网络模式有四种,分别是:

  • bridge 模式
  • host 模式
  • none 模式
  • container 模式

bridge

使用 –network bridge 指定,默认使用 docker0。docker run 的时候,没有指定 network 的话默认使用的网桥模式就是 bridge,使用的就是 docker0。

Docker 在宿主机虚拟一个 Docker 容器网桥(默认 docker0),Docker 启动一个容器时会根据 Docker 网桥的网段分配给容器一个 IP 地址,称为 Container-IP,同时 Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信

网桥创建一对对等虚拟设备接口一个叫 veth(网桥端),另一个叫 eth0(容器端),成对匹配。

image-20221228163656973

host

使用–network host 指定,该模式直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

容器将不会获得一个独立的 Network Namespace, 而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

image-20221228164308411

注意:

在使用 host 模式时,无法使用 -p 进行端口映射(会发生 warning),端口映射不起作用。

none

使用–network none 指定,在 none 模式下,并不为 Docker 容器进行任何网络配置

也就是禁用网络功能,只有lo标识(127.0.0.1,表示本地回环地址)。

container

使用 –network container:NAME或者容器ID 指定

新建的容器和已经存在的一个容器共享一个网络 ip 配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

image-20221228164705206