본문 바로가기
Docker

Docker - docker 주요 명령

by DGK 2021. 12. 14.

 

도커 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

도커(docker)의 주요 명령

도커(docker)의 주요 명령을 학습하고자 한다.

 

docker image & docker container

*docker image

 

docker image는 docker container를 생성하기 위해 명령들을 모아놓은 템플릿이다.

일반적으로 docker image는 여러 개의 image를 층(layer)으로 쌓아서 원하는 형태의 image를 만들어 사용한다.

 

ex. ubuntu image에 apache image를 얹어서 웹 서버 image를 만듬

 

 

*docker container

 

docker container는 docker image가 리눅스 컨테이너 형태로 실행된 인스턴스(상태)를 의미한다.

docker daemon에 있는 커널에서 LXC(LinuX Containers)기술로 리눅스 컨테이너를 생성한 후, 해당 container에 docker image의 명령들을 사용하여 docker container를 만들고 실행한다.

 

기본적으로 docker container는 분리된 공간이므로, docker daemon process로  접속하여 내부의 코드를 수정하거나 재실행을 하는 등의 작업을 할 수 있다. 결국, 도커(docker)는 image와 container를 다뤄서 작업을 하는 기술이다.

 

 

*참고내용

 

docker의 모든 명령은 CLI(Command Line Interface)이므로, 키보드로 직접 명령을 작성하는 형태로 수행된다.

docker는 image와 container 명령이 별도로 존재하기 때문에, 아래와 같이 image를 다루는 명령인지 container를 다루는 명령인지를 명시해주기 위해 docker 다음에 image 또는 container를 써줘야 한다. (명령어가 달라도, 최근 경향은 해당 키워드를 붙여줌)

 

- docker 명령 형식(기본 구조) 

 

   docker (image or container) 명령 옵션 선택자(이미지ID/컨테이너 등)

 

 

docker image 관련 주요 명령

docker image의 주요 명령을 실행하기 전에, 반드시 docker를 설치하고 docker image를 다운받거나 혹은 생성해야 한다.

 

 

  • docker login
docker login

 

*결과 :

docker login

 

해당 명령은 Docker Hub에 로그인 하기 위한 명령으로, 사전에 https://hub.docker.com/에서 회원가입을 해야 한다.

Docker Hub 서비스를 통해 라이브러리처럼 미리 작성해놓은 docker image를 다운 받을 수 있다.

참고로, 해당 명령 이후에 Username과 Password를 정확히 기재해야만 로그인을 할 수 있다.

 

 

  • docker logout
docker logout

 

Docker Hub에 로그인을 한 번 성공하면, 로그인 상태가 지속되기 때문에 해당 명령을 사용할 일은 거의 없다.

 

 

  • docker search 이미지명
docker search ubuntu

 

*결과 :

docker search ubuntu

 

해당 명령은 Docker Hub에서 다운받을 image를 검색하는 명령이다.

 

기본적으로 docker image는 이미지명(:태그) 형태로 이루어지며, 주로 태그에는 해당 image의 버전 정보가 들어간다.

참고로, 이미지명에 태그를 넣지 않으면 최신 버전의 image를 다운로드 하고, 가장 최신이라는 의미의 latest 태그가 붙는다.

 

보통 위의 명령으로 image를 검색하면, 수 많은 image가 결과로 나타나며 OFFICIAL 항목에 [OK]라고 표기된 image가 공식 image이다.

 

 

  • docker search --limit=5 이미지명
docker search --limit=5 ubuntu

 

*결과 :

docker search --limit ubuntu

 

해당 명령은 너무 많은 image가 검색되는 것을 방지하기 위한 명령이며, 검색 결과의 수를 limit으로 제한할 수 있다.

 

 

  • docker pull 이미지명(:태그)
docker pull ubuntu

docker pull ubuntu:20.04

 

*결과 :

docker pull ubuntu
docker pull ubuntu:20.04

 

해당 명령은 docker image를 다운로드하는 명령이다.

단, 이미지명 뒤에 태그를 붙이지 않으면 디폴트 값으로 latest(최신버전)의 image를 다운로드하고 이미지명 뒤에 태그를 붙이면 해당 버전의 image를 다운로드 한다.

 

 

  • docker images
docker images

 

*결과 :

