초보자를 위한 Docker 기본 (1)

Updated:

본 포스팅을 읽기전에,

Docker가 설치되어 있지 않다면 Docker를 미리 설치하고 본 포스팅을 읽으며 따라하면 훨씬 더 효과적이에요~

Docker 설치하기

초간단 개요

Docker 엔진에서 사용하는 기본 단위는 “이미지”와 “컨테이너”이며, 이 두가지가 핵심입니다.

아래와 같은 간략한 정의 정도만 기억하시고, 읽어가면서 차차 익혀 봅시다.

  • “이미지”

컨테이너를 생성할 때 필요한 요소이며, CD 또는 CD를 구운 iso 파일과 비슷한 개념입니다. - 이미지 이름 표기법 : [저장소이름]/[이미지이름]:[태그] ※ [저장소이름] 생략 시 도커 공식 이미지를 지칭함 ※ [태그] 생략 시 latest로 취급 ex) [이미지이름]:latest

  • “컨테이너”

도커 이미지를 프로세스化 하는 것입니다.

쉽게 생각하면 게임 CD(Docker image)를 CD Reader기(Docker engin)에 넣고 게임을 실제로 실행(컨테이너 생성&실행)한 것입니다.


도커 핵심 명령어

이 정도 명령어만 알아도 왠만큼 Docker를 사용할 수 있습니다.

자주 사용하며 손가락에 익혀둡시다.

docker -v

Docker의 버전을 확인한다.

$ docker -v

Docker version 19.03.7, build 7141c199a2


docker pull [이미지이름]

이미지 저장소에서 이미지를 Download 한다.

$ docker pull centos:7

7: Pulling from library/centos
ab5ef0e58194: Pull complete 
Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
Status: Downloaded newer image for centos:7
docker.io/library/centos:7


docker images

내 Local Repository에 저장된 이미지 목록을 확인한다.

$ docker images

REPOSITORY     TAG    IMAGE ID         CREATED             SIZE
centos         7      5e35e350aded     4 months ago        203MB


docker rmi [이미지명]

내 Repository에 있는 이미지를 삭제한다.

삭제한 이미지는 이미지 이름만 알고 있으면 언제든지 다시 받을 수 있으므로 내 Repository는 깔끔하게 유지하자.

참고로 이미지 이름 표기법은 [저장소이름]/[이미지이름]:[태그] 이다.

docker run [OPTIONS] [이미지이름] [COMMAND] [ARG…]

컨테이너를 “새로” 생성 및 실행한다. (뒤에 설명하는 docker exec와 구분)

내 Repository에 해당 이미지가 없을 경우 이미지 Download를 자동으로 먼저 수행한다

$ docker run -d -e MYSQL_ROOT_PASSWORD=mypasswd --name=mysql1 mysql:5.7

Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
68ced04f60ab: Pull complete 
f9748e016a5c: Pull complete 
da54b038fed1: Pull complete 
6895ec5eb2c0: Pull complete 
111ba0647b87: Pull complete 
c1dce60f2f1a: Pull complete 
702ec598d0af: Pull complete 
63cca87a5d4d: Pull complete 
ec05b7b1c5c7: Pull complete 
834b1d9f49b0: Pull complete 
8ded6a30c87c: Pull complete 
Digest: sha256:b475cf2d99b3209c9fafe7841b6f05cfd862c67ee5b06ff66506216409370b74
Status: Downloaded newer image for mysql:5.7
d0e085dac537aea3ef6bdccd999081e63e9dbe4cbd5d20b5ebf4f41a606b351a

[위 명령어의 옵션 설명]

-d, –detach : 백그라운드로 컨테이너 실행(즉, 입출력이 없는 상태로 실행)

-e, –env list : 관련 환경변수 설정

–name=[이름], –name [이름] : 컨테이너 이름 지정

$ docker run -i -t --name myubuntu1 ubuntu:14.04

Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete 
30bb187ac3fc: Pull complete 
b7a5bcc4a58a: Pull complete 
Digest: sha256:ffc76f71dd8be8c9e222d420dc96901a07b61616689a44c7b3ef6a10b7213de4
Status: Downloaded newer image for ubuntu:14.04
root@918b5a0997e3:/# 

[위 명령어의 옵션 설명]

