본문 바로가기
IT/CLOUD

Docker(도커) 개념 정리와 이미지 컨테이너 명령어 사용하기

by SidePower 2021. 7. 21.

 

지난번 도커 설치 후에 나름 여유가 없었던거 같네요.^^;;

 

이제 다시 도커 공부를 시작할려고 합니다.

 

도커가 정상적으로 설치됐다고 간주하고 바로 시작하겠습니다.

 

도커 설치하고 실행하기 바로가기

 

 

 

도커 개념

도커란 컨테이너를 기반으로 논리적으로

독립된 실행환경을 제공하는 가상화 도구입니다.

 

독립적이란 말은

OS나 하드웨어에 제약받지 않는다는 뜻입니다.

기존의 가상화 도구로 Vmware나 Virtualbox라는 가상머신을 아실거에요.

가상머신은 하드웨어만 가상화 할수 있었기때문에

OS(윈도우, 리눅스 등..) 를 꼭 먼저 설치해야만 필요한 프로그램들을 설치할수 있었습니다.

하지만

docker는 운영체재(OS) 수준으로 가상화 하기때문에

필요한 프로그램만 가상화하면 끝입니다.

이래서 너무 단순하고 가벼워 자원도 적게 차지하고 빠릅니다.

 

 

가상화 구현체인 이미지와 컨테이너 두가지 개념만 아시면

쉽게 접급할수 있을거에요.

 

 

이미지 , Image 

프로그램 실행에 필요한 모든 파일들과 설정값들을 모아둔 파일입니다.

 

우리 알고 있는 이미지라면 흔히 사진을 디지털 형태의 파일로 만든거죠.

생각해 보면 디카로 사진 찍어 이미지를 만든다는것은

내가 담고 싶은 장면이 그대로 이미지에 그려지게 될거에요.

한번 만든 이미지는 복사를 아무리 많이 해도 

처음 이미지를 만든 그 배경이나 장면(상태)은 절대 변화지 않습니다.

 

도커의 이미지 개념도 동일하다고 생각하시면 돼요.

도커 이미지를 만들었다면

어떤 경우에도 절대로 변화지 않고 동일하게 재사용할수 있습니다.

 

 

 컨테이너 , container

이미지를 그대로 가져와 독립적인 실행환경을 만드는 기술입니다.

 

 

 도커 명령어 권한 주기

docker 명령어는 기본적으로 root 권한이 있어야 됩니다.

sudo docker 이렇게 docker 앞에 sudo라는 명령어를 사용하거나 

root 계정으로 전환해야 원활하게 사용할수 있어요.

 

내 계정에서도 docker 명령어를 편하게 사용할수 있게 docker 그룹에 추가해주세요.

 ● 계정 권한 확인
[sidepower@localhost ~]$ id sidepower

uid=1000(sidepower) gid=1000(sidepower) groups=1000(sidepower),10(wheel)

 ● docker 그룹 추가하기
[sidepower@localhost ~]$ sudo usermod -aG docker sidepower

[sudo] sidepower의 암호:

 ● 계정 권한 재확인
[sidepower@localhost ~]$ id sidepower

uid=1000(sidepower) gid=1000(sidepower) groups=1000(sidepower),10(wheel),972(docker)

 

 

도커 버전확인

root 계정 또는 sudo 명령어를 통해 도커를 설치하고
버전까지 정상적으로 확인했을거에요.

그 후에 사용자 계정(sidepower)으로 돌아와서
버전 체크를 해보니 이상하게 오류가 발생했습니다.

/var/run/docker.sock 파일에
접근 권한(permission denied)이 없다고 표시되네요.^^;;


[sidepower@localhost ~]$ docker version

Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:56:24 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version: dial unix /var/run/docker.sock: connect: permission denied


 ● 파일 권한 확인
[sidepower@localhost ~]$ ll /var/run/docker.sock

srw-rw----. 1 root docker 0  7월 15 06:24 /var/run/docker.sock


리눅스 권한 설명 바로가기


 ● 파일에 모든 사용자 읽고,쓰기 권한 주기 (666)

[sidepower@localhost ~]$ su
암호:
[root@localhost sidepower]# chmod 666 /var/run/docker.sock
[root@localhost sidepower]# ll /var/run/docker.sock
srw-rw-rw-. 1 root docker 0  7월 15 06:24 /var/run/docker.sock
[root@localhost sidepower]# exit
exit


 ● 다시 도커 버전 확인
Server 버전까지 보이는데요.

[sidepower@localhost ~]$ docker version

Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:56:24 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:54:48 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.6
  GitCommit:        d71fcd7d8303cbf684402823e425e9dd2e99285d
 runc:
  Version:          1.0.0-rc95
  GitCommit:        b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

 

 

도커 기본 명령어

많은 명령어와 옵셥들이 있지만 자주 사용하는 것만 정리를 했습니다.

 

 이미지 다운로드

docker pull [이미지 이름]:[TAG]

TAG는 이미지 버전정보를 말하며

ubuntu 리눅스 다운로드 한다면

ubuntu:12.10 또는 ubuntu:14.02 처럼 버전을 지정하면 됩니다.

