数据管理
在容器中管理数据主要有两种方式:
- 数据卷(Volumes)
- 挂载主机目录(Bind mounts)
数据卷
数据卷
是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷
可以在容器之间共享和重用- 对
数据卷
的修改会立马生效 - 对
数据卷
的更新,不会影响镜像 数据卷
默认会一直存在,即使容器被删除
数据卷的操作
docker volume create
命令:创建数据卷。
1 | C:\Users\63544>docker volume create my-vol |
docker volume ls
命令:查看所有的数据卷。
1 | C:\Users\63544>docker volume ls |
docker volume inspect
命令:查看指定数据卷。
1 | C:\Users\63544>docker volume inspect my-vol |
在用
docker run
命令的时候,使用--mount
标记来将数据卷
挂载到容器里。在一次docker run
中可以挂载多个数据卷
。在用
docker run
命令的时候,使用--mount
标记来将数据卷
挂载到容器里。在一次docker run
中可以挂载多个数据卷
。
1 | --mount source=数据卷名,target=容器目录 |
docker volume rm
命令:删除数据卷。docker volume prune
命令:删除所有无主的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用docker rm -v
这个命令。
挂载主机目录
- 使用
--mount
标记可以指定挂载一个本地主机的目录到容器中去。
1 | --mount type=bind,source=主机目录,target=挂载点 |
也可以挂载一个主机文件到容器中:
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 网桥下,可以通过服务名(容器名)直接网络通信,而不使用 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(容器端),成对匹配。
host
使用–network host 指定,该模式直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。
容器将不会获得一个独立的 Network Namespace, 而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
注意:
在使用 host 模式时,无法使用 -p 进行端口映射(会发生 warning),端口映射不起作用。
none
使用–network none 指定,在 none 模式下,并不为 Docker 容器进行任何网络配置。
也就是禁用网络功能,只有lo标识(127.0.0.1,表示本地回环地址)。
container
使用 –network container:NAME或者容器ID 指定。
新建的容器和已经存在的一个容器共享一个网络 ip 配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。