Docker Architecture
docker使用了C/S架构,docker client通过REST API与docker daemon通讯,docker server担当构建image、运行,分发container的职责。
二者可以在同一个系统当中,也可以使用docker client连接远端daemon进行管理
Containers and virtual machines
container 运行在linux上,共享一个linux内核
相反,虚拟机具有完整的操作系统,虚拟机提供的环境超出了一个应用所需
VM@2x.png
Docker network
Docker network 通过network drivers扩展
-
bridge
: 默认的network driver,用于独立的container与外界通讯 -
host
: 打破container与docker host的网络隔离,使container直接使用host的网络 -
overlay
: 用于多个container之间的通讯,时docker swarm service间通讯的实现方式 -
maclan
: 可以通过maclan为container分配MAC地址,使得container直接与物理网络相连,而不需要经过主机路由 -
none
: 禁止container所有网络 - Network plugins
bridge与overlay
- bridge用于单个主机上多个container直接的通讯
- overlay用于多个主机上多个container之间通讯
Bridge Networkk
1517801503362.png在默认情况下,每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成了数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0 网桥中。我们可以使用如下的命令来查看当前网桥的接口:
$ brctl show
docker0 会为每一个容器分配一个新的 IP 地址并将 docker0 的 IP 地址设置为默认的网关。网桥 docker0 通过 iptables 中的配置与宿主机器上的网卡相连,所有符合条件的请求都会通过 iptables 转发到 docker0 并由网桥分发给对应的机器。
$ iptables -t nat -L
用户定义bridge和默认bridge区别
- 用户定义提供DNS服务,container之间可以通过name或alias访问
- container在运行时可以从用户定义的bridge离开
- 默认bridge使用link可以共享环境变量,用户定义bridge可以通过以下方式共享变量
- 共享数据卷
- docker-compose中指定变量
- docker secret
user-defined bridge使用
创建/删除
$ docker network create my-net
$ docker network rm my-net
创建时连接container
$ docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
连接正在运行的container
$ docker network connect my-net my-nginx
#断开连接
$ docker network disconnect my-net my-nginx
开启container外界请求转发
$ sysctl net.ipv4.conf.all.forwarding=1
$ sudo iptables -P FORWARD ACCEPT
overlay network
packetwalk.pngoverlayarch.png
Docker 数据管理
默认情况下,在docker内创建的所有文件都存储在container的读写层中
- 当container停止时数据也一起销毁,难以持久化
- container的读写层与主机紧密耦合,数据难以转移
docker提供了两种数据持久化方式
- volumes
- bind mounts
- tmpfs mount (linux)
volumes、bind mount、tmpfs mount区别
- volumes存储在由docker管理的主机文件系统当中(/var/lib/docker/voumes/ on Linux),非docker进程无法修改该文件系统,volumes是docker数据持久化的最佳方式。volumes还可以通过drivers挂在cloud上
- bind mount可以存储在主机系统的任何地方,非docker进程可以对这些文件进行修改
-
tmpfs mount 存储在主机的memory当中,docker swarm 通过这种方式将secret挂载到container上
types-of-mounts.png
use volumes
-v
和 --mount
-
-v
: <volumes-name>:<container-path>:<options> -
--mount
: <key>:
*type
:bind
,volume
,tmpfs
*source
: volumes name
*destination
: container path
*readonly
*volume-opt
Create a volume
$ docker volume create my-vol
# list volumes
$ docker volume ls
# inspect a volume
$ docker volume inspect my-vol
# Remove a volume
$ docker volume rm my-vol
Start a container with a volume
$ docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
Start a service with volumes
$ docker service create -d \
--replicas=4 \
--name devtest-service \
--mount source=myvol2,target=/app \
nginx:latest
网友评论