提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
上文说到了docker部署springboot程序,在我们的实际环境当中,可能有上百个微服务,难道每个微服务都需要docker run吗。docker官方给我们提供个一个自动化部署:docker-compose,通过docker-compose我们一键部署我们想部署的所有应用,可以理解为docker-compose是一个服务部署编排的功能。
Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式) 中定义一组相关联的应用容器( 被称为一个project,即项目),例如一个Web服务容器再加上后端的数据库服务容器等。
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
一、docker-compose安装
在使用docker-compose之前,我们需要先安装docker,docker的安装流程请戳:
解锁容器化世界:docker快速安装
最简单的安装方式:
1.下载安装包
sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
下载完成之后,不需要解压,因为下载的本来就是文件夹。
2,赋予文件夹权限
sudo chmod +x /usr/local/bin/docker-compose
3,验证安装
docker-compose --version
离线版本安装:
docker-compose官方git地址:
https://github.com/docker/compose/releases/
下载下来,直接传到/usr/local/bin目录下即可。
二、docker-compose实践
docker-compose自动部署docker程序是依赖docker-compose.yml文件
1,先创建yml配置文件
version: '3'
services:
mysql:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
volumes:
- /opt/mysql:/var/lib/mysql
redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- /opt/redis:/data
kafka:
image: wurstmeister/kafka:latest
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
zookeeper:
image: wurstmeister/zookeeper:latest
ports:
- "2181:2181"
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
nacos:
image: nacos/nacos-server
environment:
- MODE=standalone
ports:
- "8848:8848"
system-biz:
image: system-biz:1.0.1
depends_on:
- mysql
- redis
- nacos
- elasticsearch
- seaweedfs_master
- kafka
environment:
- TZ=Asia/Shanghai
- NACOS=-Dspring.cloud.nacos.config.server-addr=nacos:8848 -Dspring.cloud.nacos.discovery.server-addr=nacos:8848 -Dspring.cloud.nacos.config.password=nacos -Dspring.cloud.nacos.config.username=nacos -Dspring.cloud.nacos.discovery.username=nacos -Dspring.cloud.nacos.discovery.password=nacos
- JAVA_OPTS=-Dserver.port=8080 -Xms1G -Xmx1G -Dspring.profiles.active=dev -Duser.timezone=Asia/Shanghai
- AGENT=-javaagent:skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=system-biz
ports:
- "10025:8080"
volumes:
- /opt/docker/system-biz:/app/logs
yml文件配置避免踩坑指南
- YAML数据结构通过缩进来表示(要用空格,不要用换行符,yml文件对换行符敏感)
- 连续的项目通过减号来表示
- 键值对用冒号分隔
- 数组用中括号 [ ] 括起来
- 注意大小写
比如:
name:
- 阿里巴巴
- 滴滴
- 美团
name: ["zhangsan", "lisi", "wangwu"]
1.docker-compose配置详解
image:要启动的镜像
depends_on:该镜像需要依赖的镜像,即启动的先后顺序,比如说nacos依赖于mysql,需要mysql先启动成功后,才会启动nacos
ports:端口映射,前面为宿主机的端口,后面为容器的端口。
volumes:容器卷的挂载
上文中提到过一个问题,我们想看容器里的日志的时候,需要每次都进入到容器查看吗?答案肯定不是,可以利用容器卷的挂载,比如说上图中:/app/logs为容器里面,springboot应用所产生的日志,我们将他挂载到了宿主机的/opt/docker目录下面,以后需要看日志的时候,可以直接进入到宿主记得/opt/docker目录下查看
2.常见问题
1,当我们的springboot应用需要挂载探针时怎么办?
可以将探针打到镜像里面去,然后通过配置Dockerfile参数来指定探针的位置。
提供一个DockerFile万能模板,可以无脑使用:
FROM openjdk:8
ADD *.jar /app/
ADD skywalking-agent/ /app/skywalking-agent/
WORKDIR /app/
CMD ["sh","-c","java $NACOS $AGENT $JAVA_OPTS -jar *.jar"]
与上线的yml文件可配套使用。
2,docker常用指令
启动服务
docker-compose up -d
停止服务
docker-compose down
列出所有运行容器
docker-compose ps
查看服务日志
docker-compose logs
构建或者重新构建服务
docker-compose build
启动服务
docker-compose start
停止已运行的服务
docker-compose stop
重启服务
docker-compose restart
总结
docker-compose实现在单机上完成容器集群的编排管理,单机容器编排
使用 docker-compose可以完成多个docker run的所有操作。
补充:容器重启策略
- never,默认策略,在容器退出时不重启容器。
- on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
- on-failure:3,在容器非正常退出时重启容器,最多重启3次。
- always,在容器退出时总是重启容器(中间件常用)
- unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。