docker-compose用法

本文详细介绍了如何使用docker-compose配置文件管理多个容器,包括服务定义、端口、数据卷、网络连接、环境变量、依赖关系、健康检查、镜像构建以及使用Portainer进行资源监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上例子及介绍:

docker-compose中文参考手册
https://docker_practice.gitee.io/zh-cn/
官方文档地址:https://www.docker.com/get-started
version: "3.2"
services:
  #服务名称
  tomcat01:
    #指定容器名称,相当于run的--name
    container_name: tomcat01
    #服务对应的镜像,用这个镜像启动容器,镜像在本地不存在,会自动拉去该镜像,相当于run image
    image: tomcat:8.0-jre8
    # 用来完成host与容器的端口映射关系,是数据的形式,可以有多个,官方建议用引号包起来,当端口号小于60,系统会按照进制读取,会报错,相当于run -p
    ports:
      #宿主机:容器,可以有多个
      - "8083:8080"
      #- "5672:5890"
    volumes: 
    #完成宿主机与容器中目录数据卷的共享,相当于run -v,有下面两种方式
      #- /root/apps:/usr/local/tomcat/webapps     #1、适用自定义路径映射 宿主机路径:容器中的路径,在宿主机的/root/apps下就可以看到容器/usr/local/tomcat/webapps中的文件
      - tomcatwebapps01:/usr/local/tomcat/webapps #2、自动映射,但是tomcatwebapps必须声明一下
    #相当于run --network
    networks:
      #创建一个hello的桥,hello为项目的名称
      - hello 

  tomcat02: 
  	container_name: tomcat02
    image: 
    ports: 
      - "8083:8080"
    volumes: 
      - tomcatwebapps:/usr/local/tomcat/webapps
    networks:
    #代表当前服务使用哪个网桥,这样tomcat01和tomcat02就可以通信,可以在tomcat01里访问tomcat02的接口
      - hello

  mysql:
  	container_name: mysql
  	image: mysql:5.7.32
  	ports:
      - "3307:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconf:/etc/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
    networks:
      - hello

  redis:
  	container_name: redis
  	image: redis:5.0.10
  	ports: 
  	  - "6379:6379"
  	volumes:
  	  - redisdata:/data
  	networks:
  	  - hello
  	command: "redis-server --appendonly yes" 
  	# run镜像之后用来覆盖容器内默认命令,用--appendonly yes覆盖redis-server,--appendonly yes意思是开启持久化

  volumes:
  #声明上面tomcat01服务所使用的自动创建的卷名 tomcatwebapps:
    tomcatwebapps01: 
  # 声明指令的卷名,compose自动创建卷名,但是会在之前加上项目名(这是默认的方式),使用命令查看 docker volume ls(会列表所有的卷,用命令docker volume prune可以删除卷)
  # docker inspect hello_tomcatwebapps,查看里面的内容,Mountpoint对应的路径就是文件所在的位置
    external:
    # 如果要使用自定义的卷名,加这个关键字,设置为true,前提是,必须要提前创建好该卷名,否则启动时会报错,创建命令 docker volume create tomcatwebapps
      true
    tomcatwebapps02:
    mysqldata:
    mysqlconf:
    redisdata:

networks:
  # 定义服务用到的桥,常用的有 bridge,net,默认的事bridge,查看网络使用的是docker network ls
  hello:
  	external:
  	# 默认在网桥的名称前面加了项目的名称,这样就可以使用自定义的网桥名称,网桥叫hello
  	# 前提是hello这个网桥必须提前建好(建网桥 docker network create -d bridge hello,-d是隐藏,查看网桥docker network ls, docker inspect 容器ID看细节)
  	  true

这样就可以在tomcat01里面用名称访问tomcat02里面的信息
docker exec -it tomcat01 bash
curl http://tomcat02:8080
env_file: 
# 和environment搭配使用,从文件中获取环境变量,可以为单独的文件路径或者列表,如果通过docker-compose -f FILE方式来指定Compose模板文件,则env_file中变量的路径会基于模板文件路径,如果有变量名称与environment指令冲突,则以后者为准
# 这种方式可以隐藏一些敏感信息,提高安全性
# 用来将environment环境中配置放入指定文件中,这个指定文件必须是以.env结尾,里面的文件路径可以是相对路径也可以是绝对路径

version: "3.2"
services:
  mysql:
  	container_name: mysql
  	image: mysql:5.7.32
  	ports:
      - "3307:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconf:/etc/mysql
    # environment:
    #   - MYSQL_ROOT_PASSWORD=root
    env_file: 
    # 下面的写法是在docker-compose.yml所在的路径建一个mysql.env的文件,里面写了:MYSQL_ROOT_PASSWORD=root
    	- ./mysql.env
    	#-  mysql.env  这种写法也可以
    networks:
      - hello
