一、是什么
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
二、能做什么
- Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
- 可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
三、安装
-
现在Docker Compose。
curl -SL https://github.com/docker/compose/releases/download/v2.19.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
-
赋权限。
chmod +x /usr/local/bin/docker-compose
-
测试。
docker-compose --version
四、核心概念
服务:一个个应用容器实例,也就是说我们要用到的所有容器
工程:由一组关联的应用容器组成的一个完整的业务单元,在docker-compose.yml文件中定义。
五、常用命令
命令 | 作用 |
---|---|
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 | 停止服务 |
六、使用
使用过程主要分为三个步骤
- 编写Dockerfile定义各个微服务应用并构建出相应的镜像文件。
- 编写docker-compose.yml定义一个完整业务单元,并安排好整体应用中的各个容器服务。
- 执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线。
下面我将用一个小案列来加深理解
项目下载地址: https://www.aliyundrive.com/s/9djHR3Hj3H1
完成该项目的前提是要拥有Java8,mysql,redis的镜像,mysql的版本是5.7,redis的版本是6.0.8。
项目修改
修改配置,我们自己使用自己创建的docker网络可以实现配置文件不需要写IP就可以直接通讯。
重新打包把项目传到自己的服务器上。
编写Dockerfile
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER sveinn
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar sveinn_docker.jar
# 运行jar包
RUN bash -c 'touch /svienn_docker.jar'
ENTRYPOINT ["java","-jar","/sveinn_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
编写docker-compose.yml文件
version: "3"
services:
microService:
image: sveinn_docker:1.6
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- my_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
container_name: redis68
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- my_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
container_name: mybatis57
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'docker_boot'
MYSQL_USER: 'sveinn'
- "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:
- my_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
my_net:
部署服务
构建镜像
docker build -t svein_docker:1.6 .
执行命令一键部署
docker-compose up -d
数据处理
进入mysql容器构建数据
docker exec -it mysql57 /bin/bash
创建数据库和表,我是直接在mysql直接执行sql语句也可以执行直接执行sql脚本。
mysql -uroot -p
create database boot_docker;
use boot_docker;
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=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
测试
访问swagger地址http://服务器地址:服务端口号/swagger-ui.html#/
,注意把swagger地址换成自己服务器的地址,端口号改成自己服务器的端口号。
能成功进到swagger而且能添加数据和查询数据就说明该项目成功部署。
七、总结
本文介绍了用docker-compose解决了用docker部署的要多次构建容器的痛点,解决方式就是在docker-compose文件定义好项目所需要的容器和一些配置。直接用一个命令就可以构建多个容器,实现对Docker 容器集群的快速编排。介绍了一些简单的命令以及如何安装docker-compose,同时还用一个简单的部署实例来加深对docker-compose的使用。