또 [latest]로 지정하면 최신버전을 다운로드 합니다.

 

 이미지 목록 확인

docker images [OPTIONS] [REPOSITORY[:TAG]]
 ● 이미지 목록 확인
[sidepower@localhost ~]$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   4 months ago   13.3kB

 ● ubuntu 리눅스 최선버전 도커 이미지 다운로드
[sidepower@localhost ~]$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
a31c7b29f4ad: Pull complete
Digest: sha256:b3e2e47d016c08b3396b5ebe06ab0b711c34e7f37b98c9d37abe794b71cea0a2
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

 ● 이미지 목록 확인
[sidepower@localhost ~]$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    c29284518f49   39 hours ago   72.8MB
hello-world   latest    d1165f221234   4 months ago   13.3kB

 

 이미지 삭제

docker rmi [OPTIONS] IMAGE [IMAGE...]
 ● 이미지 목록 확인
[sidepower@localhost ~]$ docker images

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    c29284518f49   42 hours ago   72.8MB
hello-world   latest    d1165f221234   4 months ago   13.3kB

 ● 이미지 삭제
[sidepower@localhost ~]$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd

 ● 이미지 목록 확인
[sidepower@localhost ~]$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    c29284518f49   42 hours ago   72.8MB

 

 

 컨테이너 목록 확인

docker ps [옵션]
 ● 실행중인 컨테이너 목록 확인
[sidepower@localhost ~]$ docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
텅~~~~비어있음~

 ● 실행중 또는 한번이라도 실행된 컨테이너 모두 확인(-a 옵션)
