美文网首页
2018-06-29

2018-06-29

作者: AzxWy | 来源:发表于2018-06-29 19:10 被阅读0次

    Docker Architecture

    docker使用了C/S架构,docker client通过REST API与docker daemon通讯,docker server担当构建image、运行,分发container的职责。
    二者可以在同一个系统当中,也可以使用docker client连接远端daemon进行管理

    Docker Architecture

    Containers and virtual machines

    container 运行在linux上,共享一个linux内核
    相反,虚拟机具有完整的操作系统,虚拟机提供的环境超出了一个应用所需

    Container@2x.png
    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

    docker 实现原理架构

    packetwalk.png
    overlayarch.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
    

    相关文章

      网友评论

          本文标题:2018-06-29

          本文链接:https://www.haomeiwen.com/subject/lgfayftx.html