《从Docker到Kubernetes》总结二:Docker相关知识简述

https://www.bilibili.com/video/av56101144

Docker配置文件、日志

Docker配置文件(Cent OS 7):/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/docker daemon -H fd:// -H=unix:///var/run/docker.sock -H=tcp://0.0.0.0:2375 --registry-mirror=http://4bc5abeb.m.daocloud.io --selinux-enabled=true
[Service] – 代理设置
Environment=“HTTP_PROXY=http://xxxxcom:8080”
Environment=“HTTPS_PROXY=http://xxxcom:8080”
Type=notify
ExecStart=/usr/bin/docker daemo

重要参数解释:

OPTIONS 用来控制Docker Daemon进程参数
-H 表示Docker Daemon绑定的地址, -H=unix:///var/run/docker.sock -H=tcp://0.0.0.0:2375
–registry-mirror表示Docker Registry的镜像地址–registry-mirror=http://4bc5abeb.m.daocloud.io
–insecure-registry表示(本地)私有Docker Registry的地址, --insecure-registry ${pivateRegistyHost}:5000
–selinux-enabled是否开启SELinux,默认开启 --selinux-enabled=true
–bip 表示网桥docker0使用指定CIDR网络地址,–bip=172.17.42.1
-b 表示采用已经创建好的网桥, -b=xxx
OPTIONS=-H=unix:///var/run/docker.sock -H=tcp://0.0.0.0:2375 --registry-mirror=http://4bc5abeb.m.daocloud.io --selinux-enabled=true
下面是代理的设置
http_proxy=xxxxx:8080
https_proxy=xxxxxx:8080

Docker的日志文件写入到 /var/log/message里

docker服务一定要在前台执行:https://segmentfault.com/q/1010000009581818/a-1020000009583973

自定义镜像

两种方法:将容器变成镜像、Buildfile

  • 将容器变成镜像:
docker commit <container> [repo:tag]

好处是方便快速;坏处是不规范,无法自动化

适合在本地测试使用

  • Buildfile就是标准做法:docker build -t 镜像名称;

容器编译过程中,指令是在容器执行的而不是Linux(宿主机)

Buildfile最常用指令:run、env、MAINTAINER、from

如果要上网,需要设置代理,如百度:

ENV http_proxy=http:///xxxx
RUN curl http://baidu.com

案例:制作ubuntu+java+tomcat+ssh server镜像

FROM ubuntu
MAINTAINER pdc "[email protected]"
# 更新源,安装ssh server
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
# 设置root ssh远程登录密码为123456
RUN echo "root:123456" | chpasswd
# 添加orache java7源,一次性安装vim,wget,curl,java7,tomcat7等必备软件
RUN apt-get install python-software-properties
RUN add-apt-repository ppa:webupd8team/java
RUN apt-get update
RUN apt-get install -y vim wget curl oracle-java7-installer tomcat7
# 设置JAVA_HOME环境变量
RUN update-alternatives --display java
RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/environment
RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/default/tomcat7
# 容器需要开放SSH 22端口
EXPOSE 22
# 容器需要开放Tomcat 8080端口
EXPOSE 8080
# 设置Tomcat7初始化运行,SSH终端服务器作为后台运行
ENTRYPOINT service tomcat7 start && /usr/sbin/sshd -D

一般一个docker运行一个进程,如果想多个,则一个前台多个后台,比较麻烦;
所以一般使用Supervisor(最佳实践),可以启动多个服务,且作为前台进程执行(docker启动进程),这样其他服务可以后台执行;
还可以将死机了的进程重启,充当监管者的角色

supervisord.conf案例

