文章目录
- 1. Docker-compse介绍
- 2. Docker-compse下载
- 3. Docker-compse核心概念
- 4. Docker-compse使用案例
1. Docker-compse介绍
Docker-compose时Docker官方的一个开源的项目,负责对Docker容器集群的快速编排。Docker-compose可以管理多个Docker容器组成一个应用,你需要定义一个YAML格式的配置文件,docker-compose.yml,写好多个容器之间的调用关系,然后,只需要一个命令,就能同时启动/关闭这些容器。
docker建议我们每个容器中只运行一个服务,因为docker容器本身占用的资源比较少,所以是将每个服务单独的分割开来,但是这样我们又面临一个问题?
如果我们需要同时部署多个服务,难道我们要给每个服务单独写Dockerfile然后构建镜像,构建容器,这样是很麻烦的,所以docker官方为我们提供了docker-compos多服务部署的工具。例如现在我们需要实现一个web微服务项目,除了web服务容器本身,往往还需要加上后端的mysql服务器,redis服务器,注册中心,甚至还包括nginx负载均衡容器等。Compose运行用户通过docker-compose.yml来定义一组相关联的应用容器为一个项目,这样就可以很容器地用一个配置文件定义一个多容器应用,然后使用一条指令安装这个应用的所有依赖,完成构建。docker-compose解决了容器和容器之间如何编排的问题。
2. Docker-compse下载
官网下载的位置为:https://docs.docker.com/compose/install/
安装Docker Compose最简单也是最推荐的方法是安装Docker Desktop。Docker Desktop包括Docker Compose、Docker Engine和Docker CLI,它们是Docker Compose的先决条件。这里我Mac电脑上面是直接安装了docker desktop,自带按照了docker compose,所以如何安装我就不演示了,网上也有很多教程。
我们可以查看docker compose的版本:
docker-compose --version
3. Docker-compse核心概念
docker-compose的核心概念就是一个文件,两个要素
。其中一个文件是docker-compose.yml。两个要素分别是服务和工程。服务指的是一个个应用容器的实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器。工程就是由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
使用docker-compose的步骤如下:
- 编写dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务
- 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
docker-compose的常见命令如下:
命令 | 解释 |
---|---|
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 | 停止服务 |
4. Docker-compse使用案例
改造前面使用过的docker_boot
案例:
- SQL建表建库
CREATE TABLE `t_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
`password` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',
`sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男',
`deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1114 DEFAULT CHARSET=utf8 COMMENT='用户表';
- 下载项目
链接:https://pan.baidu.com/s/1f2aMCKGToDp6DwPLKMJUXw
提取码:cbwn
- 编写Dockerfile
#基础镜像使用java
FROM java:8
#作者
MAINTAINER jackiechai
#VOLUE指定临时文件夹为/tmp。在主机指定目录下创建一个临时文件并链接到容器的/tmp
VOLUME /tmp
#将jar包添加到容器并更名
ADD docker_boot-0.0.1-SNAPSHOT.jar jackiechai_docker.jar
#运行jar包
RUN bash -c 'touch /jackiechai_docker.jar'
ENTRYPOINT ["java","-jar","/jackiechai_docker.jar"]
#暴露端口6001作为微服务
EXPOSE 6001
- 运行docker file构建镜像
docker build -t jackiechai_docker.jar:1.6 .
我们首先不使用docker-compose来运行这个项目:
- 是先创建mysql容器实例
docker run -p 3308:3306 --name mysql57 --privileged=true -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/conf:/etc/mysql/conf.d -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/logs:/logs -v /Users/jackchai/Desktop/复习/Docker/boot_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d e00adb645cb5
修改mysql然后让navicat连接到mysql服务(操作流程看这篇博客:https://blog.csdn.net/a1023266384/article/details/119455841)同时创建数据库和表:
不进行这步操作可能报错:1130 - Host ‘172.17.0.1’ is not allowed to connect to this MySQL server
- 然后创建redis实例
docker run -p 6379:6379 --name redis608 --privileged=true -v /Users/jackchai/Desktop/复习/Docker/boot_redis/redis.conf:/etc/redis/redis.conf -v /Users/jackchai/Desktop/复习/Docker/boot_redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
- 启动镜像
docker run -d -p 6001:6001 [镜像id]
- 进行swagger测试
数据插入成功
数据查找成功
上面我没使用docker-compose玩成了服务的部署。但是会存在下面这些问题:
- 先后顺序要求固定,先mysql+redis部署,才能进行微服务的部署
- 运行了多个run命令
- 容器间的启停或宕机,有可能导致ip地址对应的容器实例变化,映射出错,要么生产ip写死,要么通过服务调用
使用docker-compose来运行这个项目:
- 编写docker-compose.yml文件
version: "3"
services:
microService:
image: jackiechai_docker.jar:1.6
container_name: ms01
ports:
- "6001:6001"
volumes:
- /Users/jackchai/Desktop/复习/Docker/boot/microService:/data
networks:
- jack_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /Users/jackchai/Desktop/复习/Docker/boot_redis/redis.conf:/etc/redis/redis.conf
- /Users/jackchai/Desktop/复习/Docker/boot_redis/data:/data
networks:
- jack_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql/mysql-server:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2024'
MYSQL_USER: 'jackiechai'
MYSQL_PASSWORD: '123456'
ports:
- "3307:3306"
volumes:
- /Users/jackchai/Desktop/复习/Docker/boot_mysql/db:/var/lib/mysql
- /Users/jackchai/Desktop/复习/Docker/boot_mysql/conf/my.cnf:/etc/my.cnf
- /Users/jackchai/Desktop/复习/Docker/boot_mysql/init:/docker-entrypoint-initdb.d
networks:
- jack_net
command: --default-authentication-plugon=mysql_native_password
networks:
jack_net
- 然后修改微服务的配置,将固定地址访问改成服务名访问
server.port=6001
# ========================alibaba.druid????=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://mysql:3307/db2024?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false
# ========================redis????=====================
spring.redis.database=0
spring.redis.host=redis
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# ========================mybatis????===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.wang.docker.entities
# ========================swagger=====================
spring.swagger2.enabled=true
然后重新打包
- 然后运行docker-compose
首先我们需要坚持docker-compose是否出现语法错误:
docker-compose config -q
如果docker-compose.yml没有任何错误,它不会出现任何提示
然后我们可以运行docker-compose了
docker-compose up -d
然后我们进入mysql建库建表:
docker exec -it c265227ba92a bash
- 最后我们使用swagger进行测试
同样可以执行成功,这里就不演示了。