도커 컨테이너는 도커 이미지를 바탕으로 만든다.
따라서 도커 이미지를 다루는 방법에 익숙해져야 하므로 해당 게시글 최하단에 관련 링크를 걸어뒀으니 참고하면 된다 😋
도커 컨테이너는 가상환경으로 파일 시스템과 애플리케이션이 함께 담겨져 있는 박스라고 생각하면 된다.
이를 알려면 도커 컨테이너의 생애주기를 이해하면 된다.
도커 컨테이너의 생애 주기
실행 중 상태
docker container run 명령어로 도커 이미지를 기반으로 컨테이너가 생성되면 이 이미지를 생성했던 Dockerfile에 의해 애플리케이션이 실행된다. 그러면 이 애플리케이션이 실행 중인 상태가 컨테이너의 실행 중 상태가 된다.
HTTP 요청을 받는 서버 애플리케이션이면, 오류로 인해 종료되지 않는 한 실행 중 상태가 지속되므로 실행 기간이 길다.
실행이 끝나면 정지 상태가 된다.
정지 상태
실행된 애플리케이션이 정상/오류 여부를 막론하고 종료된 경우에는 컨테이너가 자동으로 정지 상태가 된다.
컨테이너를 정지시키면 가상 환경으로서는 더 이상 동작하지 않지만, 디스크에 컨테이너가 종료된 시점의 상태가 저장돼 남는다.
그러므로 정지시킨 컨테이너를 다시 실행할 수 있다.
파기 상태
정지 상태의 컨테이너는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아있다. 컨테이너 실행 및 정지를 반복하다보면 디스크 용량을 점점 많이 차지하게 된다.
단, 한 번 파기한 컨테이너는 다시는 실행할 수 없다는 점에 유의하기 바란다.
같은 이미지로 새로운 컨테이너를 생성했다고 해도 완전히 같은 컨테이너를 새로 생성할 수는 없다.
도커 컨테이너의 명령어
⌗ 컨테이너 생성 및 실행
% docker container run [옵션] [이미지명:[태그]] [명령] [명령인자...]
% docker container run [옵션] [이미지ID] [명령] [명령인자...]
도커 컨테이너를 백그라운드에서 실행하려면 다음과 같이 하면 된다.
[option]
- -d : 백그라운드에서 실행
- -p : 호스트쪽 포트를 컨테이너쪽 포트로 포워딩
- --rm : 생성한 컨테이너가 실행이 끝나면 자동으로 파기
★ 명령행 도구가 담긴 컨테이너를 사용시 유용 - --name : 컨테이너의 이름 설정
★ 이름이 충돌하면 오류 발생 → 자주 생성하고 정지한다면 --rm 옵션을 같이 사용하는 것이 유용
[command]
% docker container run -d -p 9000:8080 example/echo:latest
5f0aaba90b06c65ed1e04d5f022ea864716966e8f3c932756c33700e4be8222d
% docker container run -i --rm /jq:1.5 '.version'
⌗ 도커 컨테이너 목록 보기
% docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 3 hours ago Up 3 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
a0226db4bfeb example/echo:latest "go run /echo/main.go" 3 hours ago Up 3 hours 0.0.0.0:9000->8080/tcp zealous_benz
현재 실행 중인 컨테이너 목록이 출력되로, 목록에 표시되는 칼럼 항목의 의미는 다음과 같다.
항목 | 내용 |
CONTAINER ID | 컨테이너를 식별하기 위한 유일 식별자 |
IMAGE | 컨테이너를 만드는 데 사용된 도커 이미지 |
COMMAND | 컨테이너에서 실행되는 애플리케이션 프로세스 |
CREATED | 컨테이너 생성 후 경과된 시간 |
STATUS | Up(실행중), Exited(종료) 등 컨테이너의 실행 상태 |
PORTS | 호스트 포트와 컨테이너 포트의 연결 관계 (포트 포워딩) |
NAMES | 컨테이너의 이름 |
[option]
- -q : 컨테이너 ID(축약형)만 추출
- --filter "필터명=값" : 특정 조건을 만족하는 컨테이너 목록
컨테이너 생성한 이미지를 기준으로 하려면 ancestor 필터를 사용 - -a : 종료된 컨테이너 목록
종료된 커네티너가 실행되던 시점의 표준 출력 내용을 확인하거나, 컨테이너를 재시작하려는 경우 사용
[command]
% docker container ls -q
848f6e416f58
a0226db4bfeb
% docker container ls --filter "name=benz"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:9000->8080/tcp zealous_benz
% docker container ls --filter "ancestor=example/echo"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 3 hours ago Up 3 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:9000->8080/tcp zealous_benz
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:9000->8080/tcp zealous_benz
5f0aaba90b06 example/echo:latest "go run /echo/main.go" 32 hours ago Exited (2) 4 hours ago heuristic_maxwell
03af2722b102 example/echo:latest "go run /echo/main.go" 33 hours ago Exited (2) 32 hours ago hardcore_agnesi
⌗ 도커 컨테이너 정지
% docker container stop [컨테이너 ID 또는 컨테이너명]
% docker container stop stop zealous_benz
zealous_benz
Error response from daemon: No such container: stop
% docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
⌗ 도커 컨테이너 재시작
파기하지 않은 정지 상태 컨테이너는 재시작 할 수 있다.
% docker container restart [컨테이너 ID 또는 컨테이너명]
% docker container restart zealous_benz
zealous_benz
% docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 3 seconds 0.0.0.0:9000->8080/tcp zealous_benz
⌗ 도커 컨테이너 파기
정지시킨 컨테이너를 완전히 파기하려면 아래의 명령어를 사용한다.
% docker container rm [컨테이너ID 또는 컨테이너명]
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 3 minutes 0.0.0.0:9000->8080/tcp zealous_benz
5f0aaba90b06 example/echo:latest "go run /echo/main.go" 33 hours ago Exited (2) 4 hours ago heuristic_maxwell
03af2722b102 example/echo:latest "go run /echo/main.go" 33 hours ago Exited (2) 33 hours ago hardcore_agnesi
% docker container rm 03af2722b102
03af2722b102
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 3 minutes 0.0.0.0:9000->8080/tcp zealous_benz
5f0aaba90b06 example/echo:latest "go run /echo/main.go" 33 hours ago Exited (2) 4 hours ago heuristic_maxwell
[option]
- -f : 실행중인 컨테이너를 강제 삭제
[command]
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
848f6e416f58 example/echo:latest "go run /echo/main.go" 4 hours ago Up 4 hours 0.0.0.0:32768->8080/tcp inspiring_kepler
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 3 minutes 0.0.0.0:9000->8080/tcp zealous_benz
5f0aaba90b06 example/echo:latest "go run /echo/main.go" 33 hours ago Exited (2) 4 hours ago heuristic_maxwell
% docker container rm -f 848f6e416f58
848f6e416f58
% docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0226db4bfeb example/echo:latest "go run /echo/main.go" 4 hours ago Up 5 minutes 0.0.0.0:9000->8080/tcp zealous_benz
5f0aaba90b06 example/echo:latest "go run /echo/main.go" 33 hours ago Exited (2) 4 hours ago heuristic_maxwell
⌗ 도커 컨테이너 표준 출력 연결
현재 실행중인 특정 도커 컨테이너의 표준 출력 내용을 확인할 수 있다.
실행 중인 컨테이너의 로그를 수집해 웹 브라우저나 명령행 도구로 열람하게 해주는 기능을 사용하지 않는 환경에서는 디버깅 용도로 유용하다. 로그를 종료하려면 [Ctrl + C]를 누르면 종료한다.
% docker container logs [옵션] [컨테이너 ID 또는 컨테이너명]
[option]
- -f : 새로 출력되는 표준 출력 내용을 보여줌
[command]
% docker container logs -f a0226db4bfeb
2020/07/13 11:44:52 start server
2020/07/13 11:45:41 received request
2020/07/13 15:26:01 start server
⌗ 실행 중인 컨테이너에서 명령 실행
이 명령어를 사용하면 컨테이너 내부 상태를 확인하거나, 디버깅 하는 용도로 사용한다.
★ 컨테이너 안에 든 파일을 수정한다는 것은 애플리케이션에 의도하지 않은 부작용을 초래하므로 절대 운영에서는 변경 금지 !
% docker container exec [옵션] [컨테이너 ID 또는 컨테이너명] [컨테이너에서 실행할 명령]
[option]
- -i : 표준 입력 연결을 유지
- -t : 유사 터미널을 할당
- -it : 컨테이너 안에서 실행할 셸(sh 나 bash)을 실행하는 것처럼 조작
[command]
% docker container exec zealous_benz pwd
/go
% docker container exec -it zealous_benz sh
# pwd
/go
⌗ 도커 컨테이너 파일 복사
컨테이너 끼리 혹은 컨테이너와 호스트 간에 파일을 복사하기 위한 명령어이다.
대부분 디버깅 중 컨테이너 안에서 생서된 파일을 호스트로 옮겨 확인할 목적으로 사용한다.
또한 정지 상태의 컨테이너에 대해서도 실행할 수 있다.
% docker container cp [옵션] [컨테이너 ID 또는 컨테이너명:원본파일] [대상파일]
% docker container cp [옵션] [호스트 원본파일] [컨테이너 ID 또는 컨테이너명:대상파일]
'Java > Deploy' 카테고리의 다른 글
[Docker] 젠킨스 SSH 키 생성 및 master-slave 컨테이너 설정 (0) | 2020.07.17 |
---|---|
[Docker] 도커 컴포즈로 여러 컨테이너 실행 및 젠킨스 연동 (0) | 2020.07.14 |
[Docker] 도커 운영 및 관리를 위한 명령어 (0) | 2020.07.14 |
[Docker] 도커 이미지 사용을 위한 명령어 (0) | 2020.07.13 |
[Docker] 도커 포트포워딩 (0) | 2020.07.12 |
[Docker] 도커 이미지 / 컨테이너 다루기 (0) | 2020.07.12 |