-i, –interactive : 상호 입출력창을 open한 상태로 컨테이너를 실행

-t, –tty : TTY를 활성화하여 bash 쉘을 사용가능케 함

→ 2개 옵션을 붙여서 한 번에 써도 된다. docker run -it …

docker ps

“실행중”인 컨테이너 목록을 확인한다.

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
534f97870d62        mysql:5.7           "docker-entrypoint.s…"   47 minutes ago      Up About an hour    3306/tcp, 33060/tcp   mysql1

정지된 목록을 보고 싶으면 –a 옵션을 추가

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS                 NAMES
534f97870d62        mysql:5.7           "docker-entrypoint.s…"   46 minutes ago      Up About an hour               3306/tcp, 33060/tcp   mysql1
2c4627762afa        ubuntu:14.04        "/bin/bash"              About an hour ago   Exited (0) About an hour ago                         myubuntu1

-q 옵션으로 컨테이너 id 출력

$ docker ps -a -q

89e753f1b95a
918b5a0997e3
de67d55ce5ab

-q 옵션 활용한 모든 컨테이너 중지

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

89e753f1b95a
918b5a0997e3
de67d55ce5ab


docker rm [컨테이너명]

“정지”되어 있는 컨테이너를 삭제한다.

“실행”중인 컨테이너를 삭제할 때는 -f 옵션 추가.

$ docker rm myubuntu1

myubuntu1
$ docker rm -f mysql1

mysql1


docker exec [OPTIONS] [컨테이너명] [COMMAND] [ARG…]

이미 생성되어 실행중인 컨테이너에 명령어를 전달, 또는 이미 실행중인 컨테이너의 shell로 들어가고자 할 때 사용

(docker run과 혼동하지 말자)

$ docker exec -it mysql1 bash

Uroot@534f97870d62:/#   (← 아까 실행시켜 놨던 mysql1 컨테이너의 shell로 들어감)

참고로, 위와 같이 Docker 컨테이너 내부 shell로 들어간 후 다시 바깥으로 나오는 방법은 세 가지가 있습니다.

1) exit

명령어 “exit”을 치고 엔터 (컨테이너를 종료시키고 나옴)

2) Ctrl + D

컨테이너를 종료시키고 나옴

3) Ctrl + P 누른 후 다시 Q

컨테이너를 살려두고 나옴

→ 다시 접속하려면 docker attach [컨테이너명]

docker create [OPTIONS] [이미지이름] [COMMAND] [ARG…]

컨테이너를 생성만한다. (실행x)

내 Repository에 해당 이미지가 없을 경우 이미지 Download를 먼저 수행한다

$ docker create -it --name mycentos centos:7

Unable to find image 'centos:7' locally
7: Pulling from library/centos
ab5ef0e58194: Pull complete 
Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
Status: Downloaded newer image for centos:7
9da63a5da2e324bebc249967bc82460ad19b30396f090f95fb46fdfc5c6a898c


docker start [컨테이너명]

생성된 컨테이너를 실행한다.

$ docker start mycentos

mycent

※ start 명령어는 생성된 컨테이너를 실행만 시킨 것이며, shell 사용을 원할 시 docker exec 명령어를 활용한다.

docker rename [old_name] [new_name]

컨테이너 이름을 변경한다.

$ docker rename myubuntu1 myu1


docker stop [컨테이너명]

실행중인 컨테이너를 중지한다.

$ docker stop mycentos

mycent

※ start 명령어는 생성된 컨테이너를 실행만 시킨 것이며, shell 사용을 원할 시 docker exec 명령어를 활용한다.

docker rename [old_name] [new_name]

컨테이너 이름을 변경한다.

$ docker rename myubuntu1 myu1


끝으로, 자주사용하는 옵션 정리

옵션 설명
-d detached mode, 흔히 말하는 백그라운드 모드
-e 컨테이너 내부에서 사용할 환경변수 설정
–name 컨테이너 명 설정
-it -i와 -t를 동시에 사용하는 것으로 터미널 입력을 위한 옵션
-p 호스트와 컨테이너의 포트를 연결(포워딩)
-v 호스트와 컨테이너의 디렉토리를 연결(마운트)


다음글…

초보자를 위한 Docker 기본 (2)

초보자를 위한 Docker 기본 (3)

초보자를 위한 Docker 기본 (4)