programing

도커 구성 버전 3에서 메모리 및 CPU 제한을 지정하는 방법

lastcode 2023. 10. 19. 22:20
반응형

도커 구성 버전 3에서 메모리 및 CPU 제한을 지정하는 방법

버전 3에서 지정한 서비스의 CPU 및 메모리 제한을 지정할 수 없습니다.

버전 2에서는 잘 작동합니다.mem_limit&cpu_shares서비스의 매개변수를 지정합니다.그러나 버전 3을 사용하는 동안 실패하여 아래에 놓이게 됩니다.deploy제가 스웜 모드를 사용하지 않는 한 섹션은 가치가 없어 보입니다.

누가 도와줄 수 있습니까?

    version: "3"
    services:
      node:
        build:
         context: .
          dockerfile: ./docker-build/Dockerfile.node
        restart: always
        environment:
          - VIRTUAL_HOST=localhost
        volumes:
          - logs:/app/out/
        expose:
          - 8083
        command: ["npm","start"]
        cap_drop:
          - NET_ADMIN
          - SYS_ADMIN

주제가 좀 오래되고 진부한 것 같지만 어쨌든 다음 옵션을 사용할 수 있었습니다.

deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M

3.7 버전의 도커를 사용할 경우-

제 경우에 도움이 된 것은 다음 명령어를 사용한 것입니다.

docker-compose --compatibility up

--compatibilityflag는 (문서의 taken)의 약자입니다.

설정된 경우 Composite는 v3 파일의 배포 키를 해당하는 비 Swarm으로 변환하려고 시도합니다.

내 도커 작성 파일을 v2로 되돌릴 필요가 없다는 것은 정말 좋은 일이라고 생각합니다.

deploy:
  resources:
    limits:
      cpus: '0.001'
      memory: 50M
    reservations:
      cpus: '0.0001'
      memory: 20M

자세한 내용: https://docs.docker.com/compose/compose-file/compose-file-v3/ #

구체적인 경우:

version: "3"
services:
  node:
    image: USER/Your-Pre-Built-Image
    environment:
      - VIRTUAL_HOST=localhost
    volumes:
      - logs:/app/out/
    command: ["npm","start"]
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
    deploy:
      resources:
        limits:
          cpus: '0.001'
          memory: 50M
        reservations:
          cpus: '0.0001'
          memory: 20M

volumes:
  - logs

networks:
  default:
    driver: overlay

참고:

  • 노출은 필요하지 않으며 스택 네트워크의 기본값별로 노출됩니다.
  • 이미지는 미리 만들어져야 합니다.v3 내에서는 빌드할 수 없습니다.
  • "Restart"도 더 이상 사용되지 않습니다.배포 시 다시 시작을 장애 발생 시 작업과 함께 사용할 수 있습니다.
  • 독립 실행형 하나의 노드 "swarm"을 사용할 수 있습니다. v3의 대부분의 개선 사항(모두는 아닐 경우)은 swarm을 위한 것입니다.

참고 사항:스웜 모드의 네트워크가 브리지되지 않습니다.내부에서만 연결하려면 네트워크에 연결해야 합니다.1) 다른 작성 파일 내에 외부 네트워크를 지정하거나 --attachable 매개 변수(docker network create -d overlay My-Network --attachable)로 네트워크를 작성해야 합니다.그렇지 않으면 다음과 같이 포트를 게시해야 합니다.

ports:
  - 80:80

Docker Composition v1은 다음을 지원하지 않습니다.deploy키. 도커 스택에서 버전 3 YAML 파일을 사용할 때만 존중됩니다.

이 메시지는 추가할 때 인쇄됩니다.deploy키 투 유docker-compose.yml파일을 저장하고 실행합니다.docker-compose up -d

경고: 일부 서비스(데이터베이스)에서는 'deploy' 키를 사용하지만 이 키는 무시됩니다.구성이 '배포' 구성을 지원하지 않음 - 사용docker stack deploy무리에게 배치할 겁니다