docker images

 

해당 명령은 다운받은 docker image의 목록을 확인하는 명령이다.

 

 

  • docker image ls
docker image ls

 

*결과 :

docker image ls

 

해당 명령은 'docker images'와 동일한 기능을 하는 명령이다. (다운받은 docker image 목록 확인)

 

 

  • docker image ls -q
docker image ls -q

 

*결과 :

docker image ls -q

 

해당 명령은 docker image의 ID만을 표시하는 명령이다.

 

 

  • docker rmi 이미지명
docker rmi ubuntu:20.04

 

*결과 :

docker rmi ubuntu:20.04

 

해당 명령은 다운받은 image를 삭제하는 명령이다.

단, 이미지명 뒤에 태그를 붙이지 않으면 최신 버전의 image를 삭제하고 이미지명 뒤에 태그를 붙이면 해당 image를 삭제한다.

 

 

  • docker rmi IMAGE ID
docker rmi ba6acccedd29

 

*결과 :

docker rmi ba6acccedd29

 

해당 명령은 'docker rmi 이미지명'과 동일한 기능을 하는 명령이다. (image 삭제)

이처럼, 이미지명 대신 IMAGE ID를 넣어서 해당 image를 삭제할 수도 있다.

 

 

docker container 관련 주요 명령

docker image는 docker container를 만들어야만 실행 가능하다.

기본적으로 docker image와 docker container는 각각 관리해줘야 한다.

 

 

  • docker create 이미지명(:태그)
docker create ubuntu

 

*결과 :

docker create ubuntu

 

해당 명령은 docker container를 생성하는 명령이다.

docker container 생성 시, 이름 옵션을 부여하지 않는 경우에는 docker 프로그램에서 자동으로 이름을 부여한다.

참고로, 동일한 image로 여러 개의 docker container를 만들 수 있다.

 

 

  • docker create --name 원하는 컨테이너명 이미지명
docker create --name myubuntu ubuntu

 

*결과 :

docker create --name myubuntu ubuntu

 

해당 명령은 docker container를 생성할 때, 원하는 컨테이너명을 이름 옵션으로 부여하는 명령이다.

 

 

  • docker ps
docker ps

 

*결과 :

docker ps

 

해당 명령은 현재 실행 중인 docker container를 확인하는 명령이다.

 

 

  • docker ps -a
docker ps -a

 

*결과 :

docker ps -a

 

해당 명령은 현재 실행 중이지 않은 docker container까지 포함해서, 전체 docker container를 확인하는 명령이다.

 

 

*참고내용

   - CONTAINER ID : docker container ID

   - IMAGE : docker 이미지명

   - COMMAND : docker container 실행 시 프로세스 이름

   - CREATED : docker container 생성 후 경과시간

   - STATUS : docker container 실행 상태(Created : 생성, Up : 실행중, Pause : 중지, Existed : 종료)

   - PORTS : host와 docker container 포트 사이의 연결 관계 

   - NAMES : docker container 이름

 

 

  • docker ps -a -q
docker ps -a -q

 

*결과 :

docker ps -a -q

 

해당 명령은 전체 docker container의 CONTAINER ID를 표시해주는 명령이다. (실행되지 않는 container도 포함)

 

 

  • docker rm CONTAINER ID
docker rm 85311da50e83

 

*결과 :

docker rm 85311da50e83

 

해당 명령은 docker container를 삭제하는 명령이다.

 

 

  • docker rm 컨테이너명
docker rm silly_villani

 

*결과 :

docker rm silly_villani

 

해당 명령은 'docker rm CONTAINER ID'와 동일한 기능을 하는 명령이다. (docker container 삭제)

위의 명령에서 컨테이너명은 docker container의 NAMES를 의미한다. 

 

 

  • docker start 컨테이너명
docker start myubuntu

 

*결과 :

docker start myubuntu

 

해당 명령은 docker container를 실행시키는 명령이다.

하지만, 위의 명령으로 docker container를 실행시키면 실행되지 않고 바로 중단된다.

이는 docker container에서 실행되도록 설정된 응용프로그램이 중단되면 해당 컨테이너도 함께 중단되기 때문이다.

보다 자세한 이해를 위해서는 컴퓨터 공학(운영체제)에 대한 이해가 필요하다. (추후에 자세히 공부할 예정)

 

