当前位置:首页 > 技术 > 正文内容

Docker Compose 模板、命令与实用指南

访客 技术 2026年7月11日 3

Docker Compose

笔记来源与编程不良人的docker-compose教学 : https://www.bilibili.com/video/BV1wQ4y1Y7SE?p=30&vd_source=91fb39ddf3fc1f01afd5208696618e41

怕自己忘记, 记录此笔记.....

安装Docker-Compose

docker-compose模板

网上下的, 具体位置忘记了

多个服务

# Compose 版本 Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"

# 定义服务
services:

  # 为project定义服务
  redis:
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: redis:4.0
    # 配置端口 - "宿主机端口:容器暴露端口"
    ports:
    - "6379:6379"
      # 配置容器连接的网络,引用顶级 networks 下的条目(就是最下面配置的networks(一级目录))
    networks:
      network_name:
          # 为单redis创建别名, REDIS_URL标记为redis服务的地址. (不配置aliases也可以, 这样就通过定义的服务名: redis链接)
        aliases:
         - REDIS_URL
    # 挂载
    volumes:
      - "/docker/redis/conf/redis.conf:/etc/redis/redis.conf"
      - "/docker/redis/data:/data"
    # 容器总是重新启动
    restart: always
    # 相当于执行一些命令
    command:
      redis-server /etc/redis/redis.conf --appendonly yes
    # 指定一个自定义容器名称,而不是生成的默认名称。
    container_name: redis
    # 使用该参数,container内的root拥有真正的root权限。
    privileged: true

  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    # 添加环境变量
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    volumes:
      - "/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf"
      - "/docker/mysql/logs:/var/log/mysql"
      - "/docker/mysql/data:/var/lib/mysql"
      - "/docker/mysql/sql/init.sql:/docker-entrypoint-initdb.d/init.sql"
      - "/etc/localtime:/etc/localtime"
    networks:
      network_name:
        aliases:
        - MYSQL_URL
    restart: always
    command: --init-file /docker-entrypoint-initdb.d/init.sql
    container_name: mysql
    privileged: true

  app-service:
    # 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像
    image: app-service:1.0.0
    # 构建镜像
    build:
      # 指定项目的地址
      context: /root/docker_mysql_redis
      # 指定Dockerfile
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    # 从文件添加环境变量
    env_file:
      - /root/environment.env
    networks:
      network_name:
        aliases:
          - APP_URL
    privileged: true
    restart: always
    container_name: test-app
# ........可以继续添加

networks:
  # bridge:默认,需要单独配置ports映射主机port和服务的port,并且开启了容器间通信
  network_name:
    driver: bridge


单个服务

version: "3"

services:

  nacos:
    image: nacos/nacos-server:1.2.1
    ports:
    - "8848:8848"
      # 加入已存在的网络 docker_network_mysql(docker-mysql.yaml), 并创建一个新的网络 network_nacos
    networks:
      network_nacos:
        aliases:
          - NACOS_URL
        # 通过docker network ls 进行获取
      docker_network_mysql:
    restart: always
    environment:
      MODE: standalone
    container_name: nacos
    privileged: true

networks:
  docker_network_mysql:
    external: true
  network_nacos:
    driver: bridge


实战

  • 编写docker-compose.yaml, 第一行的version根据docker版本填写对应版本
# 代表使用docker-compose项目的版本号
version: "3.8"

services:
  # 服务名 自定义的
  web-server:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080

  • 启动docker-compose服务
# 需要在docker-compose   .yaml目录下执行启动命令
docker-compose up

  • 再启动一个tomcat
# 代表使用docker-compose项目的版本号
version: "3.8"

services:
  # 服务名 自定义的
  web-server:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  web-server-02:
   image: tomcat:8.0
   ports:
    - 8081:8080

  • 添加一个redis服务
# 代表使用docker-compose项目的版本号
version: "3.8"

services:
  # 服务名 自定义的
  web-server:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  web-server-02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  cache-service:
   image: redis:5.0.12
   ports:
    - 6379:6379
#   volumes:
   # 在配置文件挂载目录, 添加上redis.conf配置文件, 不然挂在出来会是个文件夹
#    - "/home/docker-compose/redis/conf/redis.conf:/etc/redis/redis.conf"
#    - "/home/docker-compose/redis/data:/data"

  • 再添加一个mysql
version: "3.8"
services:
  # 服务名 自定义的
  web-server:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  web-server-02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  cache-service:
   image: redis:5.0.12
   ports:
    - 6379:6379
  database:
   image: mysql:8.0
   ports:
    - 3306:3306
   enviroment: 
    - "MYSQL_ROOT_PASSEORD=admin@123"

  • 给mysql添加挂载目录
version: "3.8"
services:
  # 服务名 自定义的
  web-server:
   # 镜像名
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  web-server-02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  cache-service:
   image: redis:5.0.12
   ports:
    - 6379:6379
  database:
   image: mysql:8.0
   ports:
    - 3306:3306
   enviroment: 
    - "MYSQL_ROOT_PASSEORD=admin@123"
   volumes:
    - /home/docker-compose/mysql:/var/lib/mysql

  • 自定义容器名
version: "3.8"
# 管理一组服务 
services:
  # 服务名 自定义的
  web-server:
  # 给当前取名字
  container_name: tomcat-01
   # 镜像名 
   images: tomcat:8.0
   ports:
    # 端口映射, 多个写多行
    - 8080:8080
  web-server-02:
   image: tomcat:8.0
   ports:
    - 8081:8080
  cache-service:
  container_name: redis-01
   image: redis:5.0.12
   ports:
    - 6379:6379
  database:
  container_name: mysql-01
   image: mysql:8.0
   ports:
    - 3306:3306
   enviroment: 
    - "MYSQL_ROOT_PASSEORD=admin@123"
   volumes:
    - /home/docker-compose/mysql:/var/lib/mysql

