【docker】【四】docker开源项目

  1. 1. 高可用键值对数据库
  2. 2. Docker Machine 三剑客之一
  3. 3. docker Compose 三剑客之一
  4. 4. docker Swarm 三剑客之一
  5. 5. Mesos 集群资源调度平台

本文记录docker更多的开源项目。所有操作仅在CENTOS7上测试过,但是docker命令是通用的,不同的是配置文件目录位置或者系统命令。本文也是docker笔记系列的最后一篇,由于dockers开源项目众多,所以本篇文章会持续更新。

高可用键值对数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 仓库地址 `https://github.com/coreos/etcd`

# 二进制安装
curl -L https://github.com/coreos/etcd/releases/download/v3.0.4/etcd-v3.0.4-linux-amd64.tar.gz -o etcd-v3.0.4-linux-amd64.tar.gz
tar xzvf etcd-v3.0.4-linux-amd64.tar.gz
cd etcd-v3.0.4-linux-amd64
cp etcd* /usr/local/bin
# 使用
etcd --version
# 直接使用 etcd 运行实例即可
# 查看健康状态
curl -L http://127.0.0.1:2379/health
etcdctl cluster-health
# 设置键值
etcdctl set testkey "Hello World"
etcdctl get testkey
curl -L -X PUT http://localhost:2379/v2/keys/testkey -d value="Hello World"
curl -L http://localhost:2379/v2/keys/testkey

# docker安装
docker run -p 2379:2379 -p 2380:2380 -v /etc/ssl/certs/:/etc/ssl/certs/ quay.io/coreos/etcd:v3.0.4

# 启动参数:通用参数、集群参数、安全相关参数、代理参数,参考官方。
# etcdctl 命令 参考man手册或者help
# etcd集群管理
curl https://discovery.etcd.io/new?size=3
# https://discovery.etcd.io/58bad304591e13cac5dfab2c3d65e745
# 节点1
etcd --name n1 --initial-cluster-token cluster1 --initial-cluster-state new \
--listen-client-urls http://Node1:2379,http://localhost:2379 \
--listen-peer-urls http://Node1:2380 \
--advertise-client-urls http://Node1:2379 \
--initial-advertise-peer-urls http://Node1:2380 \
--discovery https://discovery.etcd.io/58bad304591e13cac5dfab2c3d65e745
# 其他节点类似 只是改了 Node{n} 和 --name

Docker Machine 三剑客之一

1
2
3
4
5
6
7
8
9
10
11
# https://github.com/docker/machine/releases
$ curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && chmod +x /tmp/docker-machine && sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

# 创建一台全新的docker虚拟主机
docker-machine create --driver=virtualbox vbox-instance
# 创建本地主机
docker-machine create --driver generic --generic-ip-address=10.0.100.102 --generic-ssh-user=user test
# 云平台主机
docker-machine create --driver amazonec2 --amazonec2-access-key AKI******* --amazonec2-secret-key 8T********** --amazonec2-vpc-id vpc-******** aes\_instace
# 查看docker主机
docker-machine ls

docker Compose 三剑客之一

二进制安装

1
2
3
# https://github.com/docker/compose/releases
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

模板文件 参考 https://www.cnblogs.com/52fhy/p/5991344.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
version: "2"
services:
webapp:
build: /path/to/Dockerfile # 使用Dockerfile构建镜像
cgroup\_parent: cgroup1 # 继承cgroup1的资源限制
container\_name: docker-webapp # 容器名称 指定名称后不能扩展、
dns: # 自定义dns
- 8.8.8.8
- 9.9.9.9
dns\_search: # 配置dns搜索域
- domain.example.com
Dockerfile: Dockerfile-alternate # 指定额外的Dockerfile文件 不能和image同时使用
env\_file: # 环境变量文件
- ./common.env
environment: # 环境变量
- BACK\_ENV=develop
- BOOLEAN="true"
- BOOLEAN2="yes"
expose: # 声明暴露端口
- "3000"
- "80"
extends:
file: common.yml
service: webapp
external\_links: # 链接到外部服务
- redis\_1
extra\_hosts: # host文件修改
- "google.com:8.8.8.8"
devices: # 指定设备映射关系
- "/dev/ttyUSB1:/dev/ttyUSB0"
cap\_add:
- ALL # 授予所有内核能力
cap\_drop:
- NET\_ADMIN # 去掉NET\_ADMIN能力
image: examples/web # 指定镜像名称
labels:
com.abc.c: "hello World"
links:
- db
log\_driver: "syslog"
log\_opt:
syslog-address: "tcp:192.168.0.42:123"
net: "host"
pid: "host"
ports:
- "80:80"
ulimits:
nproc: 65535 # 最大进程数
volumes:
- "/data:/data"
volumes\_driver: mydriver # 挂载数据卷
volumes\_from:
- service-name # 从另一个服务挂载数据卷
command: echo "Hello World" # 覆盖默认启动命令

