정보/프로그래밍

docker exec vs. run 도커 exec 와 run차이, conflict container name

아로구스 2021. 3. 4. 17:14

안녕하세요 뚱땡한 아로구스입니다.

docker exec와 docker run의 차이를 정리해봤습니다.

docker exec는 현재 구동 중인 컨테이터에 명령을 내리는 것이고,

docker run은 실행하면서 컨테이너를 구동하고 명령이 끝나면 exit하는 차이가 있습니다.


귀여운 도커 고래

아래 예시를 보면

docker exec example

docker exec -it {container_name} bash a.sh {options}

{container_name}은 docker ps 명령으로 조회 했을 때 이미 구동중인 컨테이너를 지정하는 것입니다.

docker run example

docker run --name {container_name} -i -t --rm {docker_image} bash a.sh {options}

위 명령에서 {container_name}은 지금 구동하면서 지정하는 컨테이너 이름이 됩니다.

컨테이너는 기본적으로 가지고 있는 lifetime이 있으므로 영구히 구동 될 수는 없습니다.

따라서 정기적으로 명령을 내려야 하는 것이라면 docker run을 이용해서 그 때 그 때 컨테이너 구동+명령 수행+exit해서 컨테이너를 내리는 것이 좋습니다.

--rm옵션은 명령이 종료되면 컨테이너를 내리는 옵션으로 이 옵션을 주지 않으면 docker ps했을 때 exited상태로 남아있게 되고 그 이후 동일한 container_name으로 구동하는 경우 아래와 같은 오류를 만나게 됩니다.

docker: Error response from daemon: Conflict.
The container name "/{container_name}" is already in use by container "72e42532XXXXXXXXXX".
You have to remove (or rename) that container to be able to reuse that name. 

만약 이 상황이라면 exited된 컨테이너를 아래 명령을 통해 지워주면 되는데요 

아래 명령을 통해 구동중이지 않지만 exited된 컨테이너를 확인 한 후에

docker ps -a

아래 명령을 통해 해당 컨테이너를 완전히 종료 해주면 됩니다. 그럼 다시 그 이름으로 지정해서 컨테이너를 구동할 수 있습니다.

docker rm {container_name}

간단한 내용이지만 저도 나중에 잊을 수 있으므로 정리 해둡니다.

관심 있는 분들께 도움이 되었길 바랍니다.

 

반응형