草庐IT

docker-compose

咕咕崽要努力 2023-04-13 原文

docker-compose是基于docker的编排工具,能够更方便定义,管理容器,这个工具可以使用yml格式来定义,通过一条命令就可以根据编写的yml文件来创建,管理容器

为什么使用docker-compose

熟悉docker的伙伴就一定听说过docker-compose,在某些特定情况下我们要写dockerfile,构建镜像,再通过构建好的镜像 使用docker run 指定端口或者文件映射,如果只是几个容器的话,运行 管理不会很乱(规则上和使用上),一旦容器增多,你和你的同事小伙伴一起维护,因为我们每次运行的时候都要加上-v  -p 这些参数,难免会有缺少参数的情况

docker-compose就很好的解决了这个问题,可以在yml文件中提前定义好容器的镜像,数据卷,网络,端口映射等等,只需要 docker-compose up指定文件启动容器,方便维护管理

安装 docker-compose

docker-compose的安装非常的简单,只需要下载可执行的二进制文件,把他放到/use/local/bin 目录 给一个可执行权限就可以 我网盘里面有1.2版本和2.5版本,微信公众号后台回复docker-compose获取二进制包(linux的)

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 给权限
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version

docker-compose 参数

docker-compose通过yml文件来配置容器规则的,需要遵循yml的规则:

🥗 大小写敏感

🥗 缩进表示层级管理 

🥗不支持制表符tab,缩进要使用空格键,缩进一般是两个空格

🥗 字符后缩进1个空格 如 冒号 逗号

看一个我们使用的docker-compose 下面我们也会围绕这两段看内容

先看第一段 使用官方镜像的:

version: '3.0'
services:
  test-redis: 
    image: redis:7.0.0
    restart: always
    container_name: test-redis
    ports:
    - 6379:6379
    volumes:
    - ./data/init-data/redis/redis.conf:/etc/redis.conf
    - ./data/init-data/redis/data:/var/lib/redis
    command: redis-server /etc/redis.conf

可以通过上面的这个例子看出 每一行的缩进都是二的倍数 

下面我们来看他的参数

🥪  version

version字段表明使用了哪个版本的compose,不同的compose支持不同docker版本,可以在这个连接中查看版本对应关系:

https://docs.docker.com/compose/compose-file/compose-file-v3/

一般使用的是2.0,2.2,3.3 等等版本 

🥪  services

services标签定义所有的service信息,services下面的第一级是service的名字 上面的例子中 test-redis就是一个services的名称,也可以称之为子服务名

一个docker-compose文件中 version和services 这两行是必填在最开头的

🥪  image

image标签是指定服务的镜像 可以填写镜像的名称 或者是镜像:版本,也可以填写镜像的ID。镜像在本地不存在,会尝试拉取这个镜像

格式如下:

image: redis            # 默认pull laster镜像
image: redis:7.0.0    #  指定镜像版本
image: 镜像仓库/redis # 在镜像仓库中pull (个人或公司)
image: 6854c25e2674 # 通过镜像id pull

🥪  restart

restart标签 定义了启动容器的参数 就等同于 docker run中 --restart=always 一般经常使用的是always 在容器退出时总是重启容器,他还有其他参数:

no 默认策略,在容器退出时,不重启容器

on-failure 在容器非正常退出时(退出状态非0),才会重启

om-failure:3 在容器非正常退出时重启容器,最多重启三次

always 在容器退出时总是重启容器

格式如下:

  test-redis: 
    image: redis:7.0.0
    restart: always  # 在容器退出时总是重启容器

🥪  container_name

container_name标签是定义容器的名字,自定义

格式如下:

  test-redis: 
    image: redis:7.0.0
    restart: always
    container_name: test-redis  # 启动容器的名字


🥪  ports

ports标签是定义容器映射的端口,注意 容器端口要大于60 因为小于60你可能会得到一个错误的结果,yaml将会解析xx:yy这种数字格式为60进制,建议使用字符串格式

格式如下:

  ports:
  - 6379 # 容器内部6379,外部端口随机分配为主机未占用的端口
  - "6379"  # 上同
  - 6379:6379 # 容器内部6379映射容器外部6379
  - 7000-7010:7000-7010 # 这个范围的端口做映射
  - 6379:6379/udp # 限制为指定的协议

🥪  volumes

volumes标签 挂载一个目录,文件或一个已存在的数据卷容器,compose的数据卷指定路径可以是相对目录,使用 . 或者 .. 来指定相对目录。

格式如下:

  volumes:
  # 只是指定一个容器内部的路径,docker会自动创建一个逻辑卷
  - /data/redis/data
  # 使用绝对路径挂载 容器外:容器内
  - /data/redis/data:/var/lib/redis
  # 相对路径 以docker-compose文件所在的目录为相对路径
  - ./data/init-data/redis/redis.conf:/etc/redis.conf
  # 使用用户的相对路径 root用户 相对路径/root
  - ~/data/redis:/var/lib/redis
  # 使用已存在命名的数据卷
  - redisvolume:/var/lib/redis

🥪  command

command标签 类似于dockerfile中的cmd ,entrypoint 它会覆盖容器启动后默认执行的命令

格式如下:

    command: redis-server /etc/redis.conf
    command: ["redis-server","/etc/redis.conf"]

看第二段 通过使用dockerfile构建完成的镜像运行容器

  test-minio:
    build:
      context: ./
      dockerfile: ./minio/Dockerfile
    image: minio
    restart: always
    container_name: test-minio
    ports:
    - 9000:9000
    - 8888:8888
    volumes:
    - ./data/init-data/minio:/data/minio

