https://www.bilibili.com/video/av56101144
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]
好处是方便快速;坏处是不规范,无法自动化
适合在本地测试使用
容器编译过程中,指令是在容器执行的而不是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文件:分层,最下面层都是只读,最上面加一层可写的
目前,除少数版本如Ubuntu,Docker基本运行在Devicemapper文件系统上
Aufs、DeviceMapper机制:
为什么需要Volume?解决高频写文件操作(大量写日志)
Volume就是宿主机的一个文件夹映射到容器上,直接到此文件夹进行操作
可以多个容器中的Volume指向同一个本机目录,实现基于文件的的共享访问
基于Volume的互联,也可以解决跨主机的共享问题:ISCSI等
docker默认是允许container互通,通过-icc=false关闭互通。
一旦关闭了互通,只能通过-link name:alias命令连接指定container.
好处:容器重启时ip会变,但是名字不变,而link会给一个主机名(DNS名称)用来代替IP地址进行访问
link是基于端口隔离的,只开放容器的指定端口
不支持跨主机,只能使用Ambassador代理模式来跨主机
Docker网络模型:
中间的docker可以理解为网桥,不过可以有几千个口
最简单常用的互联方式:端口映射(docker run -p “8080:80” 宿主的0.0.0.0:8080 -> 容器80)
类似于做一个监听:
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地址能够被另外主机所访问
做法:
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通就可以了,不行的话需要关闭防火墙
每个namespace只能列出自己的进程
可以看到,不同的容器对应不同的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个进程号来表示它们。
可以理解为平行宇宙
如下实现可以让两个namespace通信:点对点模式
veth pair是用于不同network namespace间进行通信的方式,veth pair将一个network namespace数据发往另一个network namespace的veth。
也可以使用交换模式:Linux Bridge,这样可以多对多
Linux Bridge可以实现类似交换机的工作模式,将多个不同Namespace上的网卡连通
在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 的时候,需要定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。
然而应用微服务架构的系统一般包含若干个微服务,每个微服务一般都会部署多个实例用来负载均衡,如果每个微服务都要手动启停,那么效率很低,维护量也很大
而使用Docker Compose则可以轻松、高效地管理容器;
它是一个用于定义和运行多容器 Docker 的应用程序工具
https://www.jianshu.com/p/658911a8cff3
Docker Compose将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr)。
一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。
一个服务当中可包括多个容器实例;
Docker Compose并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡。
Docker Compose中定义构建的镜像只存在在一台Docker Swarm主机上,无法做到多主机共享
可以理解为Docker的负载均衡:
在Swarm之前,Docker只能在单host上运行,其跨host的部署、运行与管理能力不好;
而跨host能力的薄弱,直接导致Docker容器与host的紧耦合,这种情况下,Docker容器的灵活性很难令人满意,容器的迁移、分组等都成为很难实现的功能点。
Swarm则可以管理Docker集群,并将其抽象为一个虚拟整体暴露给用户,其架构以及命令比较简单,可以单独部署于一个节点
工作流程:
Docker Client发送请求给Swarm;
Swarm处理请求并发送至相应的Docker Node;
Docker Node执行相应的操作并返回响应。
在某些点, Swarm将可以在主机故障时重调度容器。
Swarm可以很好地与第三方容器编配产品和运供应商提供的编配服务整合,如Mesos
有图形界面
Shipyard 是一个基于 Web 的 Docker 管理工具,支持多 host,可以把多个 Docker host 上的 containers 统一管理;
可以查看 images,甚至 build images,并提供 RESTful API 等等。
Shipyard 要管理和控制 Docker host 的话需要先修改 Docker host 上的默认配置使其支持远程管理。
cAdvisor的监控图默认1秒刷新一次,显示最近一分钟的实时数据,不显示汇聚的和历史数据,也没有阀值告警功能;
此外它也无法同时监控多个Docker主机,不过由于其简单方便,并且具备很好的实时性能监控能力,所以适合特殊情况下的性能监控和问题排查。