本文记录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
|
服务后端发现的多种实现方式
token://<token>
file://path/to/file
consul://<ip>/<path>
etcd://<ip1>,<ip2>/path
zk://<ip1>,<ip2>/path
[nodes://]<ip1>,<ip2>
调度器 在manage容器上 用--strategy进行配置
- spread 节点负载基本一致 平均分
- binpack 用尽量少的节点 集中运算
- random 随机
过滤器
- Constraint 通过键值对区分 运行命令时使用
-e constraint:color==green
即可
- Affinity 通过容器区分 让特定容器在一起
-e affinity:container==<name or id>
- Port
- Dependency
- 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 即可
|