首页技术栈归档照片墙音乐日记随想收藏夹友链留言关于

Docker Compose

写作时间:2026-07-07
# 编排

Docker Compose

Docker-compose简介

官网:https://docs.docker.com/compose/

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。 Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。 Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

Compose 是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。 使用 compose,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。

Compose 的使用方式非常简单,基本上就是下面的三板斧:

  • 定义 Dockerfile
  • 定义 docker-compose.yml
  • 运行 docker-compose up

其实 compose 提供的命令可以管理应用的整个生命周期:

  • Start, stop, rebuild services
  • 查看运行中 service 的状态
  • 输出运行中 service 的日志
  • 在 service 中执行一次性的命令

Compose是Docker官方的开源项目,需要安装

Dockerfile让程序在任何地方运行,web服务,redis、mysql、nginx…多个容器

Compose

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: {}

compose安装

  1. 下载
#国外
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 国内,建议使用
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

![](/upload/articles/docker compose安装.png)

2,授权

[root@yuan bin]# chmod +x /usr/local/bin/docker-compose

compose初体验

常用命令

在使用docker-compose命令时,默认会在当前目录下查找docker-compose.yml文件

#基于docker-compose.yml启动管理的容器
docker-compose up -d
#关闭并删除容器
docker-compose down
#开启、关闭、重启已经存在的有docker-compose管理的容器
docker-compose start|stop|restart
#查看由docker-compose管理的容器
docker-compose ps
#查看日志
docker-compose logs -f

地址:https://docs.docker.com/compose/gettingstarted/

cd  /home新建一个文件
[root@yuan home]# mkdir composetest
#进入新建的目录    
[root@yuan home]# cd composetest
#编辑app.py    
[root@yuan composetest]# vim app.py
#查看app.py的内容
[root@yuan composetest]# cat app.py
import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)
#创建requirements.txt文件
[root@yuan composetest]# vim requirements.txt     
[root@yuan composetest]# cat requirements.txt 
flask
redis
#Dockerfile应用打包为镜像
#创建Dockerfile文件
[root@yuan composetest]# vim Dockerfile   
[root@yuan composetest]# cat Dockerfile 
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
#docker-compose.yml文件(定义整个服务于,需要的环境,web、redis)
[root@yuan composetest]# vim docker-compose.yml   
[root@yuan composetest]# cat docker-compose.yml
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"
#运行测试
[root@yuan composetest]# docker-compose up        

docker-compose up的执行流程

1、创建网络

2、执行Docker-compose yaml

3、启动服务

Creating composetest_web_1 … done

Creating composetest_redis_1 … done

![](/upload/articles/docker-compose up.png)

![](/upload/articles/docker-compose up --build.png)

docker-compose会自动把需要的依赖下载下来

自动的默认规则

1、文件名 composetest

2、服务

默认的服务名 文件名_num

多个服务器,集群 A B_num 副本数量

服务redis服务=>4个副本

集群状态,服务都不可能只有一个运行实例。弹性、10 HA 高并发

网络规则

通过 docker network inspect composetest_default 查看compose的网络信息,在同一个网络下,通过域名访问

如果在同一个网络下,我们可以通过域名进行访问

停止

docker-compose down
或者:Ctrl+C

编写compose.yml规则

网址:https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples

# 3层

version: '' # 版本
services: # 服务
	服务1: web
		# 服务配置
		images
		build
		network
		......
	服务2: redis
		.....
	服务3: mysql
		.....
# 其他配置 网络/卷 全局规则
volumes:
networks:
configs

![](/upload/articles/docker-compose 3层.png)

使用Compose一键部署WP博客

阿里云和宝塔要开启端口

网站地址:https://docs.docker.com/samples/wordpress/

[root@yuan home]# mkdir  my_wordpress
[root@yuan home]# cd my_wordpress
[root@yuan my_wordpress]# vim docker-compose.yml
[root@yuan my_wordpress]# cat docker-compose.yml 
version: "3.9"

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}
#前台运行
[root@yuan my_wordpress]# docker-compose up 
#后台运行
[root@yuan my_wordpress]# docker-compose up -d

浏览器访问:http://ip地址:8000/即可

实战编写自己的微服务上线

  1. 导入redis和web的依赖

  2. 编写文件

package com.springbootcompose.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

  @Autowired
  StringRedisTemplate redisTemplate;

  @GetMapping("/hello")
  public String hello(){
      Long views = redisTemplate.opsForValue().increment("views");
      return "hello yuan:"+views;
  }
}

application.properties

server.port=9000
spring.redis.host=redis

docker-compose.yml

version: "3.8"
services:
  yuanapp:
    build: .
    image: yuanapp
    depends_on:
      - redis
    ports:
      - "9000:9000"
  redis:
    image: "redis:alpine"

Dockerfile

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=9000"]

EXPOSE 9000