🥪  build

build标签 可以指定dockerfile所在的路径,也可以通过context和dockerfile配合使用指定路径 上面的例子中既有build标签,也有image标签 这个是说 build构建完成的镜像命名为image标签的内容

格式如下:

  build: ./minio
  image: minio

🥪  context

context标签设置上下文根目录,以该目录为准来指定dockerfile

格式如下

  test-minio:
    build:
      context: ./  # 指定当前目录为指定目录
      dockerfile: minio/Dockerfile # 以context为当前目录 指定dockerfile目录

🥪  dockerfile

dockerfile标签是指定dockerfile文件路径 注意 以dockerfile结尾 例子👆

下面是经常会使用的一些参数

🥪  extra_hosts

extra_hosts标签作用是 往容器内/etc/hosts文件中添加记录,注意格式是相反的

格式如下:

  test-smartid:
    build:
      context: ./
      dockerfile: ./smartid/Dockerfile
    restart: always
    container_name: test-smartid
    image: test-smartid
    extra_hosts: # 在这里噢
    - "test-mysql:192.168.8.241" # 添加主机名

🥪  hostname

hostname标签是设置容器的主机名

格式如下:

  test-mq:
    hostname: test-mq # 设置容器主机名为test-mq
    image: rabbitmq:3.8.30

🥪  environment

environment设置环境变量 和dockerfile中ENV作用一致

格式如下:

  test-mq:
    hostname: test-mq
    image: rabbitmq:3.8.30-management
    restart: always
    container_name: test-mq
    environment:  # 设置环境变量
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "guest"
      RABBITMQ_DEFAULT_PASS: "guest

🥪  depends_on

depends_on标签解决了容器间依赖的问题,启动容器的先后顺序 ,假设我写了两个自服务 redis 和 mq 我在mq服务中设置 depends_on redis ,那就要等 redis启动之后 mq在启动

格式如下:

  test-mq:
    hostname: test-mq
    image: rabbitmq:3.8.30-management
    restart: always
    container_name: test-mq
    environment:
      RABBITMQ_DEFAULT_VHOST: "/"
      RABBITMQ_DEFAULT_USER: "guest"
      RABBITMQ_DEFAULT_PASS: "guest"
    ports:
    - 5672:5672
    - 15672:15672
    - 25672:25672
    depends_on:  # 等待  test-redis容器启动之后 再启动mq
      - test-redis


🍨:ok 本期内容就到这里啦,如果这个文章写的有什么问题欢迎指正,也可以留言一起讨论,最后最后最后,如果觉得我的文对你有帮助的话,也欢迎 一键三连支持一下~

    

如果觉得我的文对你有帮助的话 可以关注下我的公众号 一般写文第一时间发布到公众号中

公众号名称 咕咕崽

二维码: 

有关docker-compose的更多相关文章

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  2. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  3. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  4. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  5. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  6. 转转测试环境docker化实践 - 2

        测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境    转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境    随着微服务化的进

  7. Docker启动故障问题 no such file or directory解决方法 - 2

    1.现象服务重启后,通过dockerstart方式无法启动实例,报出错误:Errorresponsefromdaemon:errorcreatingoverlaymountto/var/lib/docker/overlay2/xxx/merged:nosuchfileordirectorydockersave导出镜像也报出2.网上各种尝试摸索无效果修改daemon.json中的storage-driver为overlay,重启无效果。禁用selinux,临时或永久方式都无效果。修改/etc/docker/daemon.json中的storage-driver为overlay2,无效果。修改/l

  8. ruby-on-rails - Rails Brick 或 Rails Composer 是否被广泛使用? - 2

    我是RubyonRails的新手,一直看到人们使用自动样板生成器,例如RailsBrick或RailsComposer创建样板用户管理系统等。来自不信任自动生成代码的背景,在Rails中使用此类系统是好的/合法的做法。此外,我正在与一家初创公司合作开展一个项目。使用这样的发电机好吗?这种习惯有多普遍。附言版主请注意,这不是询问比较/意见/争议的问题。我很好奇Rails中的一般做法以及它在生产中的使用频率。 最佳答案 我是RailsComposer的维护者所以我相信我可以权威地回答这个问题。我尊重(并分享)从头开始构建的冲动。这是一种

  9. Docker+HomeAssistant+HACS+设备接入教程 - 2

    homeassistant久仰大名,据说可以一统各大物联网平台的设备,家里各平台的设备都有一点,控制起来很不方便,于是乎我也来尝尝~homeassistant官网https://www.home-assistant.io/HACShttps://github.com/hacs/integration准备1.Linux系统(Window)其实也类似2.安装好dockerdocker安装homeassistant官方有几个版本可供选择,安装方式可以:直接刷HA的系统,也可以用Docker安装,还可以直接安装在物理机上,具体区别如下:我采用的是Docker进行安装,也就是Container,从上图也

  10. 使用软连接的方式修改Docker数据存储目录 - 2

    文章目录前言一、迁移步骤前言Docker安装的东西多了或者目录分配大小未提前规划好,就容易出现磁盘空间不足的问题,可以采用软链接的方式迁移数据目录空间。一、迁移步骤要使用软连接的方式修改Docker数据存储目录,需要执行以下步骤:1、使用systemctlstopdocker命令停止Docker服务;2、创建文件夹:mkdir/home/docker(/home/docker为新磁盘目录名);3、移动/var/lib/docker/目录到新目录中:mv/var/lib/docker/*/home/docker;4、使用rm-rf/var/lib/docker命令删除原有的Docker数据目录;

随机推荐