首頁> 運維> Docker> 主體

你必須了解的Docker Compose(總結分享)

WBOY
發布: 2022-02-02 06:00:32
轉載
3019 人瀏覽過

這篇文章為大家帶來了關於Docker Compose的相關知識,希望對大家有幫助。

為什麼需要Docker Compose

Docker幫助我們解決服務的打包安裝的問題,隨著而來的問題就是服務過多的帶來如下問題,

  1. 多次使用Dockerfile Build Image或DockerHub拉取Image;

  2. 需要建立多個Container,多次編寫啟動指令;

  3. Container互相依賴的如何進行管理和編排;

當我們服務數量增多的時候,上面三個問題就會更加的被放大,如果這三個問題不解決,其實從虛擬機器到容器化除了機器減少一些浪費以外,好像沒有更多的變化。 Docker有沒有什麼好的方法,可以讓我們透過一個配置就搞定容器編排和運行呢?這個時候Docker Compose就站出來了。

Docker Compose可以做到以下幾點:

  1. 提供工具用於定義和運行多個docker容器應用程式;

  2. #使用yaml檔案來設定應用程式服務(docker-compse.yml);

  3. #可以透過一個簡單的指令docker-compse up可以依照依賴關係啟動所有服務;

  4. 可以透過一個簡單的指令docker-compose down停止所有服務;

  5. 當一個服務需要的時候,可以很簡單地通過--scale進行擴容;

Docker Compose有以下特徵:

  1. 更高的可移植性,Docker Compose只需一個docker-compse up可以完成按照依賴關係啟動所有服務,然後使用docker-compose down輕鬆將其拆解。幫助我們更輕鬆地部署複雜的應用程式;

  2. 單一主機上的多個隔離環境,Compose可以使用專案名稱將環境彼此隔離,這帶可以在一台電腦上運行相同環境的多個副本,它可以防止不同的專案和服務相互幹擾;

Docker Compose介紹

  1. Docker Compose是一個工具,用於定義和運行多容器應用程式的工具;

  2. Docker Compose透過yml檔案定義多容器的docker應用程式;

  3. Docker Compose透過一條指令根據yml檔案的定義去建立或管理多容器;

    你必須了解的Docker Compose(總結分享)

Docker Compose 是用來做Docker 的多容器控制,就是用來把Docker 自動化的東西。有了 Docker Compose 你可以把所有繁複的 Docker 操作全都一條指令,自動化的完成。

Docker Compose安裝

Docker Compose安裝的最新的版本1.29.2,對於Mac和Windows安裝好Docker以後,就已經安裝好Docker Compose,不需要手動安裝,這裡的安裝方式是基於Linux的Cnetos的,大家也可以參考官方網站去安裝,

具體步驟如下:

  1. 下載Docker Compose 二進位文件,版本1.29.2是目前最新最穩定的版本,要下載舊版的大家可以更改版本號,可以參考github的版本號進行選擇;

    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    登入後複製
  2. 對二進位檔應用可執行權限;

    sudo chmod +x /usr/local/bin/docker-compose
    登入後複製
  3. 安裝以後透過docker-compose --version指令檢查是否安裝成功;

    ##你必須了解的Docker Compose(總結分享)

Docker Compose版本介紹

Docker Compose版本與引擎的對應關係如下,可以看到中間主要有兩個版本2和版本3兩種格式,目前大家使用比較多也就是這兩種,對於這兩個版本的差異跟大家介紹一下:

  1. v3 版本不支援volume_from 、extends、group_add等屬性;

  2. #cpu 和記憶體屬性的設定移到了deploy 中;

  3. v3 版本支援Docker Swarm,而v2 版本不支援;

注意:官方目前在1.20.0 引進了一個新--compatibility標誌,幫助開發人員輕鬆的過渡到v3,目前還有些問題官方還不建議直接使用到生產,建議大家直接上手v3版本。

你必須了解的Docker Compose(總結分享)

Docker Compose基本指令介紹

Docker Compose指令基本上和Docker相差不多,主要就是對Docker Compose生命週期控制、日誌格式等相關指令,可以透過docker-compose --help來協助。

