docker compose
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。docker compose 中的容器是可以相互通信的,因为一般属于同一个网络下,如果没有填网络默认也会在同一网络下,比如下面这个yaml,net是没有填的但是也可以通过服务名进行通信
version: '3'
services:
jenkins:
container_name: jenkins
restart: always
image: jenkins/jenkins:2.440
ports:
- "10240:8080"
volumes:
- $PWD/jenkins_home:/var/jenkins_home
networks:
- net
remote_host:
container_name: remote-host
image: remote-host:latest
build:
context: centos
networks:
- net
networks:
net:
#安装compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker compose version
基础指令
docker compose -h # 查看帮助
docker compose up # 启动所有docker-compose服务
docker compose up -d # 启动所有docker-compose服务并后台运行
docker compose down # 停止并删除容器、网络、卷、镜像。
docker compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker compose ps # 展示当前docker-compose编排过的运行的所有容器
docker compose top # 展示当前docker-compose编排过的容器进程
docker compose logs yml里面的服务id # 查看容器输出日志
docker compose config # 检查配置
docker compose config -q # 检查配置,有问题才有输出
docker compose restart # 重启服务
docker compose start # 启动服务
docker compose stop # 停止服务
实战
传统的部署存在的问题:
顺序要求,当前的服务依赖于其它服务的启动,需要按顺序启动服务才能够访问成功。
里面的配置写死后,基于docker的部署容器的IP可能会发生变化。
version: "3" #版本
#服务容器实例
services:
microService:
image: zzyy_docker:1.6 #镜像名
container_name: ms01 #容器名
ports:
- "6001:6001" #端口映射
volumes:
- /app/microService:/data #数据卷挂载,持久化数据
networks:
- atguigu_net #网络,如果同一个网络下可以通过服务名称去访问容器实例,我们可以看到后面用的都是同一个网络,就类似于我们在网络篇创建一个网络
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- atguigu_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'zzyy'
MYSQL_PASSWORD: 'zzyy123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- atguigu_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
atguigu_net
Restart 有四种可选值:
-
"no"
: 不重启 (需要引号,没有引号的no
被yaml当做false
) -
always
: 无论原因,一律重启 -
on-failure
: 仅在异常退出时重启 -
unless-stopped
: 仅在手动stop时停止,否则一律重启
在用的时候将IP换为服务名
spring.datasource.url=jdbc:mysql://mysql:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
docker compose config -q #先检查一下配置
docker compose up -d #启动服务一键ok
docker swarm
Docker是容器运行时,而Swarm是Docker公司出品的容器编排工具。
Swarm基于Docker运行时,一个swarm由多个节点组成,每个节点是在swarm模式下运行Docker Engine的物理机或虚拟机。。Docker Swarm 支持标准的Docker API,所有任何已经与Docker Engine通信的工具都可以与Swarm集成,轻松地扩展到多个主机。
swarm中节点分为两种类型:
管理节点:维护集群状态,调度服务,响应swarm模式HTTP API 端点.管理节点通过Raft算法实现维护整个swarm所有服务的一致内部状态。
工作节点:工作节点是Docker引擎所在的物理机或虚拟机,其唯一目的是运行容器。工作节点不参与 Raft 分布式状态,不做调度决策。
服务:在swarm上部署部署的时候管理节点以服务为状态单位,它会将集群节点上的服务调度为一个或多个任务分发给工作节点。工作节点会去启动一个容器,填充这些任务,并且检查容器的健康状态,如果容器的状态是成功的会返回给调度器。如果一某个副本没有启动成功,则会去其他worker节点启动,如果还是没有成功则终止服务。
任务调度:任务是swarm调度的原子单位。创建或更新服务声明时,调度器会通过调度任务来实现所需的状态。例如,定义一个服务,要求调度器始终保持三个nginx实例运行。调度器将创建三个任务。每个任务都是一个插槽,调度器通过生成容器来填充插槽。
容器是任务的实例化。如果nginx实例崩溃,调度器将创建一个新的nginx副本来生成一个新的容器。
实操
docker info | grep Swarm #默认已经有了只是出于未激活的状态
docker swarm init #进行初始化
docker node ls #查看swarm节点
docker service create alpine ping www.baidu.com
docker service ls #查看看服务可以看到有节点数量
#根据名字查看细节
docker service ps distracted_volhard
docker container ls
#修改为三个副本
docker service update affectionate_knuth --replicas 3
#进行查看
docker service ps affectionate_knuth
#移除服务
docker service rm affectionate_knuth
#我们强制删除一个节点
docker container rm -f 60c2ba6a3d93
我们可以发现节点的数量从三个变成了两个,然后又变成了三个。说明管节点感知到了变化,又调度了一个节点。
集群管理
基础环境
前置条件有三台可以通信的机器
#Master节点执行
docker swarm init --advertise-addr 192.168.0.124
#worker节点执行
docker swarm join --token SWMTKN-1-2yz561otyfc7imbznsdgngkyl0ohqgn2ywzz9pdgoj7h17hehn-73af2mef4pxtf2yhmbqo6aake 192.168.0.124:2377
docker node ls #查看集群的状态
#创建一个服务我们发现,每台机器上各一个
docker service create --replicas 3 alpine ping www.baidu.com
docker service ps affectionate_knuth
overlay 网络
服务于容器间网络,提供了可选的加密特性,允许容器处于多个网络,也就是说它提供了跨节点通信的能力。
docker network create --driver overlay myoverlay
docker network ls
** swarm routing mesh**
比如我们在swarm 集群上部署了一个应用,在swarm集群的任意节点上都可以访问服务。但是在overlay网络上只有一个IP这就是swarm的Routing Mesh机制。
docker service inspect myap
Routing Mesh分为两类:
-
Internal Routing Mesh:容器与容器之间通过overlay网络进行访问。通过service name进行DNS解析,获得VIP(Virtual ip)
比如启动一个有三个replica的服务,三个容器分布在三个节点上。swarm会提供一个vip,并且承担流量在三个容器上的负载均衡 -
Ingress Routing Mesh:当在任何一个swarm节点去访问端口服务的时候会被本节点的IPVS(Linux ip virtual service)转发到真正的swarm节点上。
访问节点IP时,swarm会对击中节点的流量进行负载均衡。
Stack
docker stack 其实就是swarm版的docker-compose.yml,要求使用version >= 3
- 使用
docker stack deploy
代替docker service create
- Swarm不支持
build
标签,build
标签失效 - Compose不支持
deploy
标签,deploy
标签失效
基础命令
#部署应用
docker stack deploy -c docker-stack.yml mystack
docker stack ls
# NAME SERVICES ORCHESTRATOR
# mystack 2 Swarm
docker stack services mystack
# ID NAME MODE REPLICAS IMAGE PORTS
# xj7vyueoqcmt mystack_drupal replicated 1/1 drupal:8-apache *:8080->80/tcp
# wiqj2536orpr mystack_postgres replicated 1/1 postgres:10
#查看服务
docker stack ps mystack
#下线服务
docker stack rm mystack
我们可以看到在部署应用的时候,给我们创建了一个默认的网络,然后启动各个服务。
实战
安装一个drupal 用来测试
version: '3.1'
services:
drupal:
image: drupal:8-apache
ports:
- 8080:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
postgres:
image: postgres:10
environment:
POSTGRES_PASSWORD: mypassword
在这一步数据库验证通过以后,可以确认我们这个服务启动成功并可以和PG通信
防火墙打开相关指令
Docker Swarm Visualizer
提供了一个可视化界面
单独部署:
git clone https://github.com/dockersamples/docker-swarm-visualizer
cd docker-swarm-visualizer
docker-compose up -d
swarm部署:文章来源:https://www.toymoban.com/news/detail-811674.html
version: '3.1'
services:
drupal:
image: drupal:8-apache
ports:
- 80:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
postgres:
image: postgres:10
environment:
POSTGRES_PASSWORD: mypassword
visualizer:
image: dockersamples/visualizer
ports:
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
可以看到各个服务节点部署的应用:
Docker secret
在之前的yaml文件中,我们将postgres的密码以明文形式存储在了文件中。这种做法并不安全。因此我们需要引入docker secret
Swarm模式下manager节点通过Raft Database保持状态一致。
Raft DB本身是一个在磁盘上加密的介质,并且信息仅保存于manager节点。我们可以利用这个数据库将一些敏感信息,例如账号、密码等信息保存在这里,然后通过给service授权的方式允许它进行访问,这样达到避免密码明文显示的效果。
单独部署
echo "my_psql_user" >> psql_user.txt
#创建一个用户
docker secret create psql_user psql_user.txt
#查看现在有的密匙
docker secret ls
#创建一个密码的密匙 这是另一种方式
echo "myDBpassWORD" | docker secret create psql_pass - #- 表示从终端输入的
#启动pg 我们将这两个密匙 传递给环境变量的两个文件/run/secrets/psql_pass 和/run/secrets/psql_user
docker service create --name psql --secret psql_user --secret psql_pass -e POSTGRES_PASSWORD_FILE=/run/secrets/psql_pass -e POSTGRES_USER_FILE=/run/secrets/psql_user postgres:10
#进入容器内部测试登录
psql -U my_psql_user
swarm部署:
version: '3.1' #这个版本必须大于3.1
services:
drupal:
image: drupal:8-apache
ports:
- 80:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
postgres:
image: postgres:10
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/psql_password
POSTGRES_USER_FILE: /run/secrets/psql_user
visualizer:
image: dockersamples/visualizer
ports:
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
secrets:
psql_user:
file: ./psql_user.txt #和上面一样将用户存入这里
psql_password:
file: ./psql_password.txt#和上面一样将密码存入这里
compose vs swarm
docker compose,同样可以一次性启动多个docker容器。但是二者的使用场景不同。docker compose更适合与本地测试与开发,而不适合生产环境。文章来源地址https://www.toymoban.com/news/detail-811674.html
到了这里,关于Docker-compose && swarm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!