传统的操作流程是将本地项目打一个jar包,之后到指定服务器输入指令运行jar包,但jar需要相关中间的环境才能正常运行,这个时候通常是使用docker来拉取镜像部署环境。
但每次都是用docker run 来启动容器来处理太麻烦了,万一需要安装的中间件比较多,或者启动失败就很麻烦,这个时候就需要dockerCompose上场了。
DockerCompose
在dockerCompose中编写各种中间件的服务的配置,包括挂载的宿主主机的文件地址,文件名默认为docker-compose.yml即可,后续在终端通过 docker-compose up -d -build 进行启动。
这里是一个参考的docker-compose.yml文件:
注意:在启动该配置文件,需要现在docker中提前下载好镜像,且镜像的名字和docker-compose.yml中指定的是一致的。
version: '3'
services:
redis:
image: redis:latest
container_name: redis
command: redis-server --appendonly yes
volumes:
- /mydata/redis/data:/data #数据文件挂载
ports:
- 6379:6379
mongo:
image: mongo:4
container_name: mongo
volumes:
- /mydata/mongo/db:/data/db #数据文件挂载
ports:
- 27017:27017
# nginx:
# image: nginx:1.22
# container_name: nginx
# volumes:
# - /Users/tomsmile/Desktop/mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf # 修改为宿主机的文件路径
# - /Users/tomsmile/Desktop/mydata/nginx/html:/usr/share/nginx/html #静态资源根目录挂载
# - /Users/tomsmile/Desktop/mydata/nginx/logs:/var/log/nginx #日志文件挂载
# ports:
# - 80:80
# rabbitmq:
# image: rabbitmq:3.9.11-management
# container_name: rabbitmq
# volumes:
# - /mydata/rabbitmq/data:/var/lib/rabbitmq #数据文件挂载
# ports:
# - 5672:5672
# - 15672:15672
# minio:
# image: minio/minio
# container_name: minio
# command: server /data --console-address ":9001" #指定数据目录及console运行端口启动
# volumes:
# - /mydata/minio/data:/data #数据目录挂载
# environment:
# - "MINIO_ROOT_USER=minioadmin"
# - "MINIO_ROOT_PASSWORD=minioadmin"
# ports:
# - 9090:9000
# - 9001:9001
# mysql:
# image: mysql:5.7
# container_name: mysql
# command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# restart: always
# environment:
# MYSQL_ROOT_PASSWORD: 12345678 #设置root帐号密码
# ports:
# - 3306:3306
# volumes:
# - /mydata/mysql/data:/var/lib/mysql #数据文件挂载
# - /mydata/mysql/conf:/etc/mysql #配置文件挂载
# - /mydata/mysql/log:/var/log/mysql #日志文件挂载
elasticsearch:
image: elasticsearch:7.17.3
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms2g -Xmx2g" #设置使用jvm内存大小
volumes:
- /Users/tomsmile/Desktop/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins # IK 插件挂载
- /Users/tomsmile/Desktop/mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- 9200:9200
- 9300:9300
mem_limit: 4g # 设置内存限制
cpu_shares: 512 # 设置 CPU 权重
logstash:
image: logstash:7.17.3
container_name: logstash
environment:
- TZ=Asia/Shanghai
volumes:
- /Users/tomsmile/Desktop/mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf # 修改为宿主机的文件路径
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
ports:
- 4560:4560
- 4561:4561
- 4562:4562
- 4563:4563
kibana:
image: kibana:7.17.3
container_name: kibana
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- "elasticsearch.hosts=http://elasticsearch:9200" #设置访问elasticsearch的地址
ports:
- 5601:5601
使用 Docker Compose 创建的容器网络是默认互通的,当你使用 Docker Compose 启动多个服务时,Docker Compose 会为这些服务创建一个默认的桥接网络(bridge network),这样所有的服务(容器)都会自动加入到这个网络中,后续它们可以通过服务名进行互相访问。
这里也是十分方便,如果是单独使用docker run 启动容器这种形式,则需要先创建一个网络,并在指令中进行指定,否则后续容器之间是不共通的。
docker network create test-net --driver bridge
Docker File
上面说了Docker Compose的用途,那么Docker File又是什么呢?
DockerFile本身是一个脚本文件,它的作用就是将通过maven打包好的项目jar包,推送至docker并作为一个镜像,这样所有的项目包括环境都是在docker中运行,因为Docker 容器为应用提供了一个独立、可重复的运行环境,避免了服务器之间环境差异带来的兼容性问题。通过 Dockerfile 配置文件,可以将 JAR 文件和所需的依赖打包成镜像,再在服务器上使用 Docker 运行这个镜像,不需要在每台服务器上重复配置环境。
总结
Docker Compose 和 Dockerfile 的区别:
通过 Dockerfile,我们可以创建一个自定义的镜像,然后基于该镜像运行容器。
通过 Docker Compose,可以一键启动多个服务,管理服务之间的依赖关系。
Dockerfile 用于构建单一镜像;DockerCompose 用于管理和运行多个容器。
简单理解Dockerfile是一个脚本文件,同.sh结尾一样,它是在执行操作,而DockerCompose它是一个配置文件,用于 组织和运行多个容器