[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
  • 友好架构

将配置分离,使用Zookeeper、Etcd来集中管理

Docker容器互联

  • 基于Volume的互联

docker文件:分层,最下面层都是只读,最上面加一层可写的

目前,除少数版本如Ubuntu,Docker基本运行在Devicemapper文件系统上

Aufs、DeviceMapper机制:
《从Docker到Kubernetes》总结二:Docker相关知识简述_第1张图片
为什么需要Volume?解决高频写文件操作(大量写日志)

Volume就是宿主机的一个文件夹映射到容器上,直接到此文件夹进行操作

可以多个容器中的Volume指向同一个本机目录,实现基于文件的的共享访问

基于Volume的互联,也可以解决跨主机的共享问题:ISCSI等

  • 基于Link的互联

docker默认是允许container互通,通过-icc=false关闭互通。
一旦关闭了互通,只能通过-link name:alias命令连接指定container.

好处:容器重启时ip会变,但是名字不变,而link会给一个主机名(DNS名称)用来代替IP地址进行访问

link是基于端口隔离的,只开放容器的指定端口

不支持跨主机,只能使用Ambassador代理模式来跨主机

  • 基于网络的互联

Docker网络模型:
《从Docker到Kubernetes》总结二:Docker相关知识简述_第2张图片
中间的docker可以理解为网桥,不过可以有几千个口

最简单常用的互联方式:端口映射(docker run -p “8080:80” 宿主的0.0.0.0:8080 -> 容器80)
《从Docker到Kubernetes》总结二:Docker相关知识简述_第3张图片
类似于做一个监听:

docker run --rm=true --name=mysqlserver -p 8066:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8066 -container-ip 172.17.0.5 -container-port 3306

容器也可以直接使用宿主机网络:

docker run --rm=true --net=host --name=mysqlserver -e MYSQL_ROOT_PASSWORD=123456 mysql

性能好,但是缺陷在于端口被占用,如上就无法启动两个mysql实例

还可以容器共用一个IP网络:

docker run --rm=true --name=mysqlserver -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run --rm=true --net=container:mysqlserver java ip addr

ip相同,如何访问呢?通过localhost

因为在同一个网络,交互就很快了

目前更为复杂的主流方向 docker 容器的IP地址能够被另外主机所访问

Docker容器网络机制

  • Linux路由机制打通网络
    《从Docker到Kubernetes》总结二:Docker相关知识简述_第4张图片
    很常见的方案,docker130和docker128的docker0有不同的子网,这两个docker0上的地址能够互通

做法:

docker128上修改Docker0的网络地址,与docker130不能冲突:

vi /usr/lib/systemd/system/docker.service

修改如下:

ExecStart=/usr/bin/docker daemon --bip=172.18.42.1/16 -H fd:// -H=unix:///var/run/docker.sock

使配置生效:

systemctl daemon-reload

然后重启

接着添加路由,做映射:
docker130 上执行 route add -net 172.18.0.0/16 gw 192.168.18.128
docker128 上执行 route add -net 172.17.0.0/16 gw 192.168.18.130

此时在docker130上启动一个容器,获取其ip地址后,在128上ping此ip地址,发现能ping通就可以了,不行的话需要关闭防火墙

  • Docker网络方案一览
    《从Docker到Kubernetes》总结二:Docker相关知识简述_第5张图片
    还有主流的Overlay网络
    《从Docker到Kubernetes》总结二:Docker相关知识简述_第6张图片
    虚拟出一个ovs交换机,使用其端口进行通信,将docker的ip封装成一个tcp,然后通过以太网eth0传输;
    因此逻辑上看是直接通过gre tunnel联通的,而实际上通过以太网,因此为一实线一虚线
    《从Docker到Kubernetes》总结二:Docker相关知识简述_第7张图片
    neutron网络:
    《从Docker到Kubernetes》总结二:Docker相关知识简述_第8张图片
    官方的Libnetword:NetworlSandbox相当于交换机,Endpoint相当于端口,如果Endpoint接在同一个网络上,则可以通信
    《从Docker到Kubernetes》总结二:Docker相关知识简述_第9张图片
  • Linux namespace详解

每个namespace只能列出自己的进程
《从Docker到Kubernetes》总结二:Docker相关知识简述_第10张图片
可以看到,不同的容器对应不同的namespace,这样就隔离开来了

namespace拥有层次关系。
如图,一个parent namespace下有两个child namespace。
parent namespace和它的两个child namespace都有三个进程号为1,2,3的进程,同时child namespace的每个进程被映射到了parent namespace中的4,5,6,7,8,9。
虽然只有9个进程,但需要15个进程号来表示它们。
《从Docker到Kubernetes》总结二:Docker相关知识简述_第11张图片
可以理解为平行宇宙

如下实现可以让两个namespace通信:点对点模式
《从Docker到Kubernetes》总结二:Docker相关知识简述_第12张图片
veth pair是用于不同network namespace间进行通信的方式,veth pair将一个network namespace数据发往另一个network namespace的veth。

也可以使用交换模式:Linux Bridge,这样可以多对多
《从Docker到Kubernetes》总结二:Docker相关知识简述_第13张图片
Linux Bridge可以实现类似交换机的工作模式,将多个不同Namespace上的网卡连通

Docker图形化管理和监控

Docker管理工具

  • Docker Machine

在Docker Machine出现之前,需要登录主机,按照主机及操作系统特有的安装以及配置步骤安装Docker,使其能运行Docker容器;
Docker Machine的产生简化了这一过程,可以使用一条命令在计算机、公有云平台以及私有数据中心创建及管理Docker主机。

Create Docker Machine主要包括三个Create过程:
1 运行Provider Create(libmachine/provider.go),此函数主要是在当前运行docker-machine命令主机上创建以machine name命名的文件夹,并将根证书,服务器证书以及用户证书拷贝到此文件夹。
2 运行Driver create(例如drivers/virtualbox/virtualbox.go)用来创建主机,
3 运行Host create(libmachine/host.go)通过SSH安装并配置Docker。目前在本地环境中使用的是boot2docker镜像,云端环境使用的是Ubuntu镜像。

本质:自动创建一个虚拟机并且安装、设置好Docker Engine

好处:

简化了部署的复杂度,无论是在本机的虚拟机上还是在公有云平台,只需要一条命令便可搭建好Docker主机

提供了多平台多Docker主机的集中管理

使应用由本地迁移到云端变得简单,只需要修改一下环境变量即可和任意Docker主机通信部署应用。

  • Docker Compose

常规使用 Docker 的时候,需要定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。

然而应用微服务架构的系统一般包含若干个微服务,每个微服务一般都会部署多个实例用来负载均衡,如果每个微服务都要手动启停,那么效率很低,维护量也很大

而使用Docker Compose则可以轻松、高效地管理容器;
它是一个用于定义和运行多容器 Docker 的应用程序工具

https://www.jianshu.com/p/658911a8cff3
《从Docker到Kubernetes》总结二:Docker相关知识简述_第14张图片
Docker Compose将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr)。
一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
一个服务当中可包括多个容器实例;
Docker Compose并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡。