따라서, 실행시키자마자 중단되는 문제를 해결하기 위해서는 run 명령을 사용해야 한다.

 

 

  • docker run 옵션 이미지명

docker run 명령은 해당 image를 다운받아서 실행까지 시켜주는 명령이다.

(docker image pull 명령 + docker container start 명령)

 

run 명령의 옵션을 사용하면, docker container가 다루는 응용프로그램에 입력(STDIN)과 가상 터미널을 할당할 수 있다. 그 결과 해당 응용프로그램은 입력을 받을 수 있는 상태가 되기 때문에, 종료되지 않고 실행 중인 상태가 되어 docker container도 함께 실행된다. (docker start 명령과의 차이점)

 

 

*docker run 명령의 주요 옵션

 

   -i : 컨테이너 입력(STDIN)을 열어놓는 옵션 [주로 -t 옵션과 함께 -it로 사용함]

   -t : 가상 터미널(tty)을 항당하는 옵션 [주로 -i 옵션과 함께 -it로 사용함]

   --name : 컨테이너명을 설정하는 옵션

   -d : 컨테이너를 백그라운에서 실행하는 옵션

   --rm : 컨테이너 종료 시 컨테이너를 자동으로 삭제하는 옵션

   -p : 호스트와 컨테이너 포트를 연결하는 옵션

   -v : 호스트와 컨테이너 디렉토리를 연결하는 옵션

 

*참고(1)

-it 옵션의 의미

 

docker container에 표준 입력(STDIN)을 오픈해놓고(-i 옵션), pseudo tty를 만들어서(-t 옵션) 해당 표준 입력을 pseudo tty에 연결해놓는 옵션이다. 즉, pseudo tty를 통해 키보드 입력을 docker container의 표준 입력으로 전달해주는 옵션이다. 

 

*참고(2)

pseudo tty

 

tty는 teletypewriter의 약자로, 리눅스(유닉스 계열)에서는 콘솔 또는 터미널을 의미한다.

tty를 통해 리눅스에 키보드 입력을 전달할 수 있으며, 하나의 tty 이외에 다양한 터미널에서 표준 입력의 접속을 지원하기 위해서는 또 다른 tty가 필요하다. 이에 두 번째 tty부터 가상(pseudo)이라는 말이 붙어서 pseudo tty라고 부르는 것이다.

 

 

docker run -it ubuntu

 

*결과 :

docker run -it ubuntu

 

해당 명령은 ubuntu image의 container를 생성하고, 곧 바로 해당 컨테이너에 접속하는 명령이다.

 

 

docker run -it --name myubuntu ubuntu

 

*결과 :

docker run -it --name myubuntu ubuntu

 

해당 명령을 통해, 사용자가 원하는 이름의 docker container를 만들 수 있고 그 이후에는 바로 접속할 수 있다.

 

 

docker run -it --rm --name myubuntu2 ubuntu

 

*결과 :

docker run -it --rm --name myubuntu2 ubuntu

 

해당 명령은 ubuntu image의 container를 만들고 곧 바로 접속한 후에, exit 명령으로 컨테이너의 접속을 끊으면 해당 컨테이너를 삭제하는 명령이다.

 

 

docker run -it -d --name myubuntu2 ubuntu

 

*결과 :

docker run -it -d --name myubuntu2 ubuntu

 

해당 명령은 ubuntu image의 container를 만든 후, 백그라운드로 실행하는 명령이다.

위의 명령을 사용하면, 해당 컨테이너는 계속 실행 중인 상태로 유지되며 사용자가 원하는 시점에 해당 컨테이너에 접속할 수 있다. (attach 명령 사용)

 

 

*추가내용#1 : run 명령 -p 옵션

웹 서버로 docker run 명령의 -p 옵션을 테스트하고자 한다.

 

웹 서버를 제공하는 프로그램은 크게 두 가지이다.

   - apache

   - nginx

 

이 중에서 apache 웹 서버를 docker로 구동하여, 실제 docker run 명령의 사용 예시와 run 명령 옵션에 대한 이해도를 높이고자 한다.

 

(연습예제)

1. apache 웹 서버의 공식 docker image 찾기(단, 검색제한 5개)

docker search httpd --limit=5

 

*결과 :