ENTRYPOINT ["java","-jar","/app.jar"]
  1. 打包镜像打服务器上

  1. 运行即可
docker-compose up --build
  1. 浏览器测试访问成功

实战编写自己的微服务上线2

准备一个jar包和一个Dockerfile文件在同级目录下

Dockerfile文件

#java环境
FROM java:1.8
#创建目录
RUN mkdir -p /news/certification
#设置工作目录
WORKDIR /news/certification
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#复制jar到容器
ADD yuan-biz-0.0.1-SNAPSHOT.jar /news/certification
#启动的时候运行jave -jar包
CMD java -jar yuan-biz-0.0.1-SNAPSHOT.jar

在同级目录下输入

#-f 指定Dockerfile文件  -t去名称为new-biz 
docker build -f ./Dockerfile -t new-biz .

这里进行了数据库连接需要和Mysql进行容器互联,所以还要启动mysql

docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v, /root/mysql5.7/conf:/etc/mysql/conf.d \
-v /root/mysql5.7/logs:/var/log/mysql \
-v /root/mysql5.7/data:/var/lib/mysql \
--name c1_mysql mysql:5.7

最后将启动自己发布的镜像和mysql进行以Ping通,通过--link

#将news容器和c1_mysql PING通 
docker run -d -p 8082:8082 --name news --link c1_mysql  new-biz 

最后通过浏览器访问服务器或者虚拟机

实战使用docker-compose部署

Dockerfile文件

#java环境
FROM java:1.8
#创建目录
RUN mkdir -p /news/certification
#设置工作目录
WORKDIR /news/certification
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#复制jar到容器
ADD yuan-biz-0.0.1-SNAPSHOT.jar /news/certification
#启动的时候运行jave -jar包
CMD java -jar yuan-biz-0.0.1-SNAPSHOT.jar

docker-compose.yml

version: '3.1'
services:
  mysql:
    restart: always  #只要docker启动,这个容器就会启动
    image: mysql:5.7  #指定本地下载的mysql版本
    container_name: c_mysql  #指定mysql的名称
    ports:
      - 3310:3306  #对外暴露的端口3301
    environment:
      MYSQL_ROOT_PASSWORD: root  #设置数据库密码
      TZ: Asia/Shanghai    #设置时区
    volumes:   #设置容器数据卷
      - /root/mysql5.7/conf:/etc/mysql/conf.d
      - /root/mysql5.7/logs:/var/log/mysql
      - /root/mysql5.7/data:/var/lib/mysql
  news-biz:  #自己自定义Java代码的模块,名称答意即可  ,可以有多个模块
    restart: always  #只要docker启动,这个容器就会启动
    build:
      #相对于docker-comppose的路径
      context: ./
      #指定Dockerfile的名称
      dockerfile: Dockerfile
      #通过Docker构建出来的镜像名称
    image: news-bizs
    ports:
      - 8082:8082   #暴露8082端口
      #和mysql PING 通
    links:
      - mysql

浏览器访问

实战使用docker-compose多模块部署

docker-compose.yml

version: '3.1'
services:
  mysql:
    restart: always  #只要docker启动,这个容器就会启动
    image: mysql:5.7  #指定本地下载的mysql版本
    container_name: c_mysql  #指定mysql的名称
    ports:
      - 3310:3306  #对外暴露的端口3301
    environment:
      MYSQL_ROOT_PASSWORD: root  #设置数据库密码
      TZ: Asia/Shanghai    #设置时区
    volumes:   #设置容器数据卷
      - /root/mysql5.7/conf:/etc/mysql/conf.d
      - /root/mysql5.7/logs:/var/log/mysql
      - /root/mysql5.7/data:/var/lib/mysql

   #这里有多少个模块就加多少个自定义模块,这里是登录模块和业务模块   
  news-biz:  #字段自定义Java代码的模块,名称答意即可
    restart: always  #只要docker启动,这个容器就会启动
    build:
      #相对于docker-comppose的路径
      context: ./news-biz
      #指定Dockerfile的名称
      dockerfile: Dockerfile
      #通过Docker构建出来的镜像名称
    image: news-biz
    ports:
      - 8082:8082   #暴露8082端口
      #和mysql PING 通
    links:
      - mysql

  news-login:  #字段自定义Java代码的模块,名称答意即可
    restart: always  #只要docker启动,这个容器就会启动
    build:
      #相对于docker-comppose的路径
      context: ./news-login
      #指定Dockerfile的名称
      dockerfile: Dockerfile
      #通过Docker构建出来的镜像名称
    image: news-login
    ports:
      - 8081:8081   #暴露8081端口
      #和mysql PING 通
    links:
      - mysql
...
avatar

yuanyourdomain

写代码,做研究,记录生活。

RECOMMENDED

MyBatis 动态 SQL

2026-07-08

Nginx 基础入门

2026-07-08

Maven 多模块与私服

2026-07-08