Docker管理之官方三剑客
Docker Machine
Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker。我们还可以通过 docker-machine 命令来管理这些虚拟机和 Docker。
- 以前你需要登录主机,按照主机及操作系统特有的安装以及配置步骤安装Docker,使其能运行Docker容器。
- 现在DockerMachine的产生简化了这一过程,让你可以使用一条命令在你的计算机,公有云平台以及私有数据中心创建及管理Docker主机。
安装Docker Machine
在macOS和Windows上,Machine会随着Docker for Mac, Docker for Windows, 或 Docker Toolbox一起安装.
独立安装Docker Machine
这里以ubuntu 18.04为例,其他系统安装参见官方文档Docker Machine
1 | # base=https://github.com/docker/machine/releases/download/v0.16.0 && |
查看 Machine version:
1 | # docker-machine version |
在远程主机上安装 Docker
在使用 docker-machine 进行远程安装前我们需要做一些前提准备工作:
在目标主机上启用root或创建具有sudo权限的普通用户
启用root ssh 登陆
1 | #允许root ssh登录 |
或者创建一个具有sudo权限的普通用户,这里以创建一个用户为例
1 | $ sudo adduser worker1 |
配置用户ssh免密登录
启用visiblepw
1 | $ sudo visudo |
编辑nopasswdsudo
1 | $ vim /etc/sudoers.d/nopasswdsudo |
把本地用户的 ssh public key 添加到目标主机上
1 | $ ssh-copy-id -i ~/.ssh/id_rsa.pub worker1@192.168.48.202 |
在本地主机执行安装命令
1 | $ docker-machine create -d generic \ |
create 命令创建虚拟主机并安装 Docker
-d –driver 的简写形式,主要用来指定使用什么驱动程序来创建目标主机
另外支持的驱动详见:Machine drivers
本例中使用 generic 下面以 –generic 开头的三个参数主要是指定操作的目标主机和使用的账户
machine-worker1 参数是虚拟机的名称
检查安装结果
1 | $ docker-machine ls |
使用本地的客户端连接远程的服务器
1 | $ eval $( docker-machine env machine-worker1) |
这样就可以愉快的在本地管理远端的docker了
另外docker-machine支持的命令如下:
1 | Commands: |
对于远程管理来说,SSH 的支持是必不可少的!Docker Machine 当然也尽职尽责的完成了任务:
1 | $ docker-machine ssh machine-worker1 |
执行上面的命令,瞬间穿越至目标主机,双击666
Docker Compose
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。
实际项目中我们不可能就一个docker容器走天下,正常都是要多个容器合作完成任务,如果我们一个一个容器去启动,势必很麻烦头大,docker-compose 可以解决我们的问题,下面简单实例以springboot服务+mysql数据库服务
项目结构如下,
- demo 是我们的springboot web工程
- mysql目录,可以加一下针对mysql的配置
- docker-compose.yaml 猪脚,描述如何构建整个服务
docker-compose.yaml 配置文件
1 | version: '3' |
- version: ‘3’: 表示使用第三代语法来构建 docker-compose.yaml 文件。
- services: 用来表示 compose 需要启动的服务,我们可以看出此文件中有2个服务分别为:mysql、demo。
- container_name: 容器名称
- environment: 此节点下的信息会当作环境变量传入容器,此示例中 mysql 服务配置了数据库、密码和权限信息。
- ports: 表示对外开放的端口
- restart: always 表示如果服务启动不成功会一直尝试。
- volumes: 加载本地目录下的配置文件到容器目标地址下
- depends_on:可以配置依赖服务,表示需要先启动 depends_on 下面的服务后,再启动本服务。
- command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker: 表示以这个命令来启动项目,-Dspring-boot.run.profiles=docker表示使用 application-docker.properties文件配置信息进行启动。
Spring Boot 项目配置
在demo 目录下也就是和pom.xm文件同级添加Dockerfile文件,文件内容如下:
1 | FROM maven:3.5-jdk-8 |
只要这一句,依赖于基础镜像maven3.5和jdk1.8。
因为在docker-compose.yaml文件设置了项目启动命令,这里不需要再添加启动命令
application-docker.properties 添加针对于docker的配置:
1 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver |
项目部署
以下命令在docker-compose.yaml 同级目录执行
启动服务:
1 | docker-compose up --build |
停止服务:
1 | docker-compose down |
查看项目中目前的所有容器
1 | docker-compose ps |
就是这么简单。
Docker Swarm
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
Docker Swarm的获取
从Docker(1.12版本以后) swarm 已整体集成在Docker Engine中,这里我们只讨论新版本中docker swarm的使用
创建一个Swarm的集群
详细参数参见官方文档https://docs.docker.com/engine/reference/commandline/swarm_init/#options,
1 | docker swarm init [OPTIONS] |
1 | $ docker swarm init --listen-addr 0.0.0.0:2377 --advertise-addr 192.168.48.244 |
–listen-addr 指出的是这个集群暴露给外界调用的HTTPAPI的socket地址
–advertise-addr 标志配置了管理节点的 IP 地址。如果你的机器只有一张网卡,可以省略。
Swarm的集群管理
向Swarm的集群中添加节点
分别在第二台、第三台主机上执行以上生成的 docker swarm join –token命令
1 | # 输出添加一个worker节点命令 |
为了不用登陆到每台主机中去执行docker swarm join –token命令,这样太麻烦,我们可以结合上面的docker-machine 命令使用,通过docker-machine create添加两台远程主机
1 | $ docker-machine ls |
分别将machine-worker1,machine-worker2 作为一个节点添加到swarm集群,执行如下命令
1 | $ docker-machine ssh machine-worker1 "sudo docker swarm join --token SWMTKN-1-2j9t0uf0a442hks10f4l4bp9fz01j5wkr81twl3mgjyl6fuvva-5i1itkmhe4tehzbqhas4wztns 192.168.48.244:2377" |
无需登录远程主机,这样两个节点就添加进swarm集群了,查看下当前swarm集群中的节点
1 | $ docker node ls |
这样我们就得到了一个由三个节点组成的小集群,manager本身也自动作为worker一员加入集群
节点更新
1 | $ docker node update --availability drain worker2 |
可以手动将某个节点的可用性设置为Drain或者active,比如这里将名为worker2的节点设置为drain了之后,可以看到在docker node ls 中出现的新信息
1 | $ docker node ls |
删除节点
执行命令 docker swarm leave –force
这里我们将worker2节点从swarm 集群中移除:
1 | $ docker-machine ssh machine-worker2 "sudo docker swarm leave --force" |
构建服务
在swarm集群中,管理节点是集群中唯一可以执行命令的机器,或授权其他机器作为manager加入群集,worker只是在那里提供服务能力,并且没有权力告诉任何其他机器它能做什么和不能做什么,为了构建下面的集群服务,我们再次执行上面的添加节点操作把worker2节点添加进集群。
1 | $ docker-machine ssh machine-worker2 "sudo docker swarm join --token SWMTKN-1-2j9t0uf0a442hks10f4l4bp9fz01j5wkr81twl3mgjyl6fuvva-5i1itkmhe4tehzbqhas4wztns 192.168.48.244:2377" |
在管理节点执行构建服务命令:
1 | $ docker service create -p 4000:80 --replicas 5 --name helloswarm yaonew/hellowpy:v1 |
docker service create 命令创建服务
-p 端口映射,将容器80端口映射到宿主机4000端口上
–name 标志将服务命名为helloswarm
–replicas 标志指定了期望状态为 5 个运行示例
yaonew/hellowpy:v1 镜像 这里使用了自己构建的镜像
查看服务列表
1 | $ docker service ls |
查看服务详情
1 | $ docker service ps helloswarm |
通过以上命令可以迅速将helloswarm服务提升至10个实例,之前已经启动的5个实例不受影响,将新构建5个实例,查看服务详情。
1 | $ docker service ps helloswarm |
删除swarm上的服务
1 | $ docker service rm helloswarm |
通过YAML文件构建服务
YAML文件,用于定义Docker容器在生产中的行为方式,yaonew/hellowpy:v1 我们自己的镜像,请确保已推送到远程仓库,下面新建docker-compose.yml文件
1 | version: "3" |
这个docker-compose.yml文件告诉Docker执行以下操作:
从注册中心中提取镜像。
以此镜像运行5个实例作为一个服务,服务名为web,限制每个实例使用最多10%的CPU(所有核心)和50MB的RAM。
如果如果容器出错,立即重启。
将主机上的端口4000映射到Web的端口80。
指示Web容器通过称为webnet的负载平衡网络共享端口80。
默认使用Webnet网络(负载平衡网络)。
通过yaml文件省去了在命令行添加太多参数的烦恼,运行服务
1 | $ docker stack deploy -c docker-compose.yml helloswarm |
这里创建了一个网络名称为:helloswarm_webnet 创建了一个服务名称:helloswarm_web
查看服务详情
1 | docker service ps helloswarm_web |
查看容器信息
1 | # 各主机查看启动容器id |
扩展应用
我们可以通过更改docker-compose.yml文件,并重新运行docker stack deploy命令来扩展应用程序:
1 | docker stack deploy -c docker-compose.yml helloswarm |
Docker执行就地更新,无需杀死任何容器。
现在,重新运行docker container ls -q以查看已重新配置的已部署实例。 如果增加实例数量,则会启动更多任务,从而启动更多容器。
清理退出
1 | docker stack rm helloswarm |
参考文章
https://docs.docker.com/machine/overview/
http://blog.51cto.com/hashlinux/1772507
https://www.cnblogs.com/sparkdev/p/7044950.html
https://docs.docker.com/compose/overview/
https://docs.docker.com/engine/reference/commandline/swarm/
https://www.cnblogs.com/franknihao/p/8490416.html
https://blog.csdn.net/u011936655/article/details/81147315