docker-compose介绍

本文分享了作者从初识 Docker 到运用 Docker Compose 的经验,并深入探讨了 Docker Compose 的基本概念、安装方法及命令使用。同时,还提供了一个包含 Nginx、Java 应用、Redis 集群和 MySQL 的实例,展示了如何实现快速部署。

docker技术很早就开始接触,最开始偷懒的想法是起一个标准的容器,在容器内安装完自己的定制需求然后再把容器转存成一个镜像。可最终开始应用的还是得乖乖的去学习dockerfile的规范,根据自己的情况写自己的dockerfile。

再后来工作中使用就是kubernetes了,不过一直没有魄力上生产;docker-compose只闻其名,没有真正的使用过。 

很多时间工作需要才是技术研究的动力,近期工作中开始应用docker-compose,提升不少效率;但受限于docker-compose的单机特性,无法原生支持服务高可用的需要,后来把眼光转向的docker-compose和docker-swarm结合的应用,但时间有限一直没有深入了解swarm模式,想当然的认为是一套轻量化的集群,可以在服务器数量有限的情况下满足我的高可用需求。但是当了解到swarm的集群创建和运行模式后,发现满足高可用最少3个master节点,woker node另算,有这3个master节点就直接上k8s了;研究的结果就是放弃,想其他办法实现一下高可用吧!

自我吐槽完毕,介绍一下docker-compose的内容吧,

我对这个工具的要求就是,轻量、简单、快速部署,目前这几点上使用起来还算不错。

docker是docker-compose的基础,装好docker再来聊docker-compose。 docker的安装这里就不介绍了。

docker-compose最重要的两个组成: docker-compose 命令和docker-compose定义文件。

1. docker-compose命令是python语言实现的命令,绝大部分python包都支持两种安装方式,docker-compose也不例外:

a. yum安装

yum install -y docker-compose

b. pip安装

pip install docker-compose

c. docker-compose常用命令

docerk-compose up  启动预定义的一系统容器,需要在当前目录下存在docker-compose.yml的文件,或者 -f  指定文件路径

docker-compose up -d   后台启动

docker-compose ps   查看当前定义所有容器的状态

docker-compose logs -f --tail 50  contanier_name   查看容器日志,相当于tail -50f  filename.txt的效果,持续跟踪容器日志

docker-compose stop  停止服务

docker-compose  [stop|start|restart] service-name  可以查看指定服务名的容器操作

docker-compose exec service-name  command  在指定的容器执行命令

以上所有操作都需要当前目录下存在一份预设的docker-compose定义文件。

2. docker-compose.yaml

docker-compose定义文件使用yaml格式,文件格式以yaml或yml结尾。 docker-compose命令在执行时会默认到当前文件夹下查找docker-compose.yaml或docker-compose.yml文件,如果不存在,则报错。也可以加-f 指定docker-compose.yml文件的路径。

docker-compose最新的版本是3.8,但是除非使用一些特别的新功能,对一般使用来说3.1以上的版本都是可以通用的,下面聊聊docker-compose文件。

#固定格式,文件开头,声明定义文件版本,最新版本为3.8
version: '3.1'
#顶级字段,声明服务
services:
  nginx:  #服务名
    image: myregister.com/myapp/nginx:v1.12   #镜像地址
    environment:    #传递给镜像的环境变量
     - TZ=Asia/Shanghai   #修改容器时区

  myapp: 
    image: myregister.com/myapp/model-myapp:3
    ports:
      - "8288"  #容器暴露的端口
    volumes:
      - /etc/localtime:/etc/localtime:ro   #另一种修改容器时区的实现方式
      - /data/myapp/config/application.properties:/myapp/config/application.properties   #挂载文件,把配置文件从宿主机映射到容器内
      - /data/myapp/logs:/data/logs
    depends_on:   #依赖服务,在指定的服务成功启动后再启动当前服务
      - redis
      - mysql

  redis:
    image: myregister.com/myapp/redis:v2.1
    ports:      #多端口服务  redis镜像,集群版,带密码;通过自定义启动脚本实现,集群创建,初始化,配置密码
      - "7001"
      - "7002"
      - "7003"
      - "7004"
      - "7005"
      - "7006"
    environment:
      REDISPASSWD: GROA1qpPoGzPc3M4maeP8Qc

  mysql:
    image: mysql:5.7  #这处是官方的镜像
    command: --default-authentication-plugin=mysql_native_password
    environment:
      TZ: "Asia/Shanghai"   #修改时区
      MYSQL_ROOT_PASSWORD: mfrYZXmQeWlRez2F   #设置mysql的密码
    volumes:
      - /data/data/mysql:/var/lib/mysql   #映射数据库存储目录 
      - /data/myapp/sql/:/docker-entrypoint-initdb.d    #mysql容器启动过程中初始化的数据
      - /data/myapp/config/my.cnf:/etc/my.cnf   #映射自定义配置文件


