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


333

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

작업자를 개발하는 동안 변경 사항을 적용하기 위해 종종 작업자를 다시 시작해야합니다. worker다른 컨테이너를 다시 시작하지 않고 컨테이너를 다시 시작하는 좋은 방법이 있습니까?


2
고정 표시기-작성 -f 고정 표시기 - compose.yml 다시 시작 노동자
Jinna Balu

답변:


398

매우 간단합니다 : 다음 명령을 사용하십시오 :

docker-compose restart worker

컨테이너를 종료하기 전에 중지 대기 시간 (초)을 설정할 수 있습니다

docker-compose restart -t 30 worker

컨테이너를 다시 시작하지 않고 컨테이너를 다시 시작합니다. 변경 사항을 적용한 다음 다시 시작하려면 다른 답변을 살펴보십시오.


3
나를 위해 그것은 효과가 있었지만 여기서 허용되는 경우 일반적인 질문 : '다시 시작'이 연결된 컨테이너를 처리하고 / etc / hosts를 업데이트합니까? 아니면 '다시 시작'으로 IP가 전혀 변경되지 않습니까?
michabbb

컨테이너는 이름으로 연결되며 일반적으로 걱정해야 할 유일한 IP는 외부 도커 호스트 IP (일반적으로 192.168.99.100)입니다. 예를 들어, 다른 컨테이너가 연결된 데이터베이스 컨테이너를 다시 시작하면 문제가 발생할 수 있습니다. 종속 컨테이너는 다시 연결하기에 충분히 탄력적이어야합니다.
Ryan Kimber

20
OP는 "변경 사항을 적용하려면 다시 시작해야합니다"라고 말합니다. 문서에 따르면 docker-compose restart명령은 변경 사항을 적용하지 않습니다. " docker-compose.yml구성 을 변경하면 이 명령을 실행 한 후에 이러한 변경 사항이 반영되지 않습니다." 따라서를 사용하십시오 docker-compose up -d --build. docs.docker.com/compose/reference/restart
featherbelly

5
nb, worker 는 yaml 파일에서 서비스에 지정된 이름이며 실행할 때 표시되는 이름이 아닙니다.docker ps -a
worc

2
이 다른 대답은 훨씬 더 stackoverflow.com/a/39501539/292408 로, restart이미를 실행하는 경우에도 변경 사항을 적용하지 않는 docker-compose build <container name>이 비 작업 / 오답이다.
Elijah Lynn

170

단일 노드를 다시 시작하는 다른 답변은 대상에 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

이것은 흥미롭지 만 -no-cache옵션 과 함께 사용할 수 있습니까? 내가 무언가를 추가하고 package.json다시 변경 해야 한다고 말 RUN npm install했지만 Dockerfile자체는 바뀌지 않았습니다.
Augustin Riedinger

2
@augustinriedinger 입력 파일이 변경되고 COPY명령에이를 포함 시키면 캐시가 자동으로 중단됩니다.
BMitch

1
@augustinriedinger 감사합니다. 모바일로 연결되어있는 질문을 볼 수 없습니다. 질문의 단계에서 이미 COPYDockerfile에 명령이 있어야합니다. 는 git pullpackage.json 파일을 업데이트하고 고정 표시기가 다른 파일에 복사 볼 때 빌드 캐시가 중단됩니다.
BMitch

1
이 행동에 대해 몰랐습니다! 나는 ADD대신 사용하고 COPY있었지만 후자는 모범 사례 이므로 분명히 갈 것입니다!
Augustin Riedinger

1
@augustinriedinger ADDCOPY캐시 버스트 와 동일한 결과를 얻지 만 (모범 사례 링크에서 제안한 것처럼) 대부분 추가 ​​기능이 필요하지 않으므로 언급하지 않아도됩니다.
BMitch

28

변경 사항으로 서비스를 다시 시작하려면 다음 단계를 수행하십시오.

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

10
빌드에 적용하기 위해 변경이 필요한 경우 쉽게 수행 할 수 있으며 docker-compose up -d --build모든 것을 다시 빌드하고 변경된 컨테이너를 다시 시작합니다. 가동 중지 시간과 함께 별도의 작성 및 시작 명령을 사용하여 중지 할 필요가 없습니다.
BMitch

4
예, 모든 서비스를 다시 시작하고 싶지만 OP는 단일 서비스 만 다시 시작하고 다른 서비스는 다시 시작하지 않으려는 경우
Jeff

3
이 예에서 내가 게시 한 답변을 참조하십시오. up변경 된 컨테이너 만 다시 작성되어 다시 시작해야합니다.
BMitch

18

다음 명령

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

+1, 많은 감사합니다! 들어 rm줄 옵션을 -f편리하게 (아무 프롬프트)와 전류 고정 표시기를 제공 create하고 start병합으로 up(그래서 총에 우리는 3 명령하지 4가)와 대한 up옵션 -d(실행이 배경에) 유용합니다.
astrowalker

10

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


7

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

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


4
작동하지 않음-coker-compose.yml에 대한 새로운 변경 사항이 재시작시 적용되지 않았습니다.
jlee

3

컨테이너 재시작

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

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


1

여기에 대한 답변은 docker-compose.yml 파일의 변경 사항을 반영하는 것입니다.

그러나 코드에서 수행 한 변경 사항을 통합하려면 이미지를 다시 작성해야만 가능하며 다음 명령으로 수행 할 수 있다고 생각합니다.

1. 도커 컨테이너 스톱

docker stop container-id

2. 도커 컨테이너 제거

docker rm container-id

3. 도커 이미지 제거

docker rmi image-id

4. 용기를 다시 작성하십시오

docker-compose up container-name
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.