docker_practice从入门到实践总结

来源:互联网 发布:网络优化与维护 编辑:程序博客网 时间:2024/06/05 08:55
docker主要用于云计算,目标是实现操作系统虚拟化,直接利用了系统内核,这样可以复用本机操作系统,提高系统资源的利用率;
传统虚拟化是硬件虚拟化,一个应用对应一个虚拟机,对系统资源的利用率不高。

docker将软件与其“依赖的环境”打包在一起,以镜像的方式交付,让软件运行在“标准的环境”中,这非常符合云计算的要求。

我们交付的东西不再只是代码、配置文件、数据库定义等,而是整个应用程序运行环境:OS+各种中间件、类库+应用程序代码。
以前我们发布的只是代码,现在我们发布的是代码+环境,可以消除线上线下环境不一致的问题。

docker是跨平台的。

docker基本概念:
镜像(Image)
容器(Container)
仓库(Repository)
    |----镜像:
           镜像可以用来创建容器,是一个只读模板,包含完整的操作系统环境(可以理解为创建/启动容器的配置文件)。
    |----容器
           容器是从镜像创建的运行实例,可以看做是一个简易版的Linux环境和运行在其中的应用程序。
           镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
    |----仓库
           仓库是用来存放镜像的地方。仓库注册服务器上往往存放着 多个仓库,每个仓库中又包含多个镜像,每个镜像有不同的标签。
           仓库类似Git,注册服务器类似GitHub这样的托管服务。

镜像是一个模板,用来创建容器;
容器类似简易的Linux环境(和运行其中的应用),可以运行应用程序;
仓库用来存放镜像,类似Git。
镜像和容器的关系可以看做类和对象的关系。

仓库中存放镜像,镜像用来创建容器,容器中运行应用程序。

数据管理:
    |----数据卷
           数据卷是一个特殊的目录,可以挂载到容器中,供多个容器共享和使用。
           数据卷是独立于容器的,默认会一直存在,即使容器被删除。
           可以挂载主机目录或主机文件作为数据卷,一般挂载主机目录作为数据卷。
    |----数据卷容器
           数据卷容器本质上就是一个正常的容器,专门用来提供数据卷供其他容器挂载。

使用网络:
    |----外部访问容器(访问容器中的web应用)
           本机访问容器中的网络应用,可以进行端口映射(本机端口-容器开放的网络端口):
           随机映射本机端口-容器端口;
           映射所有本机端口-容器端口;
           映射指定地址的指定端口-容器端口;
           映射指定地址的任意端口-容器端口。
    |----容器互联
           源容器(子容器)-接收容器(父容器)
           可以链接多个父容器到子容器。

高级网络配置:
    |----docker虚拟网桥docker0
           主要用于容器跟主机交换数据,从而间接实现容器跟容器、容器跟外部主机进行数据交换(当然容器跟容器间也可通过端口直接通信)。

    |----配置DNS
           默认配置:通过/etc/resolv.conf进行更新
           手动配置:
           -h HOSTNAME or --hostname=HOSTNAME
           --link=CONTAINER_NAME:ALIAS
           --dns=IP_ADDRESS
           --dns-search=DOMAIN
    |----容器访问控制
           通过Linux本机上的iptables防火墙进行管理和实现。
               |----容器访问外部网络
                      检查本机Linux系统中net.ipv4.ip_forward是否打开,可以通过--ip-forward=true设置。
               |----容器之间访问
                   |----访问所有端口
                          当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链 上。
                          --icc=true  (缺 省值):策略为通过( ACCEPT  )
                          --icc=false:策略为禁止( DROP  )
                          --iptables=false:不会添 加  iptables  规则
                   |----访问指定端口
                          当-icc=false --iptables=true时通过-- link=CONTAINER_NAME:ALIAS,Docker 会在  iptable  中为两个容器分别添加一条  ACCEPT  规则,允许相 互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。
    |----端口映射实现
           |----映射容器端口到宿主主机的实现
                  默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容 器。
                  |----容器访问外部实现
                         容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。
                  |----外部访问容器实现
                         其实也是在本地的  iptable  的 nat 表中添加相应的规则。
    |----配置docker0网桥
           --bip=CIDR  -- IP 地址加掩码格式,例如 192.168.1.5/24:配置docker0  接口 的 IP 地址和子网掩码
           --mtu=BYTES  -- 覆盖默认的 Docker mtu 配置
           每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分 配给容器的 eth0 端口。
           使用本地主机上  docker0  接口的 IP 作为所有容器的默认 网关。
    |----自定义网桥
           (1)在启动 Docker 服务的时候,使用  -b BRIDGE  或 --bridge=BRIDGE  来指定使用 的网桥。
           (2)如果服务已经运行,那需要先停止服务,并删除旧的网桥。
                   然后创建一个网桥  bridge0  。
                   查看确认网桥创建并启动。
                   配置 Docker 服务,默认桥接到创建的网桥上。
                   启动 Docker 服务。 新建一个容器,可以看到它已经桥接到了  bridge0  上。
    |----工具和示例
    |----编辑网络配置文件
    |----示例:创建一个点到点连接
           解决办法很简单:创建一对  peer  接口,分别放到两个容器中,配置成点到点链 路类型即可。

实战案例:
    |----使用 Supervisor 来管理进程
           方法:
           创建一个Supervisor容器运行ssh和apache服务,然后创建自己的容器使用-p进行端口映射(映射到Supervisor 容器的服务端口),这
样就能在自己的容器中同时访问 ssh 和 apache 服务了。
    |----创建 tomcat/weblogic 集群
           以创建tomcat集群为例:
           (1)将jdk、tomcat等安装软件放到本机home目录下,然后将本机home目录挂载到容器的 /opt/data 目录;
           (2)在supervisor的配置文件中添加tomcat项,用于映射到supervisor容器;
           (3)新建tomcat镜像的dockerfile,并配置好容器和本机的映射端口;
           (4)根据dockerfile创建镜像,根据镜像创建容器,所有的tomcat容器都可访问supervisor容器的tomcat服务,从而创建了tomcat集群。
    |----多台物理主机之间的容器互联
           (1)同一台主机上的容器互联:
           通过虚拟网桥docker0将容器连接起来。
           (2)容器与外部网络互联:
           主机上的容器通过 nat 连接外网,如果要让外网 连接到容器中,就需要做端口映射,即 -p 参数。
           (3)不同物理主机上的容器互联:
           如果在企业内部应用,或者做多个物理主机的集群,可能需要将多个物理主机的容 器组到一个物理网络中来,那么就需要将这个网桥桥接到我们指定的网卡上。

    |----标准化开发测试和生产环境

安全:
    |----内核名字空间
    |----控制组
    |----Docker服务端的防护
    |----内核能力机制
    |----其它安全特性

Dockerfile:
    |----基本结构
           一般分为四部分:镜像信息、维护者信息、镜像指令、容器指令
    |----指令
           FROM、MAINTAINER、RUN、CMD
           EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD
    |----创建镜像
           docker build

底层实现:
    |----基本架构
    |----名字空间
    |----控制组
    |----联合文件系统
    |----容器格式
    |----Docker 网络实现
           docker网络利用虚拟网桥实现:
           docker创建容器的时候会创建一对虚拟接口,分别放到本地主机和容器中;
           主机端接口名为vethXXX,容器端接口名为eth0,如下图所示:

           Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口 的发送缓存中的数据包被直接复制到接收接口的接收缓存中。
          (虚拟网桥本身就是利用了Linux内核)

CoreOS项目:
CoreOS还是比较好的,可以关注关注







0 0
原创粉丝点击