Docker-Compose模板命令

build

构建 , 通过docker-compose在启动容器之前根据Dockerfile构建镜像, 然后根据构建的镜像启动容器

version: "3.8"
services:
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"

command

覆盖启动后默认执行的指令, 相当于在把app.jar改为test.jar

Dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=9080"]
EXPOSE 9080
ENTRYPOINT ["java", "-jar"]
CMD ["/app.jar"]

docker-compose.yaml

version: "3.8"
services:
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
    command: test.jar

container_name

用来指定docker-compose启动容器名称, 不推荐使用, docker不允许同样名字容器存在

version: "3.8"
services:
  web-server:
   image: tomcat:8.0
   container_name: tomcat-01
   ports: "8080:8080"

depends_on

解决容器依赖,启动先后的问题

version: "3.8"
services:
  web-server:
   image: tomcat:8.0
   ports: "8080:8080"
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再web-server启动之后再启动当前容器, 多个多行
			- web-server
#			- database
#			- cache-service

env_file

设置环境变量

version: "3.8"
services:
  web-server:
   image: tomcat:8.0
   ports: "8080:8080"
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再web-server启动之后再启动当前容器, 多个多行
			- web-server
  database:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 enviroment:
	  MYSQL_ROOT_PASSWORD:admin@123

在服务器中添加.env文件, 隐藏不想展示的环境变量, .env文件在服务器上是隐藏文件. ls -a才看得到

.env

MYSQL_ROOT_PASSWORD:admin@123

docker-compose.yaml

version: "3.8"
services:
  web-server:
   image: tomcat:8.0
   ports: "8080:8080"
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再web-server启动之后再启动当前容器, 多个多行
			- web-server
  database:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file

expose

用来指定构建镜像过程中容器暴露的端口, 一般是自己构建的镜像中需要该指令, 一般在Dockerfile中使用

version: "3.8"
services:
  web-server:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再web-server启动之后再启动当前容器, 多个多行
			- web-server
  database:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file

image

指定启动容器使用的镜像

network

用来指定容器启动用的网桥 相当于docker -network

docker-compose.yaml

version: "3.8"
services:
  web-server:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
   networks: 
    - app-network
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再web-server启动之后再启动当前容器, 多个多行
			- web-server
   networks: 
    - app-network
  database:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file
	 volumes:
	 # 需要添加声明
	  - mysqlData:/var/lib/mysql
   networks: 
    - app-network
    
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
 app-network:

volumes

数据卷挂载

docker-compose.yaml

version: "3.8"
services:
  web-server:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
   networks: 
    - app-network
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再web-server启动之后再启动当前容器, 多个多行
			- web-server
   networks: 
    - app-network
  database:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file
	 volumes:
	 # 需要添加声明
	  - mysqlData:/var/lib/mysql
   networks: 
    - app-network
   restart: always
    
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
 app-network:
volumes:
 mysqlData: 

ports

宿主机和容器端口映射, 相当于docker run -p

restart

用来指定docker容器总是运行 相当于docekr run --restart=always

version: "3.8"
services:
  web-server:
   expose: 8080
   image: tomcat:8.0
   ports: "8080:8080"
   networks: 
    - app-network
  app-service:
    build:
      context: ./
      dockerfile: DockerFile
    ports:
      - "9870:8080"
		depends_on:
		# 再web-server启动之后再启动当前容器, 多个多行
			- web-server
   networks: 
    - app-network
  database:
	 image: mysql:8.0
	 ports: "3306:3306"
	 # 设置环境变量
	 env_file: ./.env.file
	 volumes:
	 # 需要添加声明
	  - mysqlData:/var/lib/mysql
   networks: 
    - app-network
   restart: always
    
# 上面这种直接使用网桥的方式, docker不会自动创建网桥, 需要声明一下
networks:
 app-network:
volumes:
 mysqlData: 

docker-compose常用命令

服务id 就是docker-compose.yaml中的服务名

up / up -d 启动

# 启动整个项目
docker-compose up

# 启动某个服务, 服务id指的是定义在yaml中services下的服务名
docker-compose up [服务id]      docker-compose up database

# 后台启动
docker-compose up -d

stop 停止

docker-compose stop [options] [SERVICES...]

停止运行状态的容器

start 开启

docker-compose start [SERVICES...]

开启停止状态的容器

down 停止

类似 up , 不跟服务名 停止全部, 并且会移除网络

docker-compose down [服务id]

restart 重启

# 重启整个项目
docker-compose restart 

# 重启指定服务
docker-compose restart [服务id]

# 指定时间重启, 20秒后重启
docker-compose restart -t 20

rm 删除

# 删除所有停止状态的服务容器, 推荐先执行docker-compose stop命令停止容器
docker-compose rm [options] [SERVICE...]

-f --force强制直接删除, 包括非停止状态的
-v 删除容器挂载的数据卷

-f 指定docker-compose文件名

# 默认是docker-compose,  可以不写
docker-compose -f docker-compose.yml

exec 进入指定容器

docker-compose exec 服务id bash

ps 列出所有运行的服务

docker-compose ps

pause / unpause 暂停 恢复

# 暂停所有服务
docker-compose pause 

# 暂停指定服务
docker-compose pause [SERVICE]

# 恢复同理

logs 日志

docker-compose logs -f [服务id]

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。