docker Swarm 三剑客之一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 安装
docker pull swarm
# 查看版本
docker run --rm swarm -v
# 添加到集群之前需要设置docker服务监听
docker deamon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# docker 1.8 版本之前使用 -d

#或者修改服务配置文件 /etc/default/docker 【ubuntu】
DOCKER\_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

# 集群服务启动发现方式有 dockerhub 本地文件 Etcd Consul Zoomkeeper 和 手动指定
# 启动Consul服务
docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap
# 启动主节点管理
docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
# 启动从管理节点 提高可用性
docker run -d swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://<consul_ip>:8500
# 启动工作节点
docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500


# 利用dockerhub进行集群配置
# 注册到DockerHub 创建集群ID
docker run --rm swarm create # 会返回一串字符 是集群唯一ID 以后需要
# 配置集群节点
docker run --rm swarm join --addr=192.168.0.2:2375 token://<id>
# 配置管理节点
docker run -d -p 12375:2375 swarm manage token://<id>
# 查看集群节点
docker run --rm swarm list token://<id>
# 添加另外一个节点
docker run --rm swarm join --addr=192.168.0.3:2375 token://<id>

# 在任意节点上都可以启动若干容器
docker -H 192.168.0.2:12375 run -d ubuntu ping 127.0.0.1
docker -H 192.168.0.2:12375 ps
# 使用info查看所有节点信息
docker -H 192.168.0.2:12375 info

# 配置网络
# 使用consul添加Docker Daemon选项
--cluster-store=consul://<ip>:8500 --cluster-advertise=192.168.0.3:2375
# 重启docker服务
# 创建一个网络
docker -H 192.168.0.2:12375 network create swarm_network
docker -H 192.168.0.2:12375 network ls

服务后端发现的多种实现方式

  1. token://<token>
  2. file://path/to/file
  3. consul://<ip>/<path>
  4. etcd://<ip1>,<ip2>/path
  5. zk://<ip1>,<ip2>/path
  6. [nodes://]<ip1>,<ip2>

调度器 在manage容器上 用–strategy进行配置

  1. spread 节点负载基本一致 平均分
  2. binpack 用尽量少的节点 集中运算
  3. random 随机

过滤器

  1. Constraint 通过键值对区分 运行命令时使用 -e constraint:color==green 即可
  2. Affinity 通过容器区分 让特定容器在一起 -e affinity:container==<name or id>
  3. Port
  4. Dependency
  5. Health

Mesos 集群资源调度平台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# docker 安装方式 需要 zookeeper mesos marathon
docker pull garland/zookeeper
docker pull garland/mesosphere-docker-mesos-master
docker pull garland/mesosphere-docker-marathon
# 主机节点IP环境变量
HOST_IP=10.0.0.2
# 启动 zookeelper
docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 garland/zookeeper
# 启动 mesos-master服务
docker run -d --net="host" -p 5050:5050 \
-e "MESOS_HOSTNAME=${HOST\_IP}" \\
-e "MESOS\_IP=${HOST_IP}" \
-e "MESOS_ZK=zk://${HOST\_IP}:2181/mesos" \\
-e "MESOS\_PORT=5050" \\
-e "MESOS\_LOG\_DIR=/var/log/mesos" \\
-e "MESOS\_QUORUM=1" \\
-e "MESOS\_REGISTRY=in\_memory" \\
-e "MESOS\_WORK\_DIR=/var/lib/mesos" \\
garland/mesosphere-docker-mesos-master
# 启动 marathon
docker run -d -p 8080:8080 garland/mesosphere-docker-marathon --master zk://${HOST_IP}:2181/mesos --zk zk://${HOST\_IP}:2181/marathon
# 启动 mesos slave容器
docker run -d --name mesos\_slave\_1 --entrypoint="mesos-slave" \\
-e "MESOS\_MASTER=zk://${HOST_IP}:2181/mesos" \
-e "MESOS_LOG_DIR=/var/log/mesos" \
-e "MESOS_LOGGING_LEVEL=INFO" \
garland/mesosphere-docker-mesos-master
# 本地访问 8080 即可

欢迎访问博客地址:https://www.zhoyq.com