docker search httpd --limit=5

 

대부분의 docker image의 공식 이름은 프로그램명과 동일한 경우가 일반적이지만, apache는 httpd의 이름을 사용한다.

 

2. apache image를 다운받고 바로 컨테이너로 만들어 실행하기(단, 백그라운드로 실행)

docker run -d --name apacheweb httpd

 

*결과 :

docker run -d --name apacheweb httpd

 

해당 명령으로 apache image를 다운받아 container를 백그라운드로 실행시키는데는 성공했지만, 해당 웹 서버에 어떻게 접속해야 할지는 알 수 없다. 

 

이러한 문제를 해결하기 위해서는 run 명령의 -p 옵션을 사용해야 한다.

(위의 명령으로 웹 서버 container를 만들면 해당 웹 서버에 접속할 수 없음)

 

docker run -d -p 9999:80 --name apacheweb httpd

 

*결과 :

docker run -d -p 9999:80 --name apacheweb httpd

 

3.38.14.143:9999

 

'docker run -d -p 9999:80 --name apacheweb httpd' 명령은 호스트 PC의 IP에 특정 port로 접근 시, 해당 port를 docker container의 private IP의 특정 port로 변환해주는 명령이다. (NAPT 기술 사용)

 

즉, 해당 명령을 통해 apacheweb container는 apache 웹 서버 프로그램을 실행하며 사용자가 호스트 PC의 IP에 9999 port로 접속할 경우 이를 자동으로 해당 컨테이너(apacheweb container)의 80 port로 연결해준다.

(port 번호가 80인 것은 apache 웹 서버의 기본 설정 때문)

 

 

(참고)

단, 위의 예제를 위해 AWS의 EC2 서비스에서 실행 중인 인스턴스의 보안그룹 규칙을 새롭게 설정해줘야 한다.

 

보안그룹의 인바운드 규칙을 아래와 같이 새롭게 추가해야 한다.

 

   - 유형 : 사용자 지정 TCP

   - 포트 범위 : 9999

   - 소스 : 0.0.0.0/0

 

 

*추가내용#2 : run 명령 -v 옵션

 

호스트 PC에 나만의 index.html 파일이 있다면, -v 옵션을 사용하여 호스트 PC의 특정 폴더를 docker container의 특정 폴더로 공유(바인딩)할 수 있다. 

 

참고로, docker는 image를 기반으로 container를 생성하기 때문에 해당 container가 종료되면 이전에 container 상에서 업데이트한 파일이나 생성한 파일은 container와 함께 삭제된다. 이러한 문제를 보완하기 위해, run 명령의 -v 옵션으로 호스트 PC의 특정 폴더를 docker container의 특정 폴더와 공유하면 컨테이너가 종료되더라도 해당 파일을 유지할 수 있다. (호스트 PC 상에 존재하기 때문)

 

 

(참고)

'docker run -d -p 9999:80 httpd' 명령으로 apache 웹 서버의 80 port로 연결하면, 기본 설정에 따라 /usr/local/apache2/htdocs 폴더에 있는 index.html 파일이 열린다. 

 

따라서, 사용자가 열고 싶은 HTML 파일을 apache 웹 서버에 올리고 -v 옵션을 통해 /usr/local/apache2/htdocs 폴더와 공유한다면 사용자가 서버에 올린 파일을 apache 웹 서버로 보여줄 수 있다. 

 

docker run -d -p 9999:80 -v 호스트 PC의 절대경로:docker container의 절대경로 httpd

 

즉, run 명령의 -v 옵션은 apache 웹 서버의 /usr/local/apache2/htdocs 파일에 있는 index.html 파일과 사용자가 원하는 파일을 공유(바인딩)하는 기능을 한다. 이를 통해 apache 웹 서버에서 사용자가 원하는 HTML 파일을 열거나, apache container에서 작업한 파일을 호스트 PC에 공유하여 저장할 수도 있다. 

 

 

  • docker attach 컨테이너명
docker attach myubuntu2

 

*결과 :

docker attach myubuntu2

 

해당 명령은 백그라운드로 실행 중인 docker container에 접속하는 명령이다.

attach 명령을 사용하여, 이미 생성되어 백그라운드로 실행 중인 myubuntu2 컨테이너에 접속한 것이다.

 

 

  • docker stop CONTAINER ID
