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


  • docker rm nginx
    • 종료한 컨테이너를 영구적으로 삭제

images - List Images


  • docker images
    • 사용할 수 있는 이미지의 목록과 이미지의 크기를 확인

rmi - Remove Images


  • docker rmi nginx
    • 명령어로 사용하지 않을 이미지를 삭제할 수 있음
    • 이미지를 삭제하려면 해당 이미지가 종속된 모든 컨테이너를 중단 또는 삭제해야 함

pull - Download an Image


  • docker pull ubuntu
    • 컨테이너 실행 없이 이미지만 pull

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