run - Start a Container
docker run nginx
- 이미지로부터 컨테이너를 실행할 때 사용함
- Docker 호스트에 Nginx 애플리케이션 인스턴스가 있다면 해당 인스턴스를 실행함
- 호스트에 이미지가 없다면 Docker Hub 로 이동해 이미지를 Pull 해옴
- 이 작업은 한 번만 처리되기 때문에 명령어를 여러 번 실행해도 같은 이미지를 재사용함
docker run ubuntu
- ubuntu 이미지의 인스턴스를 실행하고 즉시 종료함
- 실행중인 컨테이너를 확인해도 실행 중인 컨테이너가 없음
- 해당 컨테이너는 이미 종료된 상태
- 왜? Docker 는 가상 머신과 다르게 컨테이너의 목적은 운영 체제 호그팅이 아니라 특정 작업이나 프로세스를 처리하는 것
- 가령 Web Server 나 Application Server 또는 Database Instance 를 호스팅하거나 연산이나 분석 작업을 수행하는 것이 있음
- 작업이 끝나면 컨테이너는 종료됨
- 컨테이너는 내부 프로세스가 실행되는 동안만 존재
- 컨테이너 내부의 Web Service 가 멈추거나 충돌이 발생하면 컨테이너가 종료됨
- ubuntu 이미지로 컨테이너를 실행하면 즉시 종료되는 이유
- ubuntu 는 다른 Application 의 베이스 이미지로 사용되는 운영 체제의 이미지일 뿐이기 때문
- 컨테이너 자체에서 기본적으로 실행되는 프로세스나 애플리케이션이 없음
ps - List Containers
docker ps
- 실행되는 모든 컨테이너와 해당 컨테이너의 기본 정보를 나열함
- 컨테이너 ID 나 컨테이너 실행을 위해 사용되는 이미지의 이름, 현재 상태나 컨테이너 이름 등이 있음
- 각 컨테이너는 Docker 에 의해 자동으로 생성된 임의의 ID나 이름을 갖음
docker ps -a
- 모든 컨테이너 확인
- 이미 종료한 컨테이너까지 모두 출력
stop - Stop a Container
docker stop nginx
- 실행 중인 컨테이너를 멈춤
- 컨테이너 ID 또는 이름이 필요
rm - Remove a Container
images - List Images
docker images
- 사용할 수 있는 이미지의 목록과 이미지의 크기를 확인
rmi - Remove Images
docker rmi nginx
- 명령어로 사용하지 않을 이미지를 삭제할 수 있음
- 이미지를 삭제하려면 해당 이미지가 종속된 모든 컨테이너를 중단 또는 삭제해야 함
pull - Download an Image
Append a command
- ubuntu 의 경우와 같이 실행되는 서비스가 없는 이미지라면
docker run
명령어를 이용해 Docker 가 프로세스를 실행하도록 명령할 수 있음
docker run ubuntu sleep 5
명령어 실행 시 컨테이너가 실행된 후 5초 간 sleep 이 실행된 뒤 컨테이너는 종료됨
exec - Execute a Command
- 실행 중인 컨테이너에 명령어를 사용할 때
- 특정 컨테이너의 파일 컨텐츠를 확인한다고 가정 시
docker exec distracted_mcclintock cat /etc/hosts
/etc/hosts
위치에 있는 파일 컨텐츠를 출력
run - Attach and Detach
docker run kodekloud/simple-webapp
- 위 명령어 실행 시 forground 즉, 연결 모드로 실행됨
- 즉, 콘솔에 연결되거나 Docker Container 의 표준 출력이라는 뜻
- 웹 서비스의 출력값을 확인하게됨
- 이 Docker Container 의 출력값을 보는 것 외엔 할 수 있는 게 없음
docker run -d kodekloud/simple-webapp
- Docker Container 를 Detached 모드로 실행
- Docker Container 를 background 에서 실행
docker attach
에 컨테이너 ID 나 이름을 지정해서 다시 Attached 모드로 변경
docker run
run - tag
docker run redis
- tag 가 명시되지 않으면 latest 버전으로 실행
docker run redis:4.0
run - stdin
- Docker Container 는 기본적으로 표준 입력을 수신하지 않음
- 입력값을 읽을 수 있는 터미널이 없어 비 대화형 모드로 실행됨
- 입력값을 받으려면
-i
매개변수를 이용해서 호스트의 표준 입력값과 Docker Container 를 매핑해야 함
docker run -i kodekloud/simple-prompt-docker
- 이러면 터미널의 애플리케이션 프롬프트를 사용하고 컨테이너 터미널에 연결하지 않았기 때문에 stdin 출력값이 보이지 않음
docker run -it kodekloud/simple-prompt-docker
- Terminal 을 뜻하는 t 값을 추가하여 stdin 출력값을 볼 수 있음
run - PORT mapping
- Docker Host / Docker Engine = Docker 가 설치된 기본 호스트
- Container 로 실행되는 Web App 에 엑세스하는 방법은?
- 모든 Docker Container 는 기본으로 내부 IP 를 할당 받음
- 이는 Docker Host 를 통해서만 접근 가능
- 외부 접근의 경우 Docker Container Port 와 Docker Host Port 를 매핑하는 Port Mapping 을 활용해야 함
docker run -p 80:5000 kodekloud/simple-webapp
- 위와 같은 명령어를 통해 Docker Host 의 80 포트와 Docker Container 의 5000 포트를 매핑할 수 있음
- 물론 하나의 Docker Host Port 에 2개 이상의 Container 를 매핑할 순 없음
run - Volume mapping
- 데이터베이스와 테이블이 생성되면 Docker Container 안에 있는 자체적으로 분리된 파일 시스템에 저장됨
docker stop mysql
docker rm mysql
- Container 제거 시 그 안에 있는 모든 데이터가 날아감
- 데이터를 유지하려면 Docker Host 디렉터리를 Docker Container 내부 디렉터리에 매핑해야 함
docker run -v /opt/datadir:/var/lib/mysql mysql
- 위 명령어 실행 시 Docker Container 내의 폴더로 외부 디렉터리가 내부적으로 마운트 됨
Inspect Container
docker ps
명령어 사용 시 Container 이름이나 ID 같은 기본 정보를 얻을 수 있음
docker inspect
명령어를 사용해서 특정 컨테이너의 추가적인 세부 정보를 볼 수 있음
docker inspect blissful_hopper
사용 시 컨테이너의 모든 세부 정보를 JSON 형식으로 출력
- 상태, 마운트, 구성 데이터, 네트워크 설정 등
Networks.bridge.IPAddress
를 통해 내부 IP 확인 가능
Container Logs
- 백그라운드에서 실행한 컨테이너 로그를 보는 방법
- 예를 들어 detatched 모드로 실행한 컨테이너의 stdout 로그를 보고 싶을 경우
docker logs blissful_hopper
(컨테이너 ID 또는 이름)
References