ホームページ >運用・保守 >Docker >Docker Compose について知っておくべきこと (概要の共有)

Docker Compose について知っておくべきこと (概要の共有)

WBOY
WBOY転載
2022-02-02 06:00:323109ブラウズ

この記事では、Docker Compose に関する関連知識を提供します。お役に立てば幸いです。

Docker Compose が必要な理由

Docker は、サービスのパッケージ化とインストールの問題を解決するのに役立ちます。サービスは次の問題を引き起こします。

  1. Dockerfile Build Image または DockerHub を使用してイメージを複数回プルします。

  2. 複数のコンテナを作成して書き込む必要があります。起動コマンドを複数回実行する;

  3. 相互に依存するコンテナを管理および調整する方法;

サービスの数が増加すると、上記 3 つの問題がさらに深刻になる可能性がありますが、これら 3 つの問題が解決されない場合、実際には、マシンの無駄を削減することを除いて、仮想マシンからコンテナ化への変更はこれ以上ないようです。 1 つの構成を通じてコン​​テナーをオーケストレーションして実行できるようにする Docker の良い方法はありますか? 現時点では、Docker Compose が登場しました。

Docker Compose では次のことができます:

  1. 複数の Docker コンテナ アプリケーションを定義して実行するためのツールを提供します;

  2. yaml を使用しますアプリケーション サービスを構成するためのファイル (docker-compse.yml);

  3. シンプルなコマンド docker-compse up を使用して、依存関係に従ってすべてのサービスを開始できます;

  4. 単純なコマンド docker-compose down;

  5. # サービスが必要な場合は、単に --scale Expansion を渡すだけで、すべてのサービスを停止できます。

Docker Compose には次の特徴があります。

  1. 移植性が高く、Docker Compose には docker-compse up が 1 つだけ必要です。依存関係に従ってすべてのサービスの開始を完了し、その後、 docker-compose down を使用すると、簡単に逆アセンブルできます。複雑なアプリケーションをより簡単にデプロイできるようサポートします。

  2. 単一ホスト上の複数の分離環境。Compose では、プロジェクト名を使用して環境を相互に分離できます。これは、単一のコンピューター上で実行できます。同じ環境のコピーを作成すると、異なるプロジェクトやサービスが相互に干渉するのを防ぐことができます。

Docker Compose の概要

  1. Docker Compose はa マルチコンテナ アプリケーションを定義および実行するためのツール;

  2. Docker Compose は、yml ファイルを通じてマルチコンテナ Docker アプリケーションを定義します。

  3. Docker Compose は使用しますyml ファイルの定義に基づいて複数のコンテナを作成または管理する 1 つのコマンド;

    Docker Compose について知っておくべきこと (概要の共有)

Docker Compose はDockerのマルチコンテナ制御に使用され、Dockerを自動化するために使用されるツールです。 Docker Compose を使用すると、複雑な Docker 操作をすべて 1 つのコマンドだけで自動化できます。

Docker Compose のインストール

Docker Compose インストールの最新バージョンは 1.29.2 です。Docker for Mac および Windows をインストールすると、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. #バイナリ ファイルに実行可能権限を適用します。
  3. sudo chmod +x /usr/local/bin/docker-compose

    #インストール後、docker-compose --version を使用してインストールが成功したかどうかを確認します。 command;
  4. Docker Compose について知っておくべきこと (概要の共有)

    Docker Compose バージョンの紹介
Docker Compose バージョン間の対応関係エンジンは次のとおりです。現在よく使用されている 2 つの主要な形式、バージョン 2 とバージョン 3 があることがわかります。これら 2 つのバージョンの違いについて説明します。

v3 バージョンは volume_from、extends、group_add およびその他の属性をサポートしていません。

  1. CPU およびメモリのプロパティの設定はデプロイに移動されました。

  2. v3 バージョンは Docker Swarm をサポートしていますが、v2 バージョンはサポートしていません;

  3. 注 : 公式は 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 を通じてバックエンドの 2 つの Java アプリケーションに転送します。

画像

  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的启动入口;

    <build>
        <plugins>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
                <configuration>
                    <!-- 指定该Main Class为全局的唯一入口 -->
                    <mainclass>cn.wheel.getway.WheelGetWay</mainclass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <!--可以把依赖的包都打包到生成的Jar包中-->
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。