#构建建启动nignx容器 docker-compose up -d nginx #进入nginx容器中 docker-compose exec nginx bash #将会停止UP命令启动的容器,并删除容器 docker-compose down #显示所有容器 docker-compose ps #重新启动nginx容器 docker-compose restart nginx #构建镜像 docker-compose build nginx #不带缓存的构建 docker-compose build --no-cache nginx #查看nginx的日志 docker-compose logs nginx #查看nginx的实时日志 docker-compose logs -f nginx #验证(docker-compose.yml)文件配置, #当配置正确时,不输出任何内容,当文件配置错误,输出错误信息 docker-compose config -q #以json的形式输出nginx的docker日志 docker-compose events --json nginx #暂停nignx容器 docker-compose pause nginx #恢复ningx容器 docker-compose unpause nginx #删除容器 docker-compose rm nginx #停止nignx容器 docker-compose stop nginx #启动nignx容器 docker-compose start nginx
登入後複製
Docker Compose實戰

我們建構一個如下的應用,透過Nginx轉送給後端的兩個Java應用;

你必須了解的Docker Compose(總結分享)

  1. 新建Spring Boot应用,增加一个HelloController,编写一个hello方法,返回请求的端口和IP;

/** * hello * * @author wangtongzhou * @since 2021-07-25 09:43 */ @RestController public class HelloController { @GetMapping("/hello") public String hello(HttpServletRequest req) throws UnknownHostException { return "hello"; } }
登入後複製
  1. 指定Spring Boot的启动入口;

   org.springframework.boot spring-boot-maven-plugin   cn.wheel.getway.WheelGetWay      repackage      
登入後複製
  1. 打包Spring Boot应用;

mvn package
登入後複製
  1. 上传文件到Linux服务器/usr/local/docker-compose-demo的目录;

  2. 在/usr/local/docker-compose-demo的目录编辑Dockerfile;

#指定基础镜像 FROM java:8 LABEL name="docker-compose-demo" version="1.0" author="wtz" COPY ./getway-1.0-SNAPSHOT.jar ./docker-compose-demo.jar #启动参数 CMD ["java","-jar","docker-compose-demo.jar"]
登入後複製
  1. 编辑docker-compose.yml文件;

version: '3.0' networks: docker-compose-demo-net: driver: bridge ipam: config: - subnet: 192.168.1.0/24 gateway: 192.168.1.1 services: docker-compose-demo01: build: #构建的地址 context: /usr/local/docker-compose-demo dockerfile: Dockerfile image: docker-compose-demo container_name: docker-compose-demo01 #选择网络 networks: - docker-compose-demo-net #选择端口 ports: - 8081:8080/tcp restart: always docker-compose-demo02: build: #构建的地址 context: /usr/local/docker-compose-demo dockerfile: Dockerfile image: docker-compose-demo container_name: docker-compose-demo02 #选择网络 networks: - docker-compose-demo-net #选择端口 ports: - 8082:8080/tcp restart: always nginx: image: nginx:latest container_name: nginx-demo networks: - docker-compose-demo-net ports: - 80:80/tcp restart: always volumes: - /usr/local/docker-compose-demo/nginx.conf:/etc/nginx/nginx.conf:rw volumes: docker-compose-demo-volume: {}
登入後複製
  1. 编写nginx.conf,实现负载均衡到每个应用,这里通过容器名称访问,因此不需要管每个容器的ip是多少,这个也是自定义网络的好处;

