概述
docker-compose主要是一个用于定义和运行多容器的应用程序工具,它能轻松、高效的管理容器。
官网地址:https://docs.docker.com/compose/
安装
https://blog.youkuaiyun.com/yj735972447/article/details/111993455
常用命令
- docker-compose up 启动容器
- docker-compose up -d 在后台启动容器
- docker-compose -f 路径 up -d 指定文件启动容器
- docker-compose stop 停止所有容器
- docker-compose stop 容器名称 停止指定容器
- docker-compose start 启动所有容器
- docker-compose start 容器名称 启动指定容器
- docker-compose down 停止移除所有容器
- docker-compose logs 查看日志
- docker-compose build 重新构建镜像
- docker-compose version 查看版本信息
docker-compose.yml
官方yml
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
yml解释
- version 指定docker-compose.yml 文件的写法格式
- services 容器集合
- web 指定服务名称
- build 以dockerfile的方式构建镜像
- ports 指定主机端口与容器端口
- volumes 数据卷挂载
- links 用别名来链接到redis服务容器 (v1版本)
注意:v2,v3版本推介使用depends_on来表示服务之间的依赖关系,v2,v3版本维护着一个公共网络,可以直接通过服务名称通信。 - redis 容器名称
- image 指定镜像
- volumes 匿名挂载web的日志文件
web、redis、mysql三个服务实战
- 用springboot快速搭建一个web项目
@RestController
public class TestController {
@Autowired
RedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello(){
Long num = redisTemplate.opsForValue().increment("num");
return "hello docker:" + num;
}
}
- 配置application.properties
#配置服务端口
server.port=8080
#配置redis的主机
spring.redis.host=redis
- 创建web服务的dockerfile文件
# 基础镜像
FROM jdk:1.8
# 作者
MAINTAINER yj
# 匿名挂载(相当于就是主机/var/lib/docker目录下创建了一个tmp目录链接到了容器的/tmp目录)
VOLUME /tmp
# 将jar文件拷贝文件容器中,并重新命名
ADD demo-0.0.1-SNAPSHOT.jar /app.jar
# 暴露端口
# 注意:这里暴露的端口并不是正在发布的端口,只是用来提醒部署人员应该映射哪个端口给外界。
EXPOSE 8088
# 容器启动时运行的命令
ENTRYPOINT["java","-jar","/app.jar"]
- 创建docker-compose.yml
version: '3.8' # docker-compose版本
services:
web: # 服务名称
restart: always # 开机自启动
build: .
ports: # 端口
- "8088:8080"
depends_on: # 定义服务之间的依赖关系
- redis
- mysql
# depends_on 定义服务之间的依赖关系(web服务依赖于redis和redis,mysql容器启动顺序要优先于web容器;当启动web容器时会自动创建redis和mysql容器)
# 注意depends_on不会等到redis和mysql容器启动完成再启动,web容器仅仅等到redis和mysql容器启动就开始启动
redis: # 服务名称
restart: always # 开机自启动
image: redis:6.0
privileged: true # 容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
environment:
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
volumes: # 数据挂在
- /usr/local/etc/redis/conf/redis.conf:/etc/redis/redis.conf
- /usr/local/etc/redis/data:/data
command:
redis-server /etc/redis/redis.conf # 指定配置文件启动redis-server进程 # --requirepass 123456 # 设置密码
ports:
- "6379:6379"
mysql: # 服务名称
restart: always # 开机自启动
image: mysql:5.7 # 以镜像的方式构建
environment:
MYSQL_ROOT_PASSWORD: 'root' # root 用户的密码
MYSQL_ROOT_HOST: '%'
TZ: Asia/Shanghai
# MYSQL_ALLOW_EMPTY_PASSWORD: 设置为 'yes' 允许 root 用户的密码为空。
# MYSQL_RANDOM_ROOT_PASSWORD: 设置为 'yes' 将在容器启动时为 root 用户生成一个随机的密码,密码会显示到标准输出流
# MYSQL_ONETIME_PASSWORD :字面意思就是一次性密码,为 root 用户设置,第一次登录后必须修改密码(仅支持 5.6 以上的版本)
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--lower_case_table_names=1
--max_allowed_packet=128M
--default-authentication-plugin=mysql_native_password
--log_bin_trust_function_creators=1
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
# MYSQL8以上已经取消了NO_AUTO_CREATE_USER,sql_mode中不能包含这个
volumes: # 数据挂在
- /usr/local/etc/mysql/data:/var/lib/mysql # 将mysql数据挂在到宿主机(防止容器删除后,数据丢失)
- /usr/local/etc/mysql/conf/conf.d:/etc/mysql/conf.d # 将mysql的配置文件挂在到宿主机(修改配置文件方便)
ports:
- "3306:3306"
-
在linux服务上新建一个docker-compose目录
将Dockerfile,docker-compose.yml,demo-0.0.1-SNAPSHOT.jar三个文件拷贝到
docker-compose目录下。
-
启动docker-compose
启动命令:docker-compose up
-
查看web程序的返回结果
发现每次请求都会去调用redis,并且结果每次都会加1 -
使用navicat查看mysql连接
数据库也能正常连接