도커 컨테이너 다루기
도커 컨테이너는 이미지를 바탕으로 만듭니다. 따라서 우리는 도커 이미지, 도커 컨테이너를 다루는 법에 익숙해져야 합니다. 자 그럼 도커 컨테이너에 대해 알아봅시다.
도커 컨테이너 생애주기
실행 중, 정지, 파기의 3가지 상태를 갖습니다.
실행 중 상태
docker container run 명령의 인자로 지정된 도커 이미지를 기반으로 컨테이너가 생성되면 이 이미지를 생성했던 Dockerfile에 포함된 CMD 및 ENTRYPOINT 인스트럭션에 정의된 애플리케이션이 실행됩니다. 이 애플리케이션이 실행 중인 상태가 컨테이너의 실행 중 상태가 됩니다.(실행이 끝나면 정지 상태가 됨)
정지 상태
실행 중 상태에 있는 컨테이너를 사용자가 명시적으로 정지하거나 컨테이너에서 실행된 애플리케이션이 정상/오류 여부를 막론하고 종료된 경우에는 컨테이너가 자동으로 정지 상태가 됩니다.. 컨테이너를 정지시키면 가상 환경으로서는 더 이상 동작하지 않지만, 디스크에 컨테이너가 종료되던 시점의 상태가 저장돼 남기때문에 컨테이너를 다시 실행할 수 있습니다.
파기 상태
정지 상태의 컨테이너는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아 있게 됩니다. 불필요한 컨테이너는 완전히 삭제하는 것이 바람직함. (한 번 파기한 컨테이너는 다시 실행할 수 없다.) 한 번 파기한 컨테이너는 다시는 실행 할 수 없습니다. 같은 이미지로 새로운 컨테이너를 생성했다고 해도 각 컨테이너가 실행된 시각 등이 서로 다르고 처리 결과도 달라질 수 있기 때문에 완전히 같은 컨테이너를 생성할 수는 없습니다.
docker container run - 컨테이너 생성 및 실행
docker container run 명령은 도커 이미지로부터 컨테이너를 생성하고 실행하는 명령입니다. 도커 컨테이너를 실행 중 상태로 만들기 위해 사용합니다.
docker container run [options] 이미지명[:태그명] [명령] [명령인자...]
docker container run [options] 이미지ID [명령] [명령인자...]
$ docker container run example/hello:latest
$ docker container run -d -p 1234:6379 redis # redis 이미지를 실행 백그라운드(-d)로 실행
docker container run 명령의 인자
docker container run 명령에 명령 인자를 전달하면 Dockerfile에서 정의했던 CMD 인스트럭션을 오버라이드할 수 있습니다.
예제를 살펴보면, ubuntu CMD 인스트럭션은 /bin/sh로 쉘을 실행하는데, 다음과 같이 이 인스트럭션을 다른 명령으로 오버라이드할 수 있습니다.
$ docker container run -it ubuntu:16.04 uname -a
도커 명령에서 자주 사용되는 옵션
- -d : detached mode 흔히 말하는 백그라운드 모드
- -p : 호스트와 컨테이너의 포트를 연결(포워딩)
- -v : 호스트와 컨테이너의 디렉토리를 연결 (마운트)
- -it : -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션(컨테이너를 종료하지 않은 채로, 터미널의 입력을 계속해서 컨테이너로 전달하기 위해서 사용)
포트포워딩에 관해서..
위의 예제에서 redis 이미지를 실행하였는데요. -p 옵션을 준 것을 볼 수 있습니다. redis는 메모리기반의 다양한 기능을 가진 스토리지이며, 기본 6379포트로 통신을 합니다.
그런데 -p 옵션 없이 redis를 실행시키면 리스닝하는 포트가 로컬 환경의 6379포트가 아니게 됩니다.
도커 컨테이너는 가상 환경이지만, 외부에서 봤을 때 독립된 하나의 머신처럼 다룰 수 있다는 특징이 있습니다. 애플리케이션은 6379 포트를 리스닝하고 있지만, 이 포트는 컨테이너 포트라고 해서 컨테이너 안에 한정된 포트가 됩니다.
따라서 요청을 받는 애플리케이션을 사용하려면 컨테이너 밖에서 온 요청을 컨테이너 안에 있는 애플리케이션에 전달해줘야 하는데 그역할을 담당하는 것이 바로 도커의 포트 포워딩입니다. 포트 포워딩은 호스트 머신의 포트를 컨테이너 포트와 연결해 컨테이너 밖에서 온 통신을 컨테이너 포트로 전달하는 역할을 합니다.
호스트 머신에서 1234 포트로 redis를 사용할 수 있게됩니다!
docker container ls - 도커 컨테이너 목록 보기
docker container ls 명령은 실행 중이거나 종료된 컨테이너의 목록을 보여주는 명령입니다.
docker container ls [options]
docker container ls 항목 의미
항목 | 내용 |
CONTAINER ID | 컨테이너를 식별하기 위한 유일 식별자 |
IMAGE | 컨테이너를 만드는 데 사용된 도커 이미지 |
COMMAND | 컨테이너에서 실행되는 애플리케이션 프로세스 |
CREATED | 컨테이너 생성 후 경과 시간 |
STATUS | Up(실행 중), Exited(종료) 등 컨테이너의 실행 상태 |
PORTS | 호스트 포트와 컨테이너 포트의 연결 관계(포트 포워딩) |
NAMES | 컨테이너의 이름 |
컨테이너 ID만 추출하기
$ docker container ls -q
컨테이너 목록 필터링하기
$ docker container ls --filter "필터명=값"
$ docker container ls --filter "name=docker" # 컨테이너 명 기준
$ docker container ls --filter "ancestor=redis" # 이미지 기준
종료된 컨테이너 목록 보기
$ docker container ls -a
docker container stop - 컨테이너 정지하기
docker container stop 컨테이너ID_또는_컨테이너명
docker container restart - 컨테이너 재시작하기
docker container restart 컨테이너ID_또는_컨테이너명
docker container rm - 컨테이너 파기하기
컨테이너를 정지하는 명령은 docker container stop 이고, 정지된 컨테이너를 완전히 파기하려면 docker container rm 명령을 사용합니다.
docker container rm 컨테이너ID_또는_컨테이너명
도커 컨테이너느 정지된 상태에서도 정지 시점의 상태를 유지한채 디스크에 남아 있습니다. 그렇기 때문에 컨테이너 실행 및 정지를 반복하다 보면 디스크 용량이 늘어나게 되기 때문에 컨테이너를 파기 해야합니다.
그러나 실행 중인 컨테이너는 일반적인 docker container rm 명령으로 삭제할 수 없기 때문에 -f 옵션을 사용해야 합니다.
$ docker container rm -f 컨테이너ID_또는_컨테이너명
$ docker container run --rm ... # 컨테이너 실행시 --rm 옵션을 주면, 정지할 때 자동 파기가 됩니다.
docker container logs - 표준 출력 연결하기
docker container logs 명령을 사용하면 현재 실행 중인 특정 도커 컨테이너의 표준 출력 내용을 확인 할 수 있습니다.
docker container logs [options] 컨테이너ID_또는_컨테이너명
docker container exec - 실행 중인 컨테이너에서 명령 실행하기
docker container exec 명령을 사용하면 실행 중인 컨테이너에서 원하는 명령을 실행할 수 있습니다.
docker container exec [options] 컨테이너ID_또는_컨테이너명 컨테이너에서_실행할_명령
docker container exec 명령을 사용하면 마치 컨테이너에 ssh로 로그인한 것처럼 컨테이너를 조작할 수 있음.
표준 입력 연결을 유지하는 -i 옵션과 유사 터미널을 할당하는 -t 옵션을 조합하면 컨테이너를 쉘을 통해 다룰 수 있게 됩니다.
$ docker contaienr exec -it 컨테이너_ID sh
docker container cp - 파일 복사하기
docker container cp 명령은 컨테이너끼리 혹은 컨테이너와 호스트 간에 파일을 복사하기 위한 명령입니다.
Dockerfil에 포함된 COPY 인스트럭션은 이미지를 빌드할 때 호스트에서 복사해 올 파일을 정의하기 위한 것이고, docker container cp 명령은 실행 중인 컨테이너와 파일을 주고받기 위한 명령이라고 볼 수 있습니다..
docker container cp [options] 컨테이너ID_또는_컨테이너명:원본파일 대상파일
docker container cp [options] 호스트_원본파일 컨테이너ID_또는_컨테이너명:대상파일
$ docker container cp wp_wordpress_1:/var/www/html/index.php . # wp_wordpress 컨테이너에서 index.php 가져오기
$ echo hello world > test
$ docker container cp test wp_wordpress_1:/var/www/html/test # test 파일 복사
$ docker container exec ls /var/www/html | grep test # 확인
도커 끝..
'프로그래밍 노트 > 도커' 카테고리의 다른 글
실용적인 (도커)컨테이너 구축 및 배포를 위한 지식_1 (0) | 2021.01.30 |
---|---|
도커 컴포즈(docker-compose) 네트워크 (0) | 2021.01.17 |
도커살펴보기_이미지 다루기 (0) | 2021.01.15 |
도커살펴보기_컨테이너로 애플리케이션 실행하기 (0) | 2021.01.15 |
[docker] 데이터 볼륨, 데이터 볼륨 컨테이너 (0) | 2020.12.30 |