Docker Compose中定义构建的镜像只存在在一台Docker Swarm主机上,无法做到多主机共享

  • Docker Swarm

可以理解为Docker的负载均衡:
《从Docker到Kubernetes》总结二:Docker相关知识简述_第15张图片
在Swarm之前,Docker只能在单host上运行,其跨host的部署、运行与管理能力不好;
而跨host能力的薄弱,直接导致Docker容器与host的紧耦合,这种情况下,Docker容器的灵活性很难令人满意,容器的迁移、分组等都成为很难实现的功能点。

Swarm则可以管理Docker集群,并将其抽象为一个虚拟整体暴露给用户,其架构以及命令比较简单,可以单独部署于一个节点

工作流程:

Docker Client发送请求给Swarm;
Swarm处理请求并发送至相应的Docker Node;
Docker Node执行相应的操作并返回响应。

在某些点, Swarm将可以在主机故障时重调度容器。

Swarm可以很好地与第三方容器编配产品和运供应商提供的编配服务整合,如Mesos

  • Tutum

有图形界面

  • shipyard

Shipyard 是一个基于 Web 的 Docker 管理工具,支持多 host,可以把多个 Docker host 上的 containers 统一管理;
可以查看 images,甚至 build images,并提供 RESTful API 等等。
Shipyard 要管理和控制 Docker host 的话需要先修改 Docker host 上的默认配置使其支持远程管理。

  • cAdvisor

cAdvisor的监控图默认1秒刷新一次,显示最近一分钟的实时数据,不显示汇聚的和历史数据,也没有阀值告警功能;
此外它也无法同时监控多个Docker主机,不过由于其简单方便,并且具备很好的实时性能监控能力,所以适合特殊情况下的性能监控和问题排查。

你可能感兴趣的:(Docker,云计算)