#顶级字段,声明当前docker-compose使用的网络
networks:
  default:   #在服务中不单独指定网络模式时,使用的默认网络
    driver: bridge  #网络的驱动

上面这段是一个比较常见的样式,一个前端加上nginx,一个后端java服务,一个Redis集群,一个mysql数据库 组成一个完整的系统;实现快速部署启动时,下面的文件复制到服务器上,在安装完docker和dockerfile之后,直接启动即可

docker-compose up -d 

启动后,通过下面命令查看服务组内,各个容器的启动状态

docker-compose ps 

注:连接到同一个网络的容器,彼此之间可以通过service name访问,如果应用中连接redis就可以用"redis:7001"这个地址;但是这个地址在redis容器内确不能用,这是一个问题还需要再验证排查一下。

3. 应用场景

2例子中不管是redis 还是mysql都是单点服务,redis也是一个伪集群的状态;所以这种形式不太适合大压力的生产环境,不适用于无法承受任务数据丢失的场景。但对于一些演示类的项目,试用类的服务非常适合,实现无配置启动。

docker-compose 搭建的lamp+redis 代码 附上docker-compose # 标准配置文件应该包含 version、services、networks 三大部分, # 其中最关键的就是 services 和 networks 两个部分,下面先来看 services 的书写规则 # 指定版本号 version: '2' services: # 在 services 标签下的第二级标签是 console,这个名字是用户自己自定义,它就是服务名称。 console: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: console # 容器内置名称 hostname: console # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/console # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # volumes_from 从其它容器或者服务挂载数据卷, # 可选的参数是 :ro 或 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。 volumes_from: - php # 挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式 # ,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统 volumes: # 使用绝对路径挂载数据卷 - /root/.ssh/:/root/.ssh/ # 类似于使用 docker run 的效果 我也不知道 不写因为console并不是直接启动导致镜像不会产生 tty: true # web,这个名字是用户自己自定义,它就是服务名称。 web: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: web # 容器内置名称 hostname: web # 指明路径 build: # context 指定绝对路径或者相对路径 context: ./images/nginx # dockerfile 指定 Dockerfile 的文件名称 dockerfile: Dockerfile # 映射端口 ports: - '80:80' # 此选项解决了启动顺序的问题 这个的意思是必须在php启动以后才能启动 # 注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时, # 也会启动 php 服务,因为在配置文件中定义了依赖关系 depends_on: - php # volumes_from 从其它容器或者服务挂载数据卷, volumes_from: - php volumes: # 已经存在的命名的数据卷 - nginx-log:/var/log/nginx # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器 - ./images/nginx/sites-enabled:/etc/nginx/sites-enabled - ./images/nginx/cert:/etc/nginx/cert # 加入指定网络 networks: default: # 同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器 aliases: - web.sunchanghao.top - mid.sunchanghao.top - sevice.sunchanghao.top - admin.sunchanghao.top # php,这个名字是用户自己自定义,它就是服务名称。 php: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: php # 容器内置名称 hostname: php # 服务除了可以基于指定的镜像,还可以基于一份 Dockerfile, # 在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile # 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器 build: # context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url # 当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context context: ./images/php # 使用此 dockerfile 文件来构建,必须指定构建路径 dockerfile: Dockerfile # 挂载一个目录或者一个已存在的数据卷容器, volumes: # 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。 - ./app:/mnt/app # db,这个名字是用户自己自定义,它就是服务名称。 db: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: db # 容器内置名称 hostname: db # 从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID image: mysql:5.7 environment: MYSQL_USER: 'sch' MYSQL_PASS: '1111' MYSQL_ROOT_PASSWORD: 'root' volumes: - db:/var/lib/mysql ports: - '3306:3306' redis: # 为自定义的容器指定一个名称,而不是使用默认的名称 container_name: redis # 容器内置名称 hostname: redis # image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。 image: redis:3.2.7 # 设置端口号 ports: - '6379:6379' # 挂载一个目录或者一个已存在的数据卷容器 volumes: # 已经存在的命名的数据卷。 - redis:/data # node volumes: nginx-log: # 设置volume的驱动,默认是local. driver: local db: driver: local redis: driver: local
<think>好的,用户想了解docker-compose的简介以及各操作系统下的安装方法。首先,我需要明确docker-compose是什么,它的作用是什么。根据已有的知识,docker-composeDocker官方的开源项目,用于定义和运行多容器应用。用户通过编写YAML文件来配置应用服务,然后使用一条命令启动所有服务。 接下来,用户需要安装方法。根据提供的引用,不同的操作系统有不同的步骤。比如在Ubuntu/Debian系统下,可以使用apt安装,而CentOS/RHEL可能需要先添加Docker仓库再用yum安装。还有离线安装的情况,需要下载二进制文件并赋予执行权限。 需要检查引用中的信息是否准确。例如引用[1]提到在Ubuntu中使用sudo apt install docker-ce docker-compose,但docker-compose可能有单独的安装步骤,因为有些系统默认仓库中的版本较旧,可能需要从GitHub下载最新版。引用[3]和[4]提到了使用yum安装,以及配置国内镜像源,这需要详细说明步骤。 另外,用户可能对安装后的验证步骤感兴趣,比如运行docker-compose --version,或者创建一个简单的docker-compose.yml文件测试。还要注意权限问题,可能需要将用户加入docker组,避免每次使用sudo。 需要整理出清晰的步骤,分操作系统说明,确保每个步骤正确无误,并参考提供的引用信息。同时,提醒用户常见问题,比如网络问题导致下载慢,建议更换国内镜像源。 最后,生成相关问题,帮助用户深入学习,比如如何编写docker-compose文件,常用命令,多环境配置等。确保回答结构清晰,符合用户的需求,并且信息准确可靠。</think>### Docker Compose 简介 **Docker Compose** 是 Docker 官方提供的容器编排工具,用于定义和运行多容器应用。通过编写 $docker-compose.yml$ 文件,用户可快速配置服务依赖关系、网络、存储卷等,实现一键部署复杂应用[^2]。 核心功能: 1. **多容器管理**:通过 YAML 文件统一管理多个容器 2. **环境隔离**:支持自定义网络和存储卷配置 3. **服务编排**:按依赖顺序启动容器(如数据库先于应用启动) --- ### 各操作系统安装方法 #### 一、Linux 系统 1. **Ubuntu/Debian** ```bash # 更新软件源 sudo apt update # 安装 DockerDocker Compose sudo apt install docker-ce docker-compose -y # 启动服务并设置开机自启 sudo systemctl enable --now docker ``` 验证安装: ```bash docker --version && docker-compose --version ``` 2. **CentOS/RHEL** ```bash # 添加 Docker 官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 DockerCompose sudo yum install docker-ce docker-compose-plugin -y # 启动服务 sudo systemctl enable --now docker ``` #### 二、Windows/macOS 1. **Docker Desktop 集成** 直接安装 Docker Desktop(含 Compose): - Windows:下载 `Docker Desktop Installer.exe`[^4] - macOS:通过 Homebrew 或官网下载 ```bash brew install --cask docker ``` 2. **离线安装**(所有系统通用) ```bash # 下载二进制文件 sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod +x /usr/local/bin/docker-compose ``` --- ### 配置优化建议 1. **国内镜像加速**:编辑 $/etc/docker/daemon.json$ 添加阿里云或腾讯云镜像源[^3] ```json { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] } ``` 2. **权限管理**:将用户加入 docker 组避免频繁使用 sudo ```bash sudo usermod -aG docker $USER ``` --- ### 快速验证示例 创建测试文件 $docker-compose.yml$: ```yaml version: '3' services: nginx: image: nginx:alpine ports: - "80:80" ``` 运行命令: ```bash docker-compose up -d ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值