이 기사는 Docker Compose에 대한 관련 지식을 제공하므로 도움이 되기를 바랍니다.
Docker는 서비스 패키징 및 설치 문제를 해결하는 데 도움이 됩니다. 이에 따른 문제는 너무 많은 서비스가 다음과 같은 문제를 가져온다는 것입니다.
Dockerfile 빌드 이미지 사용 또는 DockerHub 여러 번 이미지 가져오기
여러 컨테이너를 만들고 시작 명령을 여러 번 작성해야 합니다.
상호 의존적인 컨테이너를 관리하고 조정하는 방법
서비스 수가 증가하면 위의 세 가지가 필요합니다. 질문 이 세 가지 문제가 해결되지 않으면 실제로는 머신의 낭비를 줄이는 것 외에는 가상 머신에서 컨테이너화로 더 이상 변화가 없을 것 같습니다. Docker에 하나의 구성을 통해 컨테이너를 조정하고 실행할 수 있는 좋은 방법이 있습니까? 이때 Docker Compose가 등장했습니다.
Docker Compose는 다음을 수행할 수 있습니다.
여러 Docker 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구 제공
yaml 파일을 사용하여 애플리케이션 서비스 구성(docker-compse.yml)
시작할 수 있습니다. 간단한 명령 docker-compse up으로 종속성에 따른 모든 서비스
간단한 명령 docker-compose down으로 모든 서비스를 중지할 수 있습니다.
서비스가 필요할 때 간단히 확장할 수 있습니다. --scale;
Docker Compose에는 다음과 같은 기능이 있습니다.
더 높은 이식성, Docker Compose는 종속성에 따라 모든 서비스를 시작하기 위해 하나의 docker-compse up만 필요하며, 그런 다음 docker-compose down을 사용하여 쉽게 분해합니다. .
복잡한 애플리케이션을 더 쉽게 배포할 수 있도록 도와주세요.
Docker Compose 소개
Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구입니다.
Docker Compose는 yml 파일을 통해 정의됩니다. docker 애플리케이션;
Docker Compose에 대해 꼭 알아야 할 사항(요약 공유)
Docker Compose는 Docker의 다중 컨테이너 제어에 사용됩니다. Docker를 자동화하는 데 사용되는 도구입니다. Docker Compose를 사용하면 단 하나의 명령으로 모든 복잡한 Docker 작업을 자동화할 수 있습니다.
Docker Compose 설치
구체적인 단계는 다음과 같습니다.
현재 가장 안정적인 최신 버전인 Docker Compose 바이너리 파일을 다운로드하세요. 이전 버전을 다운로드하려면 버전 번호를 변경하세요.
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
바이너리 파일에 실행 권한 적용
sudo chmod +x /usr/local/bin/docker-compose
Docker Compose 버전 소개
cpu 및 메모리 속성 설정이 배포되도록 이동되었습니다.
v3 버전은 Docker Swarm을 지원하지만 v2 버전은 지원되지 않습니다.
참고: 공식은 1.20에 새로운 --compatibility 플래그를 도입했습니다. 0은 개발자가 v3으로 쉽게 전환할 수 있도록 지원합니다. 아직 몇 가지 문제가 있으며 공식적으로는 모두가 v3 버전을 직접 시작하는 것을 권장하지 않습니다.
Docker Compose에 대해 꼭 알아야 할 사항(요약 공유)
Docker Compose 명령어는 기본적으로 Docker와 유사하며 주로 Docker Compose 수명 주기 제어, 로그 형식 및 기타 관련 명령어를 사용할 수 있습니다. 작성 --도움말을 도와주세요.
#构建建启动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
다음과 같이 애플리케이션을 빌드하고 Nginx를 통해 백엔드에 있는 두 개의 Java 애플리케이션에 전달합니다.
Docker Compose에 대해 꼭 알아야 할 사항(요약 공유)
新建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"; } }
指定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>
打包Spring Boot应用;
mvn package
上传文件到Linux服务器/usr/local/docker-compose-demo的目录;
在/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"]
编辑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: {}
编写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; }
查看/usr/local/docker-compose-demo目录,有以下确保有以下四个文件;
Docker Compose에 대해 꼭 알아야 할 사항(요약 공유)
检查docker-compose.yml的语法是否正确,如果不发生报错,说明语法没有发生错误;
docker-compose config
启动docker-compose.yml定义的服务;
docker-compose up
Docker Compose에 대해 꼭 알아야 할 사항(요약 공유)
验证服务是否正确;
#查看宿主机ip ip add #访问对应的服务 curl http://172.21.122.231/hello
Docker Compose에 대해 꼭 알아야 할 사항(요약 공유)
Docker Compose에 대해 꼭 알아야 할 사항(요약 공유)
版本
对于版本没什么介绍的,就是指定使用的版本;
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!