- docker数据管理
- 数据卷volumes
- 可供一个或多个容器使用的特殊目录,可以在容器之间共享,对数据卷的修改会立即生效且不会影响镜像,与容器声明周期独立,即容器删除数据卷也可存在,可以在删除容器的时候使用 docker rm -v 这个命令,删除容器的同时移除数据卷
- docker volume create my-volume 创建数据卷
- docker volume ls 查看全部数据卷
- docker volume inspect my-volume查看指定数据卷
$ docker run -d -P \ --name web \ --mount source=my-volume,target=/webapp \ training/webapp \ python app.pyq
- 启动一个挂载数据卷的容器,将容器的webapp目录挂载到my-volume数据卷,可以通过docker inspect web查看web容器的信息,type是volume
- 挂载主机目录 bind mounts
- 使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。
$ docker run -d -P \ --name web \ # -v /src/webapp:/opt/webapp \ --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \ training/webapp \ python app.py
加载主机的/src/webapp目录到容器的/opt/webapp目录,主机的路径需要是绝对路径,默认权限是读写,也可以增加readonly指定为只读
- docker inspect web, type是bind
- 使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。
- 数据卷volumes
- docker网路管理,docker允许外部访问容器或容器互联的方式来提供网络服务
- 外部访问容器
- docker run -d -P training/webapp python app.py ,当使用-P标识时,docker会随机映射49000-49900的主机端口到内部容器开放的网络端口,此时访问主机的端口即可访问容器内提供的应用,-p则可以指定主机要映射的端口
-
-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式
有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。可以使用多次绑定多个端口 - 映射所有接口地址,hostPort:containerPort
- 映射到指定地址的指定端口 ip:hostPort:containerPort
- 映射到指定地址的任意端口 ip::containerPort ,本地主机会自动分配一个端口
- 查看映射端口配置,可以查看到绑定的地址
$ docker port nostalgic_morse 5000 127.0.0.1:49155.
- 容器互联
- 新建网络 docker network create -d bridge my-net,-d参数可以指定docker网络类型,有bridge和overlay,其中overlay用于集群模式
- 连接容器 docker run -it --rm --name busybox1 --network my-net busybox sh, docker run -it --rm --name busybox2 --network my-net busybox sh,则两个容器简历了互联,进入busybox1,执行 ping busybox2
- docker compose 多个容器互联
- 配置DNS,如何自定义容器的主机名和dns,docker利用虚拟文件挂载容器的3个相关配置文件,使用mount查看挂载信息
$ mount /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ... tmpfs on /etc/resolv.conf type tmpfs ...
这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过/etc/resolv.conf 文件立刻得到更新。
- 外部访问容器
- 高级网络配置
- docker网络
当docker启动时,会自动在
- 上创建一个
- 的虚拟网桥,实际上是linux的一个
- ,它会在挂载到它的网口之间进行转发。
-
- 同时docker随机分配一个本地未占有的私有网段地址给docker0接口,此后启动的容器内的网口也会自动分配同一个网段的地址。
- 当创建一个docker容器的时候,同时会创建一堆veth pair接口,当数据包发送到一个接口时,另一个接口也可以接受相同的数据包。
- 这对接口一端在容器内,即eth0,,另一端在主机并被挂载到docker0网桥,名称以veth开头,通过这种方式,主机和容器可以互相通信
- docker就创建了主机和所有容器之间一个虚拟共享网络
-
- 快速配置指南
-
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
-b BRIDGE 或 --bridge=BRIDGE 指定容器挂载的网桥
--bip=CIDR 定制 docker0 的掩码
-H SOCKET... 或 --host=SOCKET... Docker 服务端接收命令的通道
--icc=true|false 是否支持容器之间进行通信,最好是关闭
--ip-forward=true|false 请看下文容器之间的通信
--iptables=true|false 是否允许 Docker 添加 iptables 规则
--mtu=BYTES 容器网络中的 MTU -
下面2个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker 服务启动
的时候指定则会成为默认值,后面执行 docker run 时可以覆盖设置的默认值。
--dns=IP_ADDRESS... 使用指定的DNS服务器
--dns-search=DOMAIN... 指定DNS搜索域 -
最后这些选项只有在 docker run 执行时使用,因为它是针对容器的特性内容。
-h HOSTNAME 或 --hostname=HOSTNAME 配置容器主机名
--link=CONTAINER_NAME:ALIAS 添加到另一个容器的连接
--net=bridge|none|container:NAME_or_ID|host 配置容器的桥接模式
-p SPEC 或 --publish=SPEC 映射容器端口到宿主主机
-P or --publish-all=true|false 映射容器所有端口到宿主主机
-
- 容器访问控制
- 容器的访问控制,主要通过linux的iptables防火墙来进行管理和实现。
- 容器访问外部网络,需要本地系统的转发支持,sysctl net.ipv4.ip_forward 检查转发是否打开,如果net.ipv4.ip_forward = 1 ,则打开
- 容器之间访问,容器的网络拓扑是否已互联,所有容器都会被连接到docker0网桥上;本地系统的iptables是否允许通过
- 访问所有端口,启动docker服务的时候,默认会添加一条转发策略到iptables的forward链上,默认情况下,不同容器之间允许网络互通
- 访问指定端口,在通过 -icc=false 关闭网络访问后,还可以通过 --link=CONTAINER_NAME:ALIAS 选项来访问容器的开放端口,最终会在iptables中为两个容器添加一条accept规则,允许相互访问开放的端口
- 容器端口映射到主机的实现
- 默认情况下,容器可以访问外部,外部不能访问容器
- 容器访问外部实现,容器所有到外部网络的连接,原地址都会被nat转换成本地系统的ip地址,这是使用iptables的源地址伪装操作实现的。
$ sudo iptables -t nat -nL ... Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 ...
上述规则将所有源地址在172.17.0.0/16网段,目标地址为其他网段的流量动态伪装为从系统网卡发出
- 外部访问容器实现,可以在docker run时候通过-P -p参数来启用,本质是在本地的iptable的nat表中添加相应规则
$ iptables -t nat -nL ... Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17. 0.2:80
这里的规则映射成了0.0.0.0,意味着接受主机来自所有接口的流量,可以通过-p IP:host_port:container_port 或 -p IP::port 来指定允许访问容器的主机上的 IP、接口等
- 配置docker0网桥
- docker服务默认创建了一个docker0的网桥,其上有一个docker0内部接口,它在内核层联通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到一个物理网络。
- docker默认指定了docker接口的ip地址和子网掩码,让主机和容器可以通过网桥相互通信,还给出了mtu,接口允许接收的最大传输单元
- 由于docker网桥是linux网桥,用户可以使用brctl show来查看网桥和端口连接信息
$ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.3a1d7362b4ee no veth65f9 vethdda6
每次创建一个新容器的时候,docker从可选的地址段中选一个空闲ip给容器的eth0端口,使用本机上docker0接口的ip作为所有容器的默认网关
- 自定义网桥
- 用户可以指定网桥来连接容器和主机,使用-b 指定使用的网桥
- 快速配置指南
标签:容器,存储,--,主机,端口,网络,网桥,docker From: https://www.cnblogs.com/weizhenlu/p/17030923.html