[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED             STATUS                         PORTS     NAMES
97412a74a48e   hello-world   "/hello"   About an hour ago   Exited (0) About an hour ago             thirsty_ritchie
47e10e8e597b   hello-world   "/hello"   About an hour ago   Exited (0) About an hour ago             zealous_wescoff

 

 

 컨테이너 실행하기

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

run 명령어로 이미지를 선택해서 컨테이너를 실행합니다.

그치만 이미지를 없을 경우에는 docker hub에 있는 

동일한 이름의 이미지를 자동으로 다운로드해서 컨테이너로 실행시키 줍니다.

run은 pull + start 명령어를 합친거와 같습니다.

 

run 명령어에 자주사용하는 옵션

옵션 설명
-d 백그라운드 모드 실행 . detached mode
-name 컨테이너 이름 지정
-rm 프로세스 종료시 컨테이너도 자동 삭제 . 보통 1회성 처리 위해.
-p 포트 포워딩 . 호스트와 컨테이너 통신을 위한 포트번호 지정
-v 호스트와 컨테이너 디렉터리 연결 . 컨테이너 불능시에도 데이타 보장
-e 컨테이너 내부 환경 변수 지정
-it 터미널 입력 가능
-link 컨테이너 연결
 ● 옵션 없이 run 으로만 컨테이너 실행
실행하고 몇초뒤에 바로 끝나네요.
STATUS를 보면 7초전에 Exited가 표시되죠.

[sidepower@localhost ~]$ docker run ubuntu:latest

[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE           COMMAND   CREATED         STATUS                     PORTS     NAMES
d0eb00394720   ubuntu:latest   "bash"    9 seconds ago   Exited (0) 7 seconds ago             clever_morse
5344e4b92780   ubuntu:latest   "bash"    2 hours ago     Exited (0) 2 hours ago               compassionate_beaver


 ● -it 옵션으로 ubuntu 리눅스 터미널로 들어갑시다.
-it 옵션과 함께 쉘을 지정해 줘야 됩니다. 마지막 /bin/bash로 했습니다.

[sidepower@localhost ~]$ docker run -it ubuntu:latest /bin/bash

root@fcf3823a98ab:/# 
ubuntu 터미널 들어왔네요. 
    정말 ubuntu안으로 들어왔는지 확인해 볼게요.
root@fcf3823a98ab:/# cat /etc/*release*

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
root@fcf3823a98ab:/# exit
exit
[sidepower@localhost ~]$


 ● 컨테이너 목록 확인
Exited로 3개 모두 종료되었지만 목록에서 사라지지 않고 계속 표시됩니다.
이처럼 컨테이너가 실행되면 -a 옵션으로 실행된 컨테이너를 모두 확인할수 있습니다.
[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS                          PORTS     NAMES
fcf3823a98ab   ubuntu:latest   "/bin/bash"   4 minutes ago   Exited (0) About a minute ago             elated_antonelli
d0eb00394720   ubuntu:latest   "bash"        5 minutes ago   Exited (0) 5 minutes ago                  clever_morse
5344e4b92780   ubuntu:latest   "bash"        3 hours ago     Exited (0) 3 hours ago                    compassionate_beaver

 ● 컨테이너 종료시 목록에서도 삭제되게 --rm 옵션 사용
[sidepower@localhost ~]$ docker run --rm -it ubuntu:latest /bin/bash
root@3b868d4fb06f:/# cat /etc/issue
Ubuntu 20.04.2 LTS \n \l
root@3b868d4fb06f:/# exit
exit

 ● 컨테이너 목록 확인
--rm 옵션으로 마지막 실행된 이력은 생기지 않았습니다.
[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS                     PORTS     NAMES
fcf3823a98ab   ubuntu:latest   "/bin/bash"   6 minutes ago   Exited (0) 3 minutes ago             elated_antonelli
d0eb00394720   ubuntu:latest   "bash"        7 minutes ago   Exited (0) 7 minutes ago             clever_morse
5344e4b92780   ubuntu:latest   "bash"        3 hours ago     Exited (0) 3 hours ago               compassionate_beaver
[sidepower@localhost ~]$

 

 

 컨테이너 이름 지정 실행

이전까지는 따로 이름을 지정하지 않았죠. ㅋ

지정하지 않으면 docker에서 아무 이름이나 유일하게 자동으로 지정합니다.

name 옵션으로 내가 원하는 이름으로 해보세요.

 ● 컨테이너 --name 옵션으로 myApp 이름 지정하기
[sidepower@localhost ~]$ docker run -it --name myApp ubuntu /bin/bash
root@3b868d4fb06f:/# cat /etc/issue
Ubuntu 20.04.2 LTS \n \l

 ● 컨테이너 목록 확인
[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
c9a2afb7d38e   ubuntu    "/bin/bash"   28 seconds ago   Up 26 seconds             myApp

 

 

종료된 컨테이너 실행하기

docker start [컨테이너 이름]
 ● 컨테이너 목록 확인
[sidepower@localhost ~]$ docker ps -a

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
c9a2afb7d38e   ubuntu    "/bin/bash"   2 minutes ago   Exited (0) 6 seconds ago             myApp

 ● Exited 종료된 컨테이너 시작하기
[sidepower@localhost ~]$ docker start myApp

myApp

 ● 컨테이너 목록 확인
Up은 기동되어 있다는 표시입니다.

[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
c9a2afb7d38e   ubuntu    "/bin/bash"   3 minutes ago   Up 6 seconds             myApp

 

 

 컨테이너 종료하기

docker stop [컨테이너 이름]
 ● 컨테이너 목록 확인
[sidepower@localhost ~]$ docker ps -a

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
c9a2afb7d38e   ubuntu    "/bin/bash"   3 minutes ago   Up 6 seconds             myApp

 ● 컨테이너 종료하기
[sidepower@localhost ~]$ docker stop myApp

myApp

 ● 컨테이너 목록 확인
[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
c9a2afb7d38e   ubuntu    "/bin/bash"   3 minutes ago   Exited (0) 4 seconds ago             myApp

 

 

 컨테이너 재시작하기

docker restart [컨테이너 이름]
 ● 컨테이너 재시작하기
[sidepower@localhost ~]$ docker restart myApp

myApp

 ● 컨테이너 목록 확인
[sidepower@localhost ~]$ docker ps -a

CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
c9a2afb7d38e   ubuntu    "/bin/bash"   3 minutes ago   Up 5 seconds             myApp

 

 

 컨테이너 접속하기

위에서는 run으로 실행할때 -it 옵션으로 /bin/bash쉘을 지정해서 컨테이너안으로 들어갔었죠.

attach 명령어를 통해 이미 실행된 컨테이너 내부로 바로 들어갈수 있습니다.

myApp 컨테이너는 ubuntu 리눅스이기때문에 /bin/bash로 접속해서 명령어를 실행할수 있습니다.

docker attach [컨테이너 이름]
[sidepower@localhost ~]$ docker attach myApp
root@c9a2afb7d38e:/# cat /etc/issue
Ubuntu 20.04.2 LTS \n \l

 

 

 외부에서 컨테이너 내부 명령어 실행하기

docker exec [컨테이너 이름] [명령어] [명령어 인자..]

도커 명령어중에 최고 잘 만든거 같아요.

운영중에 자주 사용하게 될거 같더라고요.ㅋ

번거롭게 컨테이너에 접속하지 않아도 바로 실행 결과를 볼수 있네요.^^


[sidepower@localhost ~]$ docker exec myApp cat /etc/issue
Ubuntu 20.04.2 LTS \n \l

[sidepower@localhost ~]$

 

 

 컨테이너 삭제

docker rm 컨테이너 이름 또는 컨테이너 ID
[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED             STATUS                         PORTS     NAMES
97412a74a48e   hello-world   "/hello"   About an hour ago   Exited (0) About an hour ago             thirsty_ritchie
0771fc73e905    hello-world   "/hello"   About an hour ago   Exited (0) About an hour ago             naughty_nash

 ● 컨테이너 이름으로 삭제
[sidepower@localhost ~]$ docker rm thirsty_ritchie
thirsty_ritchie

[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
0771fc73e905    hello-world   "/hello"   About an hour ago   Exited (0) About an hour ago             naughty_nash

 ● 컨테이너 ID로 삭제
[sidepower@localhost ~]$ docker rm 0771fc73e905

0771fc73e905
[sidepower@localhost ~]$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
 

 

 

감사합니다.

반응형

댓글