programing

도커 컴포지트를 사용하여 단일 컨테이너를 재시작하는 방법

topblog 2023. 10. 25. 21:59
반응형

도커 컴포지트를 사용하여 단일 컨테이너를 재시작하는 방법

는 는이 있습니다.docker-compose.yml4개의 컨테이너를 포함하는 파일:redis,postgres,api그리고.worker.

의 발전 과정에서.worker컨테이너, 변경사항을 적용하려면 종종 재시작해야 합니다.단일 컨테이너를 다시 시작할 수 있는 좋은 방법이 있습니까(예:worker다른 것들을 다시 시작하지 않고요?

매우 간단합니다.다음 명령을 사용합니다.

docker-compose restart worker

컨테이너를 죽이기 전에 정지 대기 시간을 설정할 수 있습니다(초 단위).

docker-compose restart -t 30 worker

이렇게 하면 컨테이너가 다시 시작되지만 재구축되지는 않습니다.변경 사항을 적용한 후 다시 시작하려면 다른 답변을 살펴봅니다.

단일 노드를 다시 시작하는 것에 대한 다른 대답은 대상에 있습니다.docker-compose restart worker 컨테이너를 이는 해당 컨테이너를 바운스할 것이지만 별도로 재구축했더라도 변경 사항은 포함되지 않습니다.수동으로 할 수 있습니다.stop,rm,create,그리고.start, 하지만 훨씬 더 쉬운 방법들이 있습니다.

코드를 업데이트한 경우 다음을 사용하여 한 번에 빌드 및 다시 로드할 수 있습니다.

docker-compose up --detach --build

이렇게 하면 먼저 변경된 코드에서 이미지를 다시 작성할 수 있습니다. 캐시가 재사용되기 때문에 변경 사항이 없으면 빠른 속도입니다.그리고는 변경된 컨테이너만 교체합니다.다운로드한 이미지가 오래된 경우 위 명령보다 먼저 다음을 수행할 수 있습니다.

docker-compose pull

변경된 이미지를 먼저 다운로드하려면(컨테이너는 다음과 같은 명령을 실행할 때까지 다시 시작되지 않습니다.up위). 를 할 필요가 없습니다초기 정지를 하는 것은 불필요합니다.

단일 서비스에 대해서만 이 작업을 수행하려면 다음과 같이 지정할 서비스와 함께 up 또는 pull 명령을 따릅니다.

docker-compose up --detach --build worker

첫 번째 옵션인 도커 파일은 코드의 자주 변경되는 부분을 끝 근처에 유지하도록 구성되어 있습니다.사실 요구 사항은 별도로 제출됩니다.pip install그 파일은 거의 바뀌지 않기 때문입니다.그리고 nginx와 rediscontainer가 최신이었기 때문에 다시 시작하지 않았습니다.전체 프로세스의 총 시간은 6초 미만이었습니다.

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

변경사항이 있는 서비스를 다시 시작하려면 다음 단계를 수행합니다.

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose up --no-start worker
docker-compose start worker

다음 명령어

docker-compose restart worker

컨테이너를 STOP하고 시작합니다. 즉, docker-compose.xml에서 변경 사항을 로드하지 않고.

STOP은 PC의 최대 절전 모드와 비슷합니다. 따라서 STOP/start는 구성 파일에서 변경된 내용을 찾지 않습니다.컨테이너의 레시피(docker-compose.xml)에서 다시 로드하려면 컨테이너를 제거하고 생성해야 합니다(PC 재부팅과 유사한 비유).

그래서 명령은 다음과 같습니다.

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

다른 답변 중에는 리빌드에 대한 정보도 포함되어 있고, 제 사용 사례에도 리빌드가 필요했기 때문에 (그에 비해) 더 나은 솔루션이 있었습니다.

단 하나의 싱글만을 쉽게 공략할 수 있는 방법은 여전히 존재합니다.worker단일 줄에서 재구축 + 재시작하는 컨테이너입니다. 실제로는 단일 명령이 아닙니다.저에게 가장 적합한 솔루션은 간단히 재구축하고 다시 시작하는 것이었습니다.

docker-compose build worker && docker-compose restart worker

이를 통해 두 가지 주요 목표를 동시에 달성할 수 있습니다.

  1. 싱글 대상worker컨테이너.
  2. 한 줄로 재구축 및 재시작

이것이 다른 사람들이 여기 오는 데 도움이 되길 바랍니다.

도커 합성 파일을 사용하여 서비스 다시 시작

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

사용 사례 #1: COMPUSE_FILE_NAME이 다음과 같은 경우docker-compose.yml그리고 서비스는 근로자입니다.

docker-compose restart worker

Use Case #2: 파일 이름이 다음인 경우sample.yml그리고 서비스는 근로자입니다.

docker-compose -f sample.yml restart worker

기본적으로 도커-컴포지트 룩은docker-compose.yml만약 우리가 실행한다면docker-compose명령어, 그렇지 않으면 우리는 특정 파일 이름을 지정할 플래그가 있습니다.-f [FILE_NAME].yml

여기에 답이 있습니다. 도커-컴포지트.yml 파일에 변경 사항이 반영된 것에 대해 이야기하고 있습니다.

하지만 제 코드에 제가 수행한 변경 사항을 포함시키려면 이미지를 재구축해야 가능하고 다음 명령을 수행해야 한다고 생각합니다.

1. 도커 컨테이너 스톱

docker stop container-id

2. 도커 용기 제거

docker rm container-id

3. 도커 이미지 제거

docker rmi image-id

4. 용기를 다시 정리합니다.

docker-compose up container-name

컨테이너 다시 시작

컨테이너를 다시 시작하려면 다음을(를)

docker-compose restart servicename

이 명령어를 "컨테이너 이름으로 다시 시작"이라고 생각하면 다음과 같습니다.docker restart지휘.

주의 사항:

  1. ENV 변수를 변경하면 컨테이너에서 업데이트되지 않습니다.그만하고 다시 시작해야 합니다.또는 단일 명령어 사용docker-compose up변경사항을 탐지하고 컨테이너를 다시 만듭니다.

  2. 다른 많은 사람들이 언급했듯이, 만약 당신이 변했다면.docker-compose.yml파일 자체를 다시 시작한다고 해서 변경 사항이 적용되지는 않습니다.

  3. 빌드 단계에서 컨테이너 내부에 코드를 복사하는 경우(in.DockerfileADD아니면COPYcommands), 코드가 변경될 때마다 용기를 다시 만들어야 합니다(docker-compose build).

코드와의 상관관계

docker-compose restart코드가 볼륨 지시에 의해 컨테이너에 매핑되는 경우 완벽하게 잘 작동해야 합니다.docker-compose.yml다음과 같습니다.

services:

  servicename:
    volumes:
      - .:/code

그러나 DEBUG 모드에서 선택한 프레임워크에서 제공하는 라이브 코드 재로드를 사용하는 것이 좋습니다(또는 선택한 언어로 자동 재로드 패키지를 검색할 수도 있음).이것을 추가하면 코드가 변경된 후에 매번 컨테이너를 다시 시작할 필요가 없어지고 대신 내부에서 프로세스를 다시 로드할 수 있습니다.

간단한 'docker' 명령은 'worker' 컨테이너에 대해 아무것도 모릅니다.명령어를 이렇게 사용합니다.

docker-compose -f docker-compose.yml restart worker

단일 서비스만 다시 시작하면서 Docker Composite 파일에 변경 사항을 적용하려면docker-compose휘로 합니다.up명령하고 서비스 이름을 지정합니다.예를 들어,

$ docker-compose up -d --no-deps myservice

이 명령은 에 대한 구성을 업데이트합니다.myservicecompose 파일의 다른 서비스를 터치하지 않고 서비스를 수행하고 재시작합니다.-d플래그는 백그라운드에서 서비스를 실행하고,--no-deps플래그는 Composite에 의 종속성을 시작하지 말라고 말합니다.myservice서비스.

또는 다음을 사용할 수 있습니다.restart단일 서비스를 재시작하는 명령:

$ docker-compose restart myservice

이것은 에 대한 최신 구성을 적용합니다.myservice서비스하고 다시 시작합니다.

이 명령어는 Composite 파일 자체에 변경 사항을 적용하지 않으며 현재 구성을 사용하여 서비스를 다시 시작합니다.

변경한 후에는 변경 내용을 서버로 가져온 다음 컨테이너를 다시 작성해야 합니다.따라서 설명서에서 알 수 있듯이 다음과 같습니다.

docker-compose pull worker && docker-compose up -d --no-deps worker

pull worker이 프로젝트만 서버로 끌어 올 것이고,--no-deps컨테이너를 다시 시작하는 것을 방지할 것입니다.worker컨테이너는 다음에 따라 달라집니다.

언급URL : https://stackoverflow.com/questions/31466428/how-to-restart-a-single-container-with-docker-compose

반응형