depends-on
解决容器的依赖。启动先后的问题,真正体现了docker-compose编排容器的作用
version: "3.2"
services:
  tomcat01:
    container_name: tomcat01
    image: tomcat:8.0-jre8
    ports:
      - "8083:8080"
    volumes:
      - tomcatwebapps01:/usr/local/tomcat/webapps # 自动映射,但是tomcatwebapps必须声明一下
    networks:
      - hello
    depends-on: 
    # 代表这个容器必须依赖哪些容器启动之后才能启动
    	- tomcat02 # 服务名,不是容器名!!!
    	- redis    # 服务名,不是容器名!!!
    	- mysql    # 服务名,不是容器名!!! 三遍
    	# 并不是等这三个容器完全启动之后在启动tomcat01,而是等他们启动到一定程度之后就会启动

  tomcat02: 
  	container_name: tomcat02
    image: 
    ports: 
      - "8083:8080"
    volumes: 
      - tomcatwebapps:/usr/local/tomcat/webapps
    networks:
      - hello

  mysql:
  	container_name: mysql
  	image: mysql:5.7.32
  	ports:
      - "3307:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconf:/etc/mysql
    # environment:
    # - MYSQL_ROOT_PASSWORD=root
    env_file: 
    # 下面的写法是在docker-compose.yml所在的路径建一个mysql.env的文件,里面写了:MYSQL_ROOT_PASSWORD=root
    	- ./mysql.env
    networks:
      - hello

  redis:
  	container_name: redis
  	image: redis:5.0.10
  	ports: 
  	  - "6379:6379"
  	volumes:
  	  - redisdata:/data
  	networks:
  	  - hello
  	command: "redis-server --appendonly yes"

volumes:
  tomcatwebapps01:
    external:
      true
  tomcatwebapps01:
  mysqldata:
  mysqlconf:
  redisdata:
healthcheck
心跳检查,检查docker是否存活
version: "3.2"
services:
  mysql:
  	container_name: mysql
  	image: mysql:5.7.32
  	ports:
      - "3307:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconf:/etc/mysql
    env_file: 
    # 下面的写法是在docker-compose.yml所在的路径建一个mysql.env的文件,里面写了:MYSQL_ROOT_PASSWORD=root
    	- ./mysql.env
    networks:
      - hello
    healthcheck:
      test: ["CMD","curl","-f","http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
sysctls
修改容器中系统内核参数,并不是必须,有些服务启动会受容器内操作系统参数限制,可能会无法启动,必须修改系统参数才能启动,需要的时候加上就可以,有两种方式
sysctls:
	net.core.somaxconn: 1024
	net.ipv4.tcp_syncookies: 0

sysctls:
	- net.core.somaxconn=1024
	- net.ipv4.tcp_syncookies=0

ulimits
指定容器的ulimits限制值,例如,指定最大进程数为65535,指定文件句柄数为20000(软限制,应用可以随时修改,不能超过硬限制)和40000(系统硬限制,只能root用户提高),在使用过程中可根据当前容器运行服务要求进行修改
ulimits:
  nproc: 65535
  nofile:
	soft: 20000
    hard: 40000
docker-compose中build指令详情
build和image指定有异曲同工之处
作用:用来将指定dockerFile打包成对应的镜像,然后在运行该镜像
version: "3.8"
services:
  demo:
    build: # 用来指定Dockerfiles所在目录,先根据build中Dockerfile自动构建镜像,然后自动运行容器
      context: demo # 此时demo目录和Dockerfile是在同一个目录,可以用这种写法,可以用./demo或者绝对路径/root/demo-project/demo
      dockerfile: Dockerfile
    container_name: demo
    ports:
      - "8001:8001"
    networks:
      - hello
    depends-on:
      - tomcat01
  
  tomcat01: 
  	container_name: tomcat02
    image: 
    ports: 
      - "8083:8080"
    volumes: 
      - tomcatwebapps:/usr/local/tomcat/webapps
    networks:
      - hello
docker-compose 模板指令 和 指令
模板指令:用来书写在 docker-compose.yml文件中指令称之为模板指令,用来为服务进行服务的
指令:用来对整个docker-compose.yml对应的这个项目操作,书写在docker-compose命令之后的命令
常用指令
命令选项
docker-compose -f 
如果文件名就叫docker-compose。yml,直接用命令docker-compose up就可以启动,但是如果是自定义的名称,就要加这个参数:docker-compose -f demo-compose.yml
docker-compose -p
指定项目名称
--verbose 输出更多调试信息
-v 展示日志

up 
后年可以加选项,服务,写了服务ID,启动该服务,不跟启动所有服务
docker-compose up 前台运行,用control+c后所有服务就会停止
docker-compose up -d 服务在后台运行
默认情况,如果服务容器已经存在,docker-compose up将会尝试停止容器,然后重新创建(保持使用volumes-from挂载卷),以保证新启动的服务匹配docker-compose.yml文件的最新内容

down
此命令将会停止up命令所启动的容器,并移除网络,不会移除数据卷,只会移除自动创建的网桥,外面定义的不会移除
docker-compose down

exec
使用docker-compose进入容器
docker-compose exec 服务ID(docker-compose.yml中声明的服务ID) bash
docker exec -it 容器ID bash

ps
列出项目中目前的所有容器,docker ps是列出该docker下的所有容器
docker-compose ps

restart
重启服务
docker-compose restart 服务ID,有服务ID,重启该服务,没有ID,重启所有服务
可以指定重启前停止容器的超时(默认10秒),如果超过这个时间服务就不会启动

rm 
用来删除项目中的某个服务
-f 强制删除
docker-compose rm -f 服务ID,不加服务ID删除所有
-v 删除服务挂载的数据卷,谨慎使用

start
启动服务
docker-compose start 服务ID,不加服务ID启动所有


stop
关闭服务,不会移除网络
docker-compose stop 服务ID,不加服务ID暂停所有

top 
查看容器内运行的进程
docker-compose top 
docker-compose top 服务ID 具体查看某个容器

unpause
恢复处于暂停状态中的服务
docker-compose unpause 服务ID,不加服务ID恢复所有

pause 
暂停服务 
docker-compose pause 服务ID,不加服务ID暂停所有

logs
调试查看日志
docker-compose logs 服务ID,不加服务ID看所有
docker可是化工具
对docker里面的所运行的所有容器使用的资源监控
安装说明:https://www.portainer.io/installation/
docker pull portainer/portainer
docker volume create portainer_data
docker run -d 
	-p 8000:8000 
	-p 9000:9000 
	--name=portainer 
	--restart=always 
	-v /var/run/docker.sock:/var/run/docker.sock 
	-v portainer_data:/data 
	portainer/portainer

之所以能监控到容器,是因为他会和docker的引擎会关联,centos中,docker的引擎默认在/var/run/docker.sock,他会读取这个文件,他们之间会有通信
会把docker里面的数据持久话到portainer中,用于展示
与引擎通信用的是端口8000,与外部通信用的是9000
portainer:
  image: portainer/portainer
  container_name: portainer
  volumes:
  	- /var/run/docker.sock:/var/run/docker.sock
  	- portainer_data:/data
  networks:
  	- hello
  ports:
  	- "8000:8000"
  	- "9000:9000"

volumes:
  portainer_data:
### Docker Compose 使用指南 #### 一、简介 Docker Compose 是定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务,然后使用 `docker-compose` 一条指令即可创建并启动所有服务。 #### 二、安装方法 对于 Linux 用户来说,在线安装是一个便捷的选择。可以通过如下命令完成安装: ```bash sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose ``` 这将会把最新的 Docker Compose 版本下载下来,并放置于系统的可执行路径下[^3]。 #### 三、基本概念与语法结构 在编写 `docker-compose.yml` 文件时,可以利用多个关键字来自定义应用环境。以下是几个常用的关键字及其作用说明: - **build**: 指定 Dockerfile 所在文件夹的相对路径;Compose 将基于此构建镜像。 - **image**: 如果不想自行编译,则可以直接指定已有的镜像名称。 - **ports**: 实现宿主机端口向容器内部开放映射的功能。 - **volumes**: 支持挂载本地目录至容器内作为数据卷,便于实现数据持久化存储或跨容器间的数据交换。 - **networks**: 设定容器所属虚拟网络,方便不同服务间的通信交互。 - **environment**: 向容器传递必要的环境变量设置。 - **command**: 修改容器启动后的默认行为,即覆盖原有 ENTRYPOINT 或 CMD 的设定。 - **depends_on**: 表达各微服务组件之间存在先后次序上的依赖关系,保证按需加载资源[^4]。 #### 四、操作实例 假设有一个简单的 Web 应用场景,其中包含前端 Nginx 和后端 Flask API Server 两个部分。那么对应的 `docker-compose.yml` 可能看起来像是这样: ```yaml version: '3' services: web: build: ./nginx ports: - "8080:80" depends_on: - api api: image: my_flask_api_image environment: FLASK_ENV: production volumes: - type: bind source: ./app/static target: /var/www/html/static ``` 上述例子中,先按照给定路径下的 Dockerfile 构建名为 `web` 的 Nginx 服务器实例,并将其监听的 HTTP 请求转发到外部机器的 8080 端口上;与此同时还指定了该实例必须等待另一个叫作 `api` 的 Python 微服务完全准备好之后才能真正对外提供访问接口。而后者则是直接拉取远程仓库中的预置镜像进行初始化工作,并允许开发者自定义一些重要的参数选项以便更好地适应实际生产需求。 #### 五、常见命令解析 当一切准备就绪以后就可以借助下面这些常用的子命令来进行日常管理维护了: - **config**: 对当前项目的配置做一次全面校验,确保其合法性和完整性。 ```shell docker-compose config ``` - **up**: 启动项目内的全部服务单元,默认情况下会在前台阻塞直到收到终止信号才会退出进程。如果希望后台持续运行的话只需加上 `-d` 参数即可。 ```shell docker-compose up [-d] ``` - **down**: 关闭由本次会话所控制的一切活动着的任务实体,并清理掉它们占用的相关计算资源(比如停止容器、删除临时生成的对象等)。 ```shell docker-compose down ``` 更多高级特性以及详细的官方文档可以在参考资料里进一步查阅了解[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值