문서(https://docs.docker.com/compose/compose-file/ # deploy)에는 다음과 같이 나와 있습니다.

서비스 배포 및 실행과 관련된 구성을 지정합니다.이는 도커 스택 배포가 있는 스웜에 배포할 때만 적용되며, 도커-컴포지션 및 도커-컴포지션 실행에서는 무시됩니다.

그럼에도 불구하고 Docker Composition v2를 사용할 수 있습니다.다음 도커 구성이 주어지면 다음을 사용할 수 있습니다.deploy컨테이너 리소스를 제한하는 키입니다.

version: "3.9"
services:
  database:
    image: mariadb:10.10.2-jammy
    container_name: mydb
    environment:
      MYSQL_ROOT_PASSWORD: root_secret
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: secret
      TZ: "Europe/Zurich"
      MARIADB_AUTO_UPGRADE: "true"
    tmpfs:
      - /var/lib/mysql:rw
    ports:
      - "127.0.0.1:3306:3306"
    deploy:
      resources:
        limits:
          cpus: "4.0"
          memory: 200M
    networks:
      - mynetwork

는.docker compose up -d(참고: Docker Composition 버전 2에서는 도커를 이진법이라고 부르지 않습니다.docker-composepython application)을 사용한 다음 메모리가 200MB로 제한되어 있는 리소스를 검사합니다.CPU 제한이 다음에 의해 노출되지 않습니다.docker stats.

❯ docker stats --no-stream
CONTAINER ID   NAME   CPU %     MEM USAGE / LIMIT   MEM %     NET I/O           BLOCK I/O         PIDS
2c71fb8de607   mydb   0.04%     198MiB / 200MiB     99.02%    2.67MB / 3.77MB   70.6MB / 156MB    18

버전 >=으로 가능합니다.3.8. 다음은 도커- compose >= 를 사용한 예입니다.1.28.x:

version: '3.9'

services:
  app:
    image: nginx
    cpus: "0.5"
    mem_reservation: "10M"
    mem_limit: "250M"

작동 중이라는 증명(MEM USAESS 참조) 열:

Memory limit set with version 3.9

메모리 제한에 도달할 때 예상되는 동작은 컨테이너가 소멸되는 것입니다.이 경우 설정 여부restart: always또는 앱 코드를 조정합니다.

이제 Docker Composes v3의 제한 및 재시작 설정은 다음을 사용하여 설정해야 합니다.restart: always또한 사용되지 않음):

deploy:
  restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 3
    window: 120s
  resources:
    limits:
      cpus: '0.50'
      memory: 50M
    reservations:
      cpus: '0.25'
      memory: 20M

사용하는 것에 대해 혼란이 있는 것 같습니다.docker-compose그리고.docker compose(공백 포함).구성 플러그인이 없는 경우 https://docs.docker.com/compose/install 을 사용하여 구성 플러그인을 설치할 수 있습니다.

여기 Elasticsearch를 실행하는 composite 파일의 예시가 있습니다.

 version: "3.7"
 services: 
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    restart: always
    ports:
      - "9222:9200"
    deploy:
      resources:
        limits:
          cpus: "4"
          memory: "2g"
    environment:
      - "node.name=elasticsearch"
      - "bootstrap.memory_lock=true"
      - "discovery.type=single-node"
      - "xpack.security.enabled=false"
      - "ingest.geoip.downloader.enabled=false"

라는 디렉토리에 있습니다.estest그 파일은 호명됩니다.es-compose.yaml 파일은 CPU 및 메모리 제한을 설정합니다.

를 사용하여 시작하는 경우docker-compose를 들면예

docker-compose -f es-compose.yaml up

그럼 봐봐요.docker stats보다시피

CONTAINER ID   NAME                     CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
e3b6253ee730   estest_elasticsearch_1   342.13%   32.39GiB / 62.49GiB   51.83%    7.7kB / 0B        27.3MB / 381kB   46

따라서 CPU 및 메모리 리소스 제한은 무시됩니다.실행 중에 경고가 표시됩니다.

WARNING: Some services (elasticsearch) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.

이것이 사람들이 도커 스택/스웜을 보게 만드는 이유라고 생각합니다.그러나 최신 버전을 사용하는 것으로 전환하는 경우docker compose이제 도커 CLI https://docs.docker.com/engine/reference/commandline/compose/ 에 내장되어 있습니다.

docker compose -f es-compose.yaml up

그리고 다시 한번 봐봐요.docker stats보다시피

CONTAINER ID   NAME                     CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
d062eda10ffe   estest-elasticsearch-1   0.41%     1.383GiB / 2GiB       69.17%    8.6kB / 0B        369MB / 44MB     6

따라서 제한이 적용되었습니다.

이것은 여전히 컴포지트 프로젝트의 일부로 컨테이너를 만들 수 있고 파일을 통해 환경을 쉽게 전달할 수 있기 때문에 스웜보다 더 낫다고 생각합니다.제거하는 것을 추천합니다.docker-compose그리고 새로운 것을 사용하기 위해 전환하는 것.docker compose될 수 있는 대로

다른 경험이 있어요 누군가 설명해줄 수 있을 거예요

이것은 버그일지도 모르지만(나는 이것이 특징이라고 생각한다), 나는 배치 제한(메모리 제한)을 스웜 없이 도커 컴포지트에 사용할 수 있습니다. 그러나 CPU 제한이 작동하지 않음 복제는 가능합니다.

$> docker-compose --version
docker-compose version 1.29.2
$> docker  --version
Docker version 20.10.12
version: '3.2'

services:
  limits-test:
    image: alexeiled/stress-ng
    command: [
     '--vm', '1', '--vm-bytes', '20%', '--vm-method', 'all', '--verify', '-t', ' 10m', '-v'

    ]
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 1024M

도커 통계

b647e0dad247   dc-limits_limits-test_1   0.01%     547.1MiB / 1GiB     53.43%    942B / 0B   0B / 0B     3

편집됨, thx @Jimmix

언급URL : https://stackoverflow.com/questions/42345235/how-to-specify-memory-cpu-limit-in-docker-compose-version-3

반응형