[docker] docker-compose로 단일 컨테이너를 다시 시작하는 방법
docker-compose.yml
redis, 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
.
주의 사항 :
-
ENV 변수를 변경하면 컨테이너에서 업데이트되지 않습니다. 중지하고 다시 시작해야합니다. 또는 단일 명령
docker-compose up
을 사용 하면 변경 사항을 감지하고 컨테이너를 다시 만듭니다. -
다른 많은 사람들이 언급했듯이
docker-compose.yml
파일 자체 를 변경 하면 간단한 다시 시작으로 변경 사항이 적용되지 않습니다. -
빌드 단계에서 또는 명령어 를
Dockerfile
사용하여 컨테이너 내부에 코드를 복사하는 경우 코드가 변경 될 때마다 컨테이너를 다시 빌드해야합니다 ( ).ADD
COPY
docker-compose build
코드와의 상관 관계
docker-compose restart
다음 docker-compose.yml
과 같이 볼륨 지시문으로 코드가 컨테이너에 경로 매핑되면 코드가 완벽하게 작동합니다 .
services:
servicename:
volumes:
- .:/code
그러나 DEBUG 모드에서 선택한 프레임 워크에서 제공하는 라이브 코드 리로딩을 사용하는 것이 좋습니다 (또는 선택한 언어로 자동 재로드 패키지를 검색 할 수 있음). 이것을 추가하면 코드가 변경된 후 매번 컨테이너를 다시 시작할 필요가 없으며 대신 프로세스를 다시로드해야합니다.