user nginx; worker_processes 1; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; location / { proxy_pass http://docker-compose-demo; proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } upstream docker-compose-demo{ server docker-compose-demo01:8080; server docker-compose-demo02:8080; } include /etc/nginx/conf.d/*.conf; }
登入後複製
  1. 查看/usr/local/docker-compose-demo目录,有以下确保有以下四个文件;

你必須了解的Docker Compose(總結分享)

  1. 检查docker-compose.yml的语法是否正确,如果不发生报错,说明语法没有发生错误;

docker-compose config
登入後複製
  1. 启动docker-compose.yml定义的服务;

docker-compose up
登入後複製

你必須了解的Docker Compose(總結分享)

  1. 验证服务是否正确;

#查看宿主机ip ip add #访问对应的服务 curl http://172.21.122.231/hello
登入後複製

你必須了解的Docker Compose(總結分享)

你必須了解的Docker Compose(總結分享)

Docker Compose Yml文件介绍

版本

对于版本没什么介绍的,就是指定使用的版本;

Services

每个Service代表一个Container,与Docker一样,Container可以是从DockerHub中拉取到的镜像,也可以是本地Dockerfile Build的镜像。

image

标明image的ID,这个image ID可以是本地也可以是远程的,如果本地不存在,Docker Compose会尝试pull下来;

image: ubuntu
登入後複製

build

该参数指定Dockerfile文件的路径,Docker Compose会通过Dockerfile构建并生成镜像,然后使用该镜像;

build: #构建的地址 context: /usr/local/docker-compose-demo dockerfile: Dockerfile
登入後複製

ports

暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口,一般采用主机:容器的形式来映射端口;

#暴露端口 ports: - 8081:8080/tcp
登入後複製

expose

暴露端口,但不需要建立与宿主机的映射,只是会向链接的服务提供;

environment

加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行compose的机器上找到对应的值;

env_file

从一个文件中引入环境变量,该文件可以是一个单独的值或者一个列表,如果同时定义了environment,则environment中的环境变量会重写这些值;

depends_on

定义当前服务启动时,依赖的服务,当前服务会在依赖的服务启动后启动;

depends_on: - docker-compose-demo02 - docker-compose-demo01
登入後複製

deploy

该配置项在version 3里才引入,用于指定服务部署和运行时相关的参数;

replicas

指定副本数;

version: '3.4' services: worker: image: nginx:latest deploy: replicas: 6
登入後複製

restart_policy

指定重启策略;

version: "3.4" services: redis: image: redis:latest deploy: restart_policy: condition: on-failure #重启条件:on-failure, none, any delay: 5s # 等待多长时间尝试重启 max_attempts: 3 #尝试的次数 window: 120s # 在决定重启是否成功之前等待多长时间
登入後複製

update_config

定义更新服务的方式,常用于滚动更新;

version: '3.4' services: vote: image: docker-compose-demo depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 # 一次更新2个容器 delay: 10s # 开始下一组更新之前,等待的时间 failure_action:pause # 如果更新失败,执行的动作:continue, rollback, pause,默认为pause max_failure_ratio: 20 # 在更新过程中容忍的失败率 order: stop-first # 更新时的操作顺序,停止优先(stop-first,先停止旧容器,再启动新容器)还是开始优先(start-first,先启动新容器,再停止旧容器),默认为停止优先,从version 3.4才引入该配置项
登入後複製

resources

限制服务资源;

version: '3.4' services: redis: image: redis:alpine deploy: resources: #限制CPU的使用率为50%内存50M limits: cpus: '0.50' memory: 50M #始终保持25%的使用率内存20M reservations: cpus: '0.25' memory: 20M
登入後複製

healthcheck

执行健康检查;

healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # 用于健康检查的指令 interval: 1m30s # 间隔时间 timeout: 10s # 超时时间 retries: 3 # 重试次数 start_period: 40s # 启动多久后开始检查
登入後複製

restart

重启策略;

#默认的重启策略,在任何情况下都不会重启容器 restart: "no" #容器总是重新启动 restart: always #退出代码指示失败错误,则该策略会重新启动容器 restart: on-failure #重新启动容器,除非容器停止 restart: unless-stopped
登入後複製

networks

网络类型,可指定容器运行的网络类型;

#指定对应的网络 networks: - docker-compose-demo-net networks: docker-compose-demo-net: driver: bridge ipam: config: - subnet: 192.168.1.0/24 gateway: 192.168.1.1
登入後複製

ipv4_address, ipv6_address

加入网络时,为此服务指定容器的静态 IP 地址;

version: "3.9" services: app: image: nginx:alpine networks: app_net: ipv4_address: 172.16.238.10 ipv6_address: 2001:3984:3989::10 networks: app_net: ipam: driver: default config: - subnet: "172.16.238.0/24" - subnet: "2001:3984:3989::/64"
登入後複製

Networks

网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络。服务和服务之间,可以使用服务的名字进行通信,也可以自己创建网络,并将服务加入到这个网络之中,这样服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性。

Volumes

挂载主机路径或命名卷,指定为服务的子选项。可以将主机路径挂载为单个服务定义的一部分,无需在顶级volume中定义。如果想在多个服务中重用一个卷,则在顶级volumes key 中定义一个命名卷,将命名卷与服务一起使用。

推荐学习:《docker视频教程

以上是你必須了解的Docker Compose(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!