docker stop d07fc32e8b21

 

*결과 :

docker stop d07fc32e8b21

 

해당 명령은 백그라운드에 실행 중인 docker container를 종료시키는 명령이다.

 

 

  • docker pause CONTAINER ID
docker pause 7f07c39bfcf6

 

*결과 :

docker pause 7f07c39bfcf6

 

해당 명령은 백그라운드로 실행 중인 docker container를 중지시키는 명령이다. 

 

 

  • docker unpause CONTAINER ID
docker unpause 7f07c39bfcf6

 

*결과 :

docker unpause 7f07c39bfcf6

 

해당 명령은 이미 중지(pause)된 docker container를 다시 실행시키는 명령이다.

 

 

  • docker start CONTAINER ID
docker start d07fc32e8b21

 

*결과 :

docker start d07fc32e8b21

 

해당 명령은 이미 종료(Exited)된 docker container를 실행시키는 명령이다.

 

 

  • docker restart CONTAINER ID
docker restart 7f07c39bfcf6

 

*결과 :

docker restart 7f07c39bfcf6

 

해당 명령은 실행 중인 docker container를 재실행(종료 후 실행)시키는 명령이다.

 

 

  • docker exec 옵션 (CONTAINER ID or 컨테이너명) 명령 인자
docker exec -it apacheweb /bin/sh

 

*결과 :

docker exec -it apacheweb /bin/sh

 

해당 명령은 실행 중인 docker container에 명령을 실행하는 명령이다.

즉, 위와 같은 명령을 실행하면 /bin/sh 쉘 프로그램을 실행하면서 터미널에 연결되며 해당 컨테이너로 들어갈 수 있다.

 

참고로, 실행 명령이 /bin/sh인 이유는 httpd image의 태그가 alpine이기 때문이다.

일반적인 리눅스 패키지의 쉘 프로그램은 bash이지만, alpine의 쉘 프로그램은 sh이므로 위와 같이 실행 명령을 써야한다.

 

 

  • docker stop $(docker ps -a -q)
docker stop $(docker ps -a -q)

 

*결과 :

docker stop $(docker ps -a -q)

 

해당 명령은 모든 docker container를 종료시키는 명령이다.

 

 

  • docker rm $(docker ps -a -q)
docker rm $(docker ps -a -q)

 

*결과 :

docker rm $(docker ps -a -q)

 

해당 명령은 모든 docker container를 삭제하는 명령이다.

 

 

  • docker rmi $(docker images -q)
docker rmi $(docker images -q)

 

*결과 :

docker rmi $(docker images -q)

 

해당 명령은 모든 docker image를 삭제하는 명령이다.

참고로, 'docker rmi -f $(docker images -q)' 명령은 강제로 모든 docker image를 삭제하는 명령이다.

 

 

*참고

docker container prune

docker image prune

docker system prune

 

'docker container prune' 명령은 정지된 docker container를 삭제하는 명령이다.

'docker image prune' 명령은 실행 중인 docker container의 image 이외의 image를 삭제하는 명령이다.

'docker system prune' 명령은 정지된 docker container 및 실행 중인 docker container의 image 이외의 image와 볼륨 그리고 네트워크를 삭제하는 명령이다.

 

 

docker & alpine

기본적으로 리눅스를 사용하면 다양한 기능을 가진 ubuntu 등의 Linux 패키지를 사용하지만, docker container의 경우에는 특정 응용 프로그램을 실행할 목적으로 사용되기 때문에 다양한 기능을 포함하는 Linux 패키지를 사용할 필요가 없다.

 

따라서 docker container를 사용할 경우에는 운영체제 운영에 필요한 가장 기본이 되는 기능만을 모아놓은 alpine 버전의 image를 주로 사용한다.

 

 

*예시

docker run -d -p 9999:80 -v 호스트 PC의 절대경로:docker container의 절대경로 httpd:alpine

 

이처럼 httpd image도 alpine 기반의 태그가 존재한다.

httpd:alpine image를 사용하면 docker container에 필요한 기능을 모두 담은 경량화된 image를 사용하는 것이다.

참고로, docker가 사용하는 저장매체의 공간은 'docker system df' 명령으로 확인할 수 있다.

 

 

댓글