-
[Docker/도커] #2 컨테이너 다루기Docker 2020. 1. 16. 01:06
Docker 컨테이너
도커 컨테이너는 이미지를 바탕으로 만들어집니다. 도커 컨테이너는 파일 시스템과 애플리케이션이 함께 담겨 있는 박스라고 생각하면 됩니다. 도커 컨테이너는 실행, 정지, 파기의 3가지 상태의 생애주기를 갖습니다.
실행
docker container run 명령의 인자로 지정된 도커 이미지를 기반으로 컨테이너가 생성되면 이미지를 생성했던 Dockerfile에 포함된 CMD 및 ENTRYPOINT 인스트럭션에 정의된 애플리케이션이 실행됩니다. 이는 곧 컨테이너의 실행 상태입니다.
정지
실행 중 상태에 있는 컨테이너를 사용자가 명시적으로 정지하거나 컨테이너에서 실행된 애플리케이션이 정상/오류 종료된 경우에는 컨테이너가 자동으로 정지 상태가 됩니다. 컨테이너가 정지되면 가상 환경에서는 더 이상 동작하지 않지만, 디스크에 컨테이너가 종료된 시점의 상태가 저장되어 남아있습니다. 정지된 컨테이너는 다시 실행이 가능합니다.
파기
정지 상태의 컨테이너는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아 있습니다. 디스크에 용량을 차지하고 있으므로 불필요한 컨테이너는 완전히 삭제하는 것이 좋습니다. 한 번 파기된 컨테이너는 다시 실행할 수 없습니다.
1. 컨테이너 생성 및 실행 : docker container run
& docker container run [options] 이미지명[:태그] [명령] [명령인자...]
& docker container run [options] 이미지ID [명령] [명령인자...]
docker container run 명령은 도커 이미지로부터 컨테이너를 생성하고 실행하는 명령입니다.
여러 옵션을 통해 컨테이너 실행과 속성을 설정할 수 있습니다.
- -p [호스트 포트]:컨테이너 포트 : 컨테이너 포트를 호스트 포트에 포워딩합니다.
호스트 포트 번호를 생략하면 자동으로 호스트의 빈 포트에 할당됩니다. 이 옵션은 여러 번 사용 가능합니다.
& docker container run -p 10022:22 -p 18080:8080 ubuntu:latest
- --name : 컨테이너의 이름 설정합니다.
& docker container run --name test_ubuntu ubuntu:latest
- -d : 컨테이너를 백그라운드 실행합니다.
- -i : 컨테이너 실행 시, 컨테이너 쪽 표준 입력과의 연결을 그대로 유지합니다. 컨테이너 쪽 쉘에서 명령을 실행할 수 있습니다.
- -t : 유사 터미널 기능을 활성화하는 옵션입니다. 그냥 이 기능을 실행하면 터미널만 실행되고 입력이 안되어 -i 옵션과 같이 씁니다.
- -it : -i, -t을 합친 옵션입니다.
- --rm : 컨테이너 종료 시, 파기하도록 하는 옵션입니다. 일회용 컨테이너에서 사용합니다.
- -v : 호스트와 컨테이너 간에 디렉터리나 파일을 공유하기 위해 사용하는 옵션입니다.
명령 인자
docker container run 명령에 명령 인자를 전달하면 Dockerfile에서 정의했던 CMD인스트럭션을 오버라이드 할 수 있다.
& docker container run ubuntu:latest /bin/bash
위 예시는 /bin/bash 쉘 명령 인자로 오버라이드 한 경우입니다.
복합사용
실제 컨테이너 사용 생성 시, 위 옵션들을 필요에 따라 복합적으로 사용합니다.
아래 예시는 22, 8080 포트를 호스트 10022, 18080 포트에 포트 포워딩 하며, 유사 터미널로 표준 입출력이 가능하도록 bash 쉘이 실행되는 우분투 환경의 컨테이너를 실행하는 명령어입니다.
& docker container run -p 10022:22 -p 18080:8080 --name test_ubuntu -it ubuntu:latest /bin/bash
2. 컨테이너 목록 보기 : docker container ls
$ docekr container ls
docker container ls를 통해 실행되고 있는 컨테이너를 확인할 수 있습니다.
-a 옵션을 추가하면 정지된 컨테이너를 확인할 수 있습니다.
$ docker container ls -a
목록에 표시되는 항목의 의미는 아래와 같습니다.
항목 내용 CONTAINER ID 컨테이너를 식별하기 위한 유일 식별자 IMAGE 컨테이너를 만드는 데 사용된 도커 이미지 COMMAND 컨테이너에서 실행되는 애플리케이션 프로세스 CREATED 컨테이너 생성 후 결과된 시간 STATUS Up(실행 중), Exited(종료) 등 컨테이너의 실행 상태 PORTS 호스트 포트와 컨테이너 포트의 연결 관계(포트 포워딩) NAMES 컨테이너의 이름 -q 옵션을 사용하면 컨테이너의 ID만 출력할 수 있습니다.
$ docker container ls -q
--filter "필터명=값" 옵션을 이용하여 출력 조건을 설정할 수 있습니다.
$ docker container ls --filter "name=test_ubuntu"
3. 컨테이너 정지하기 : docker container stop
$ docker container stop 컨테이너ID_또는_컨테이너명
docker container stop 명령어를 이용해서 실행 중인 컨테이너를 정지할 수 있습니다.
정지된 컨테이너는 가상 환경에서는 돌아가진 않지만, 디스크에 파일 데이터가 남아 있어 다시 실행 가능합니다.
4. 컨테이너 재시작하기 : docker container restart
$ docker container restart 컨테이너ID_또는_컨테이너명
docker container restart 명령어를 통해 정지되었던 컨테이너를 다시 실행할 수 있습니다.
5. 컨테이너 파기하기 : docker container rm
$ docker container rm [options] 컨테이너ID_또는_컨테이너명
docker container rm 명령어를 통해 컨테이너를 삭제할 수 있습니다.
실행되고 있는 컨테이너는 기본적으로 파기가 되지 않습니다.
실행 중인 컨테이너를 파기하려면 컨테이너 종료 후, 파기를 하거나 -f 옵션을 추가하면 됩니다.
6. 컨테이너 표준 출력 연결하기 : docker container logs
$ docker container logs [options] 컨테이너ID_또는_컨테이너명
docker container logs는 현재 실행 중인 컨테이너의 표준 출력을 확인 할 수 있습니다.
이는 표준 출력만 확인 가능하며 파일 등의 출력은 확인이 불가능합니다.
-f 옵션를 추가하면 계속 확인이 가능합니다.
7. 컨테이너에서 명령 실행하기 : docker container exec
$ docker container exec [options] 컨테이너ID_또는_컨테이너명 실행할_명령
docker container exec는 실행 중인 컨테이너에서 명령을 실행하도록 합니다.
보통 컨테이너 내부 상태를 확인하거나 디버깅하는 용도로 사용할 수 있으며,
컨테이너 안에 든 파일을 수정하는 것은 부작용을 초래할 수 있어서 운영 환경에서는 절대 해서는 안된다고 합니다.
8. 파일 복사하기 : docker container cp
$ docker container cp [options] 컨테이너ID_또는_컨테이너명:원본파일 복사위치
$ docker container cp [options] 호스트_원본파일 컨테이너ID_또는_컨테이너명:복사위치
$ docker container cp [options] 컨테이너ID_또는_컨테이너명:대상파일 호스트_복사위치
Dockerfile에 포함된 COPY 인스트럭션은 이미지를 빌드할 때 호스트에서 복사해 올 파일을 정의하기 위한 것입니다.
docker container cp는 이미 실행 중인 컨테이너끼리 혹은 호스트 컨테이너 사이에 파일을 복사하기 위한 명령입니다.
아직 파기되지 않은 정지 상태의 컨테이너에 대해서도 가능한 명령입니다.
참고자료
- 야마다 아키노리, 심효섭 [역]. 도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문. n.p.: 위키북스; n.d. 61-73 p.
'Docker' 카테고리의 다른 글
[Docker/도커] #1 이미지 다루기 (0) 2020.01.12 - -p [호스트 포트]:컨테이너 포트 : 컨테이너 포트를 호스트 포트에 포워딩합니다.