[docker] docker-compose로 단일 컨테이너를 다시 시작하는 방법

docker-compose.ymlredis, postgres, api, worker라는 4 개의 컨테이너가 포함 된 파일이 있습니다

작업자를 개발하는 동안 변경 사항을 적용하기 위해 종종 작업자를 다시 시작해야합니다. 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

다음은 첫 번째 옵션의 간단한 예입니다. Dockerfile은 자주 변경되는 코드 부분을 끝 부분에 유지하도록 구성되어 있습니다. 실제로 pip install해당 파일은 거의 변경되지 않기 때문에 요구 사항이 별도로 가져옵니다 . nginx 및 redis 컨테이너는 최신 상태이므로 다시 시작되지 않았습니다. 전체 프로세스의 총 시간은 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 create worker
docker-compose start worker


답변

다음 명령

docker-compose restart worker

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

STOP은 PC에서 최대 절전 모드와 유사합니다. 따라서 중지 / 시작은 구성 파일에서 변경된 사항을 찾지 않습니다. 컨테이너 레시피 (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


답변

docker-compose 파일을 사용하여 서비스를 다시 시작하십시오.

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

사용 사례 # 1 : COMPOSE_FILE_NAME이 docker-compose.yml있고 service가 worker 인 경우

docker-compose restart worker

사용 사례 # 2 : 파일 이름 sample.yml이고 service가 worker 인 경우

docker-compose -f sample.yml restart worker

기본적으로 docker-compose는 명령 docker-compose.yml을 실행할 경우를 찾습니다 docker-compose. 그렇지 않으면 특정 파일 이름을 지정하는 플래그가 있습니다.-f [FILE_NAME].yml


답변

간단한 ‘docker’명령은 ‘worker’컨테이너에 대해 아무것도 모릅니다. 이와 같은 명령을 사용하십시오

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


답변

컨테이너 재시작

컨테이너를 다시 시작하려면 다음을 수행하십시오.

docker-compose restart servicename

이 명령을 “컨테이너를 이름으로 컨테이너를 다시 시작하십시오”라고 생각하면 이는 명령과 같습니다 docker restart.

주의 사항 :

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

  2. 다른 많은 사람들이 언급했듯이 docker-compose.yml파일 자체 를 변경 하면 간단한 다시 시작으로 변경 사항이 적용되지 않습니다.

  3. 빌드 단계에서 또는 명령어 를 Dockerfile사용하여 컨테이너 내부에 코드를 복사하는 경우 코드가 변경 될 때마다 컨테이너를 다시 빌드해야합니다 ( ).ADDCOPYdocker-compose build

코드와의 상관 관계

docker-compose restart다음 docker-compose.yml과 같이 볼륨 지시문으로 코드가 컨테이너에 경로 매핑되면 코드가 완벽하게 작동합니다 .

services:

  servicename:
    volumes:
      - .:/code

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