【Docker】学习笔记(三)三剑客之 docker-compose文件书写项目多服务容器运行
简介
引言(需求)
- 为了完成一个完整项目势必用到N多个容器配合完成项目中的业务开发,一旦引入N多个容器,N个容器之间就会形成某种依赖,也就意味着某个容器的运行需要其他容器优先启动之后才能正常运行;
容器的编排(先后运行顺序)至关重要
- 无法从项目的角度将一组容器划分到一起,日后难点在于项目多服务器部署
项目角度:管理一组项目容器
功能
- 实现对docker容器集群的快速编排(站在项目角度将一组容器集合在一起,对这组容器按照一定顺序进行启动)
- 通过定义一个单独的
docker-compose.yml
配置文件来定义一组相关联的应用容器为一个项目
重要概念
- 项目(project): 由一组关联的应用容器(服务)组成的一个完整业务单元,在
docker-compose.yml
文件中定义 - 服务(services): 一个应用的多个容器,实际上可以包括若干个运行相同镜像的容器实例
docker-compose安装
安装
apt安装
sudo apt install -y docker-compose
pip安装
sudo pip3 install docker-compose
验证是否安装成功及其版查询版本
docker-compose -v
# 输出信息如下:
docker-compose version 1.25.0, build unknown
docker-compose 与docker-engine 版本兼容关系
# 查看本地版本
docker -v
# Docker version 24.0.7
# docker-compose 指定vision版本3.2,意味着部署服务器docker engin引擎版本至少高于17.04.0
# 具体对应关系官网查看
# https://docs.docker.com/compose/compose-file/compose-file-v3/
# 版本不支持会报如下错误
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
案例一(文件基本结构)
- 创建一个工程项目目录
mkdir -p ems/docker
cd ems/docker
- 在项目根目录下创建配置文件
docker-compose.yml
# docker-compose 版本号
version: "3.3"
# 一个应用服务
services:
tomcat01:
# 利用本地仓库已经构建好的镜像,如果没找到会自动尝试hub上pull
image: tomcat:8.0
# 容器名称 --name
container_name: tomcat01
# 做端口映射 -p
ports:
- "8080:8080"
# - "8081:8081" # 可以映射多个端口
tomcat02:
image: tomcat:8.0
container_name: tomcat02
ports:
- "8081:8080"
redis01:
image: redis:5.0.12
container_name: redis01
ports:
- "6379:6379"
mysql01:
image: mysql:5.6
container_name: mysql01
# 给当前容器指定环境参数 类似于 docker run -e MYPASSWORD=root redis:5.0.12 -d
ports:
- "3306:3306"
environment:
- "MYSQL_ROOT_PASSWORD=ROOT" # 推荐写法
- MYSQL_ROOT_PASSWORD:root
# 指定同步数据卷 -v ./data路径一定要先存在
volumes:
# 相对或绝对路径
# - ./data:/var/lib/mysql
# 别名挂载数据卷一定要先申明
# ERROR: Named volume "data:/var/lib/mysql:rw" is used in service "mysql01" but no declaration was found in the volumes section
- data:/var/lib/mysql
# 申明数据卷别名
volumes:
data:
- 启动 docker-compose 一组服务
# -d 表示后台启动容器
docker-compose up -d
# 直接bash面板启动
docker-compose up
- 访问一下tomcat
http://192.168.18.224:8080/
docker-compose down
清除上一次的缓存配置(连同创建的容器一起清除)
docker-compose 常用服务配置命令详解
官方参考文档
https://docs.docker.com/compose/compose-file/build/
Dockerfile
文件
# 指定基础镜像
FROM openjdk:8-jre
# ARG特殊,他不是有效指令,可以在FROM之前
ARG buildno
ARG password
# 暴露端口(可以在容器服务中暴露)
EXPOSE 8081
# 设置环境变量
ENV APP_PATH=/apps
# 指定工作目录
WORKDIR ${APP_PATH}
# 拷贝文件到镜像中
COPY apps.jar ${APP_PATH}
# 使用数据卷
VOLUME ${APP_PATH}
# 运行jar包 java -jar apps.jar
ENTRYPOINT [ "java", "jar" ]
CMD [ "apps.jar" ]
默认情况下,Dockerfile
中指定的选项(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,不需要在docker-compose.yml
中再次指定它们
docker-compose.yml
文件
version: "3.3"
services:
tomcat01:
image: tomcat:8.0
container_name: tomcat01
ports:
- "8080:8080"
networks:
- sensiz
restart: always
apps:
# 通过Docjerfile文件指定镜像
# build: ./ # 可以直接指定,其他参数默认
build:
# 指定dockerfile上下文目录,也可以是git仓库的URL
context: ./
# 指定Dockerfile的文件名,如果为默认值Dockerfile可以不写
dockerfile: Dockerfile
# # 给docker中传入环境变量参数
# args:
# buildno: 1
ports:
- 8081:8080
cap_add:
- ALL
command: ["test.jar"]
# 先启动顺序tomcat01 mysql resdi,再启动apps
depends_on:
- tomcat01
- mysql01
# - redis
networks:
- sensiz
mysql01:
image: mysql:5.6
# 数据卷别名要首先申明
volumes:
- data:/var/lib/mysql
ports:
- "3303:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
# env_file:
# - ./ENV_FILE.env
expose:
- 8888
# 声明数据卷别名
volumes:
data:
# 申明使用的网桥
networks:
sensiz:
image
🌸 指定启动容器的镜像,可以是镜像仓库/标签或者镜像id(或者id的前一部分)
如果本地仓库镜像不存在,Compose将尝试从官方镜像仓库将其pull下来,如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记。但最好指定二者之一即可。
build
🌸 通过dockerfile
构建镜像(即同样支持docker engine
中的 docker build -t thicv:v1.0 . )
注 build
与image
最好指定一个即可,即通过其中一种方式指定镜像
version: "3.3"
services:
apps:
# 通过Docjerfile文件指定镜像
# build: ./ # 可以直接指定,其他参数默认
build:
# 指定dockerfile上下文目录,也可以是git仓库的URL
context: ./
# 指定Dockerfile的文件名,如果为默认值Dockerfile可以不写
dockerfile: Dockerfile
# # 给docker中传入环境变量参数
args:
buildno: 1
password: secret
# 也可以是
# - password=secret
args添加构建镜像的参数,环境变量只能在构建过程中访问。 首先,在Dockerfile中指定要使用的参数:
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
cap_add | cap_drop
指定容器的内核能力(capacity)分配
# 如拥有所有能力可以指定为
cap_add:
- ALL
# 去掉NET_ADMIN能力
cap_drop:
- NET_ADMIN
command
🌸 覆盖容器启动后默认执行的命令 类似于docker run image test.jar
containner_name
🌸 指定容器名称,如若不指定,默认名称使用: 项目名称-服务名称-序列号 格式
注:指定容器名称后,该服务器将无法进行扩展,不推荐使用
volumes
🌸 指定宿主机与容器文件的映射
注 别名一定要先声明,挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读
version: "3.3"
services:
mysql01:
image: mysql:5.6
# 数据卷别名要首先申明
volumes:
- data:/var/lib/mysq:ro
# 声明数据卷别名
volumes:
data:
depends_on
🌸 解决容器的依赖、启动先后问题
但当前服务不会等待被依赖服务【完全启动】之后才启动
environment | env_file
-
environment指定容器启动时的环境变量,类似于docker run -e 选项
-
env_file 指定容器启动时的环境变量文件
version: "3.3"
services:
mysql01:
image: mysql:5.6
# 数据卷别名要首先申明
environment:
- MYSQL_ROOT_PASSWORD=root
# env_file:
# - ./ENV_FILE.env
expose
🌸 暴露端口,但不映射到宿主机,只与被链接的服务访问,且仅可以指定内部端口为参数
labels
为容器添加元数据信息,做辅助说明
networks
🌸 用来指定启动容器使用的网桥,类似于docker run --network
一个项目的一组容器应当在同一个网桥中
ports
🌸 用来指定宿主机与容器间的端口映射
restart
指定容器退出后 的策略为始终重启,相当于daocker run --restart=always
-
always
总是重新启动 -
no
是默认重启策略,即任何情况都不会重启 -
on-failure
退出代码只是出现故障,重新启动
restart: always
docker-compose 常用操作命令进阶
大部分命令的对象可以是项目本身,也可以指定为项目中的服务或容器
docker engine
的命令同样可以操作服务容器
语法 docker-compose [选项] [服务id]
指令 | 说明 |
---|---|
docker-compose --help | 查询命令帮助 |
docker-compose up | 对整个项目进行操作(镜像构建、创建服务、启动服务并关联服务相关容器的额一系列造作)-d表示后台启动 |
docker-compose up [servicesID] | 仅仅启动compose中某一个服务容器 |
docker-compose down | 停止并删除所有启动的容器、网桥等 |
docker-compose down [servicesID] | 仅仅关闭compose中某一个服务容器 |
docker-compose exec [servicesID] | 进入某个已经运行的容器(这样不用加选项 -it) |
docker-compose ps | 列出所有运行的容器 |
docker-compose restart | 重启整个项目 |
docker-compose restart [servicesID] | 仅仅重启某一个服务 |
docker-compose rm | 删除所有项目(删除已经停止的服务容器),-f 选项也可以强制删除,-v 删除挂载的数据卷 |
docker-compose rm [servicesID] | 仅仅删除某一个服务 |
docker-compose top | 查看项目中所有的服务容器运行进程 |
docker-compose top [services] | 仅仅查看对应服务的运行进程 |
docker-compose logs [servicesID] | 查看对应服务容器的运行日志,-f 实时查看 |
docker-compose -f ./docker-compose.yml
在某路径下查询docker-compose.yml
文件
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!