*해당 포스팅은 다음과 같은 환경에서 진행하였으니, 참고 바랍니다.
- Docker Community Edition
- Ubunto Linux 22.04 (OS에 따라 설치 방법은 다소 상이하나, 사용법은 동일함)
- VMware Workstation pro ( x86_64, CPU x 2, RAM 2GB, HDD 120GB)
1. 도커 컨테이너 라이프사이클(Lifecycle)
도커 컨테이너를 관리하다 보면, 컨테이너의 상태를 확인해야 하는 경우가 종종 생긴다. 이때 도커 컨테이너의 상태에 맞게 효과적으로 관리하기 위해서는 컨테이너의 라이프사이클을 아는 게 유리하고, 컨테이너의 라이프사이클은 직접적으로 컨테이너 관리 명령어와 연관돼 있기 때문에 간단하게 컨테이너 라이프사이클의 상태전이도를 보고 넘어가자.
도커 컨테이너의 라이프사이클 : 컨테이너의 생성(created)부터 삭제(remove)까지의 과정
2. 도커 컨테이너 일반 관리 명령어
1) create : 컨테이너 생성
#기본 형식#
docker container create [옵션] [저장소이름/]이미지이름[:태그]
#예시#
docker container create --name=MyWeb httpd:latest
#옵션#
--name : 컨테이너이름
--hostname : 컨테이너 내부에 적용되는 호스트네임 지정
-i : 컨테이너의 표준입력을 항상 열린 상태로 유지
-t : 호스트에서 컨테이너를 사용할 수 있는 콘솔(TTY)이 할당 (--tty)
#태그#
[이미지이름]:latest : 최신 버전의 이미지
[이미지이름]:stable : 안정화 버전의 이미지
**태그와 옵션은 뒤에서도 자주 쓰이기 때문에 알아두자!
2) ps, ls : 컨테이너 목록 확인
#기본 형식#
docker container ls [옵션]
docker ps [옵션]
#옵션#
-a : 모든 상태의 컨테이너를 표시
=> -a를 주지 않으면, 실행 중이지 않은 컨테이너는 보이지 않는다
-q : 실행 중인 컨테이너의 ID만 출력
실행 화면을 보면 -a 옵션을 주지 않았을 경우, created 상태의 컨테이너는 보이지 않는 것을 볼 수 있다.
3) start : 컨테이너 실행
#기본 형식#
docker start [옵션] [컨테이너 이름 | 컨테이너 ID]
docker restart [컨테이너 이름 | 컨테이너 ID] => 재시작
#예시#
docker start 364
docker start MyWeb
컨테이너는 이름 또는 컨테이너 ID로 식별되는데, 해당 정보들은 ps 명령어로 확인 가능하고, 컨테이너 ID는 다른 컨테이너의 ID와 겹치지 않는 숫자까지만 기입하면 컨테이너가 식별된다.
4) run : 컨테이너 실행 ( RUN = CREATE + START ) -- 가장 많이 사용
#기본 형식#
docker container run [옵션] [저장소이름/]이미지이름[:태그]
#예시#
docker run -d --name=MyDB --hostname=MysqlDB mysql:latest
run 명령어를 사용하면, 로컬에 이미지가 없을 경우, 레지스트리에서 pull해오고, create과 start과정을 모두 진행해 준다.
근데 해당 명령문을 실행하면 분명 컨테이너가 실행 중이어야 하는데, 종료된 상태이다. 왜 그럴까?
도커에서는 컨테이너를 처음 실행할 때, 초기화 과정을 거치게 된다. 그때 MySQL, mariadb, Oracle과 같은 DBMS는 필수적으로 환경 변수로 루트 비밀번호를 설정해 줘야 정상적으로 컨테이너가 초기화되며 실행된다. 위의 경우 컨테이너를 실행해 줄 때, 환경변수를 지정해주지 않았기 때문에 자동으로 종료된 것이다. 위의 명령문에 다음 옵션을 추가해 주면 정상적으로 컨테이너가 실행된다.
docker run -d --name=MyDB --hostname=MysqlDB -e MYSQL_ROOT_NAME=1234 mysql:latest
5) stop : 컨테이너 중지
#기본 형식#
docker container stop [컨테이너 이름 | 컨테이너 ID ]
#예시#
docker container stop 072
6) rm : 컨테이너 삭제
#기본 형식#
docker rm <컨테이너 이름 | 컨테이너 ID>
#예시#
docker rm 072
**컨테이너는 실행(running) 상태에서는 삭제할 수 없다. 삭제하기 전에 꼭 정지(stop)시켜주도록 하자.
7) prune : 정지 상태의 모든 컨테이너 삭제
#사용법#
docker container prune
** 실행중인 컨테이너를 포함하여 모든 컨테이너를 한 번에 종료하고 삭제하기
실습을 진행하다보면, 기존에 만들어준 컨테이너와 포트가 충돌하여 오류가 생기는 경우가 있다. 실무에서는 권장하지 않는 방법이나, 해당 상황에서 실행 중인 모든 컨테이너를 정지하고, 모든 컨테이너를 삭제하는 방법을 알아두자.
//모든 컨테이너 중지
docker container stop $(docker ps -qa)
// 중지된 모든 컨테이너 삭제
docker container rm $(docker ps -qa)
docker container prune
$( ) 은 쉘 스크립트에서 괄호 내부의 명령어의 출력값을 외부 명령어로 치환해주는 방식이다
8) exec : 컨테이너 내부에 명령 전달, 쉘에 컨테이너 연결하기
#기본 형식#
docker container exec [옵션] <컨테이너 이름 | 컨테이너 ID >
// 컨테이너에 쉘을 연결해서 직접 접속하기(잘 사용하는 방법은 아니다)
docker container exec -it <컨테이너 이름 | 컨테이너 ID> /bin/bash
9) -v : 호스트와 컨테이너의 볼륨 연결
#기본 형식#
docker container run -v <호스트의 디렉토리>:<컨테이너의 디렉토리> <컨테이너 이름 | 컨테이너 ID>
#예시#
docker container run -itd --name=mydb -v /root/shared_sto:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql:latest
호스트와 컨테이너의 볼륨 연결은 주로 컨테이너 내부의 디렉토리에 데이터를 저장하는 게 위험하기 때문에, 호스트의 볼륨에 연결해서 호스트에 직접 저장할 수 있도록 할 때 사용된다. 컨테이너에 저장했을 경우, 컨테이너가 지워지면 데이터도 전부 유실되기 때문이다.
호스트에 따로 mkdir을 해주지 않은 상태로 컨테이너에 -v 옵션을 줘서 호스트와 컨테이너 간의 볼륨을 연결하면, 자동으로 디렉터리가 생성되고, 컨테이너의 데이터가 다음과 같이 호스트에 저장된다.
( /var/lib/mysql => mysql의 기본 데이터 저장 경로 )
10) pull : 레지스트리에서 이미지 다운 받기
docker image ls 를 치게 되면 다음과 같이 로컬에 저장된 이미지들을 볼 수 있다. run 또는 create를 사용하면, 컨테이너에 필요한 이미지를 레지스트리(Docker Hub 같은)에서 자동으로 받아오기 때문에, 자주 사용할 일은 없지만, pull 명령어를 통해 레지스트리로부터 이미지를 받아올 수 있다.
#기본 형식#
docker container pull [받아올 이미지][:옵션]
11) cp : 컨테이너와 호스트간 파일 복사
#기본 형식#
//컨테이너에서 호스트로
docker container cp 컨테이너명:경로 경로
//호스트에서 컨테이너로
docker container cp 경로 컨테이너명:경로
12) stats : 컨테이너 상태 확인
#기본 형식#
docker container stats <컨테이너 이름 | 컨테이너 ID>
13) logs : 컨테이너 로그 확인
#기본 형식#
docker [container] logs <컨테이너 이름 | 컨테이너 ID>
<-- 모든 로그 출력
docker [container] logs -f <컨테이너 이름 | 컨테이너 ID>
<-- 모든 로그 출력 & 실시간 로그 출력
docker [container] logs -f --tail 5 <컨테이너 이름 | 컨테이너 ID>
<-- 최근 로그 5개 출력 & 실시간 로그만 출력
힘들지만 오늘도 해낸 나를 위한 한 마디,
"꿈을 날짜와 함께 적어 놓으면 그것은 목표가 되고, 목표를 잘게 나누면 그것은 계획이 되며, 그 계획을 실행에 옮기면 꿈은 실현되는 것이다", Grag S, Raid
"불투명한 미래지만, 차근차근 하나씩 헤쳐나가자. 현재에 충실하게, 확신을 갖고"
'Cloud > Docker' 카테고리의 다른 글
[Docker] 도커 레지스트리 구축 및 활용 (0) | 2024.11.26 |
---|---|
[Docker] 도커 이미지 생성: commit, Dockerfile (0) | 2024.11.26 |
[Docker] 도커 컨테이너 네트워크 관리 명령어 (0) | 2024.11.26 |
[Docker] 도커 설치 및 실행 방법 (0) | 2024.11.24 |
[Docker] Docker Container 기초 이론 (0) | 2024.11.23 |