✔️ 컨테이너 관리
✔️ 현재 실행 중인 컨테이너 목록 확인
docker ps
✔️ 모든 컨테이너 목록 확인
docker ps -a
vagrant@docker ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73a9eb476cc5 hello-world "/hello" 7 seconds ago Exited (0) 5 seconds ago adoring_bhabha
✔️ 컨테이너 실행
docker run <IMAGE>
docker run --name <IMAGE>
vagrant@docker ~ docker inspect hello-world -f '{{ .Config.Cmd }}'
[/hello]
vagrant@docker ~ docker run --name hello hello-world
컨테이너 생성시 이름을 지정할 수 있고, 컨테이너는 동일한 이름으로 다시 생성되지 않는다.
따라서 이미 hello라고 하는 이름의 컨테이너가 있으므로 생성이 안된다.
동일한 이름의 컨테이너는 생성 x
create 만 하고 나중에 start 할 때 사용해야 할 옵션들
- 옵션 없음 : Docker Daemon이 Docker Client에게 stdout/stderr를 전송한다.
--name
옵션 X
-it
: Attach 모드 (stdin/stdout/stderr를 연결해준다.) -> Foreground-i
: stdin 유지시킨다. (shell을 열어 표준 입력)-t
: Terminal을 할당한다.ctrl-p-q
docker attach
명령으로 연결 가능
-d
: Detach 모드(stdin/stdout/stderr 연결 해제) -> Background에서 실행한다는 의미이다.itd
컨테이너를 실행할 때는 이 세가지를 고려해야 한다.-i
-t
는 별개로 사용할 일이 없다.
어떤 서비스를 작동시킨다는 의미에서는 -d
를 자주 사용한다.
상황에 따라서 내가 어떤 shell과 상호작용해야 하는 건지 해당 되는 컨테이너를 실행해서 명령어를 실행해 뭔가를 확인하고자 하는 건지는 경험이 축적이 되어야 알 수 있다.
-d
를 많이 쓰고 나머지(-i
, -t
)는 확인 검증 디버깅 하는 용도로 많이 사용한다.
그렇다면 왜 hello-world 는 왜 bash 실행이 안될까 ?
hello-world 안에는 shell 이 없기 때문에 실행할 수 없다.
hello 라고 하는 애가 입력을 받을 수 있는 기능이 없다. 단순히 텍스트를 찍는 것 일뿐이다.
만약
docker run -d hello-world
이렇게 하면
-d
옵션 때문에 background에서 실행되기 때문에 표준 입력, 출력, 에러가 모두 실행은 됐지만 우리 눈에는 보이지 않는다.
기본적인 원칙은 하나의 컨테이너에는 하나의 어플리케이션만 실행하는 것이 원칙이다.
docker run -it ubuntu
ubuntu 이미지의 의미있는 실행 방법은 위와 같다.
shell 이 종료되면 (= app이 종료된다.) 컨테이너도 종료된다.
하지만 ctrl + p + q 를 누르면 여전히 실행 중인 상태로 빠져나올 수 있다.
여기서 다시 터미널로 접속하려면
docker attach [컨테이너 이름]
다시 stdin을 붙인다.
vagrant@docker ~ docker run -itd httpd
d7fa535b94f7e7f453f7077657aad3f7816b4070a7657302afe5a20cfbfbccde
컨테이너가 생성되면서 바로 백그라운드에서 실행된다.
docker run -itd httpd bash
해당 명령에서 httpd가 실행할 커맨드는 bash 이다.
해당 컨테이너는 bash를 실행하라고 했기 때문에 bash를 실행하고 있다.
더 이상 아파치 웹 서버로서의 기능을 하지 못한다.
아파치가 제대로 실행이 안되는 것 같을 때 직접 접속해서 확인, 디버깅, 조치를 취하고 싶은 상황에
즉 이미지 자체가 뭔가 문제가 있는지 검사하려고 할 때 이렇게 사용한다.
✔️ 실행 중인 컨테이너 지우기
vagrant@docker ~ docker rm `docker ps -aq`
vagrant@docker ~ docker rm -f `docker ps -aq`
✔️ watch 명령어
리눅스 명령어 중에 watch
라는 명령어가 있다.
watch 명령어 뒤에 우리가 실행할 명령어를 지정하게 되면, 기본 2초마다 한번씩 지정한 명령을 자동으로 실행한다.
표준 출력과 표준 오류를 출력하는 이미지를 실행했을 때는 2초마다 이를 화면에 출력한다.
watch docker ps -a # 실시간으로 확인할 때 사용하는 명령어
Every 2.0s: docker ps -a docker: Wed May 4 02:15:32 2022
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a96dee43b2e httpd "httpd-foreground" About a minute ago Exited (0) 9 seconds ago goofy_davinci
5f1155a27339 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago hello
1b4f666221d6 hello-world "--name hello" 6 minutes ago Created determined_dewdney
73a9eb476cc5 hello-world "/hello" 7 minutes ago Exited (0) 7 minutes ago adoring_bhabha
watch -n 1 docker ps -a
watch -n 1 -d docker ps -a
-n
: 시간을 조정한다.-d
: 내용이 달라지면 하이라이팅으로 표시 해준다.
docker ps -aq
-q
: quiet 옵션, 컨테이너의 id만 나온다.
vagrant@docker ~ docker ps -aq
a15006b2c378
8a96dee43b2e
5f1155a27339
1b4f666221d6
73a9eb476cc5
✔️ 컨테이너 재시작 정책
어플리케이션에 문제가 있어 종료가 되더라도 해당 컨테이너는 재시작 하지 않는 것이 원칙이다.
로컬에서 개발할 때 출근하고 랩탑을 켜고 매번 docker run 명령을 통해 자주 쓰는 container를 실행시켜줘야 한다.
이럴 때는 --restart 옵션을 주면 docker desktop을 실행시킬 때 마다 container를 항상 같이 띄울 수 있다.
혹은 서버에서 docker container가 죽는 경우 재시작을 할 수 있도록 설정할 수도 있다.
docker run --restart <no|always|on-failure|unless-stopped> <IMAGE>
자주 쓰는 옵션
always : 항상 재시작한다.
restart always을 걸고 의도적으로 종료시키지 않으면 항상 재시작을 한다.
docker run -d --restart always mysql:5.7
--restart : 컨테이너 내부의 프로세스 종료시 재시작 정책을 설정할 수 있다.
- no → 프로세스가 종료되더라도 컨테이너를 재시작하지 않는다.
- on-failure[:max-retries] → container가 정상적으로 종료되지 않은 경우(exit code가 0이 아님)에만 재시작 시킨다. max-retries도 함께 주면 재시작 최대 시도횟수를 지정할 수 있다.
- always → 프로세스의 exit code 와는 관계없이 재시작한다. 수동으로 종료한 경우, Docker가 재시작되면 같이 재시작한다.
- unless-stopped → container가 종료되지 않는다면 항상 재시작한다. 종료되었다면 직접 시작하기 전까지는 Docker가 재시작되도 컨테이너는 재시작되지 않는다.
✔️ 이미지 풀 정책
docker run --pull <missing|always|never> <IMAGE>
이미지를 컨테이너로 생성하기 전에 이미지를 어떻게 관리할 것인가 ?
missing
이미지가 로컬에 없을 때만 이미지를 받아온다.
always
이미지가 로컬에 있는 경우에도 항상 이미지를 가져오려고 시도한다. pull이 실패하면 오류를 생성한다.
지금은 레지스트리와 로컬의 이미지가 같으나
시간이 지난 이후에는 과거에 받은 latest와 현재 받은 로컬의 latest와 불일치가 발생할 수 있다.
pull always setting을 하지 않으면 기본 설정이 missing 이기 때문에 받지 않고 로컬의 이미지를 실행하게 된다.
항상 최신 버전을 사용하기를 원하면 always를 사용해 최신 버전을 가져와야 한다.
never
이미지를 가져오지 않는다. 하지만 이미지가 존재하지 않으면 오류를 생성한다.
Docker를 실행하는 모든 환경이 인터넷에 연결되어 있지는 않다.
missing, always는 레지스트리에 접속이 가능한 상태 즉, 인터넷에 연결되어 있어야 가능하다.
금융권이나 정부 기관의 서버들은 가장 edge의 장비가 아니고서는 인터넷에 연결되어 있지 않다.
따라서 never를 사용한다. 무조건 local 에 있는 것을 사용한다.
인터넷이 안되는 상황에서 컨테이너를 실행시키고 싶을 때는 never를 붙이지 않으면 실행되지 않는다.
✔️ 컨테이너의 프로세스 목록 확인
docker top <CONTAINER>
실행중인 컨테이너만 확인
중단되어 있는 컨테이너는 프로세스 목록을 볼 수 없다.
리눅스의 top 명령어처럼 실시간으로 계속 새로고침 되지는 않으나 현재 컨테이너에서 실행되는 프로세스의 목록을 볼 수 있다.
같은 기능을 하는 특정 프로세스가 여러개 뜨는 것은 상관없다. 이는 같은 어플리케이션인 것이다.
하나의 컨테이너를 실행한다고 프로세스 목록에 하나의 프로세스만이 떠야하는 것은 아니다.
실행 중인 프로세스가 여러개라고 해서 여러개의 app이 실행 중이라고 생각하면 안된다.
Windows의 작업 관리자를 보면 이해하기 쉬운데, 여러개의 Chrome 프로세스가 실행 중이지만 실제로는 하나의 Chrome app을 실행 중이다.
하나의 app 안에서 많은 작업을 동시에 하기 위해 여러개의 프로세스를 띄우는 것이다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker 컨테이너 관리 명령어 (3) (0) | 2022.05.07 |
---|---|
[Docker] Docker 컨테이너 관리 명령어 (2) (0) | 2022.05.07 |
[Docker] Docker 이미지 관리 명령어 (0) | 2022.05.07 |
[Docker] Docker LifeCycle과 자주 사용하는 옵션 (0) | 2022.05.07 |
[Docker] Docker(도커)의 기본 명령어 (0) | 2022.05.07 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!