본문 바로가기

Cloud Dev/Docker

4. Docker Container 기초 사용법

4.1 도커 이미지 생성

 

다음은 root 계정에서 진행한다.

 

1) 도커 엔진의 버전을 확인한다.

도커는 다양한 기능이 빠르게 업데이트 되고, 새로운 버전이 배포되므로 설치된 도커 엔진의 버전을 확인하는 것은 매우 중요하다. 버전의 차이로 도커의 중요한 기능을 사용하지 못할 수도 있기 때문이다. 새로운 PC나 서버에서 도커를 사용한다면 먼저 버전을 하는 것이 좋다.

 

도커 엔진을 확인하는 명령어는 다음과 같다.

# docker version

Client: Docker Engine - Community
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:48:02 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.14
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.15
  Git commit:       87a90dc
  Built:            Thu Mar 24 01:45:53 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

2) 도커 엔진의 상태를 확인한다.

# systemctl status docker

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendo>
     Active: active (running) since Mon 2022-04-11 15:56:46 KST; 1min 5>
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 674 (dockerd)
      Tasks: 8
     Memory: 104.6M
     CGroup: /system.slice/docker.service
             └─674 /usr/bin/dockerd -H fd:// --containerd=/run/containe

3) cd /var/lib/docker/overlay 아래 docker image 있는지 확인한다.

# /var/lib/docker/overlay2# ls -l

합계 16
drwx--x--- 3 root root 4096  4월 11 00:23 38e160b4319e9c3e0fba6ef5d07e3877b02cb824483b3c62275ac4dc550a133c
drwx--x--- 4 root root 4096  4월 11 00:23 93a4ce0b2a29dfc390028bc38825b0c7fd744294b81b77c5a31819560a2a6b32
drwx--x--- 4 root root 4096  4월 11 00:23 93a4ce0b2a29dfc390028bc38825b0c7fd744294b81b77c5a31819560a2a6b32-init
drwx------ 2 root root 4096  4월 11 00:23 l

현재 도커 생성된 것들이 있는 것을 확인할 수 있는데, 해당 레이어들이 어떤 도커 이미지에 해당되는지 확인해본다.

 

4) docker image 목록 보기

# /var/lib/docker/overlay2# docker image ls

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

5) docker image 생성하기

# /var/lib/docker/overlay2# docker pull nginx:latest

latest: Pulling from library/nginx
c229119241af: Pull complete
2215908dc0a2: Pull complete
08c3cb2073f1: Pull complete
18f38162c0ce: Pull complete
10e2168f148a: Pull complete
c4ffe9532b5f: Pull complete
Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

docker pull 명령어를 통해 이미지를 생성해준다. 그러면 이렇게 컨테이너 안에 5개의 이미지가 들어 있다는 것을 알 수 있다.

 

6) cd /var/lib/docker/overlay 아래 docker image 있는지 확인한다

/var/lib/docker/overlay2# ls -l

합계 40
drwx--x--- 4 root root 4096  4월 11 16:02 1269bbe43f3c2b6fff3290adf72b758eac94dfbe247e0abd21ca169a2e699f9c
drwx--x--- 3 root root 4096  4월 11 00:23 38e160b4319e9c3e0fba6ef5d07e3877b02cb824483b3c62275ac4dc550a133c
drwx--x--- 3 root root 4096  4월 11 16:02 48089d9607e4436969cd5191d6a1549db6f5e01836827be51887377eeb1d5783
drwx--x--- 4 root root 4096  4월 11 16:02 63d51213ba7c00201b3c492247adece67b8f8b89328eff0bff9e978b97083046
drwx--x--- 4 root root 4096  4월 11 16:02 6e432cd462fea9e49d5e491983ebd845529428162a94d03c9c87070bcd5524e4
drwx--x--- 4 root root 4096  4월 11 00:23 93a4ce0b2a29dfc390028bc38825b0c7fd744294b81b77c5a31819560a2a6b32
drwx--x--- 4 root root 4096  4월 11 00:23 93a4ce0b2a29dfc390028bc38825b0c7fd744294b81b77c5a31819560a2a6b32-init
drwx--x--- 4 root root 4096  4월 11 16:02 aae728398bed2a34a6d8cbb0708461229903583792cedb3963fe7e3930f1602d
drwx--x--- 4 root root 4096  4월 11 16:02 b8a60628d57e142ce6659279fdd1c6f2769b9ce3198fdc50ef4a40cedcfedccc
drwx------ 2 root root 4096  4월 11 16:02 l

 

4.2 컨테이너 생성

다음은 root 계정이 아닌 계정에서 진행한다.

 

nginx 이미지로 컨테이너를 생성할 것이다.

 

1)  먼저, 현재 계정에서 설치할 Nginx 버전을 찾는다.

guru@docker-ubuntu:~$ docker search nginx

NAME                                              DESCRIPTION                          STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        16609     [OK]
bitnami/nginx                                     Bitnami nginx Docker Image                      121                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   40
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   17                   [OK]
rancher/nginx-ingress-controller                          10
ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4
bitnami/nginx-ldap-auth-daemon                          3
vmware/nginx                          2
bitnami/nginx-exporter

......

그러면 이렇게 설치 가능한 버전이 여러 개 나오는 것을 볼 수 있다.  유튜버 강사님을 따라 기본적인 Official 버전으로 진행할 것이다.

 

2) 현재 계정에서 docker image 목록 보기

guru@docker-ubuntu:~$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    12766a6745ee   12 days ago    142MB
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

이전에 만든 hello-world 이미지와 방금 내려 받은 nginx 이미지가 존재하는 것을 확인할 수 있다.

 

3) 컨테이너 생성하기 & 컨테이너를 외부에 노출

guru@docker-ubuntu:~$ docker run --name web -d -p 80:80 nginx
b576fdeefeaf21167af9d88eced67292092069a17bab8b24a643a0401e87288f

 

*run: 실행, 구동

*-name: 컨테이너 이름을 정해서 적음

*-d: 백그라운드 데몬으로 돌림을 의미

*-p: 외부포트 8080을 받아서 내부의 80으로 전달함

*nginx: 위에서 'docerk search nginx를 통해 찾은 우리가 사용할 이미지 name

 

단 한줄의 docker 명령어인 run으로 컨테이너를 생성한다.

 

6) curl 명령어로 localhost 접속 결과

guru@docker-ubuntu:~$ curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installedand
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

nginx 웹 페이지가 나타남을 볼 수 있다.

 

 

 

4.3 컨테이너 목록 확인

1) docker ps : 정지되지 않은 컨테이너 출력

guru@docker-ubuntu:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                               NAMES
b576fdeefeaf   nginx     "/docker-entrypoint.…"   44 seconds ago   Up 42 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

docker ps 명령어는 정지되지 않은 컨테이너만 출력한다.

즉, exit를 사용해 빠져나온 컨테이너는 정지 상태이기 때문에 컨테이너 목록에 출력되지 않지만, 

Ctrl+P, Q를 입력해 빠져 나온 컨테이너는 실행 중이기 때문에 컨테이너 목록에 출력된다.

 

*Ctrl + P, Q 명령어: 우분투 컨테이너를 생성 한 뒤, 컨테이너에 들어왔다가 다시 host OS로 나가고 싶은 경우 차례로 누른다.

 

2) docker ps -a : 정지된 컨테이너를 포함한 모든 컨테이너 출력

 

 

 

4.4 컨테이너 삭제

1) docker를 stop시킨다.

guru@docker-ubuntu:~$ docker stop web
web

2) curl 명령어로 localhost 접속 결과: fail

guru@docker-ubuntu:~$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: 연결이 거부됨

3) 컨테이너 삭제

해당 컨테이너를 삭제 한 거지, 해당 이미지인 web을 지운 것은 아니다.

이미지를 지우는 명령어는 따로 존재한다.

guru@docker-ubuntu:~$ docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Deleted: sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619
Deleted: sha256:3ea962f6f388096ab9798790d363fc6f9c779c924a5eddf5c699d8da080114f7
Deleted: sha256:091a2aef7242e42505b69f1ad027d6a442cfce2403e260ac914f0fd6cc2d275f
Deleted: sha256:4e72a31f1cd6fd655cc0826c91e886967b6e965e13ac21f31f9f66c27a3b7732
Deleted: sha256:e3d1cdf9772a260b3e81a22c1940d63ac45dfe67720f78f00ca73834d9498934
Deleted: sha256:af40da71a8618ea9cbcdc333d5e60bd5b6df820f0d07a55f7c9a1c21fd930095
Deleted: sha256:608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce

 

4) 이미지 삭제

guru@docker-ubuntu:~$ docker rm image nginx

혹은 rm image = rmi 로 줄여서 써도 무방하다.

 

5개의 레이어로 구성된 direcotry를 보면 이미지가 지워진 것을 확인할 수 있다.

root@docker-ubuntu:/var/lib/docker/overlay2# ls
38e160b4319e9c3e0fba6ef5d07e3877b02cb824483b3c62275ac4dc550a133c
93a4ce0b2a29dfc390028bc38825b0c7fd744294b81b77c5a31819560a2a6b32
93a4ce0b2a29dfc390028bc38825b0c7fd744294b81b77c5a31819560a2a6b32-init
l

 

4.5 컨테이너 애플리케이션 구축

 

대부분의 서비스는 단일 프로그램으로 동작하지 않는다. 여러 에이전트나 데이터베이스 등과 연결되어 완전한 서비스로서 동작하는 것이 일반적이다. 

 

이런 서비스를 컨테이너화 할 때 여러 개의 애플리케이션을 한 컨테이너에 설치 할 수도 있다. 

그런데, 한 컨테이너에 애플리케이션 하나만 동작시키면 컨테이너 간의 독립성을 보장함과 동시에 애플리케이션의 버전관리, 소스코드 모듈화 등이 더욱 쉬워진다.

 

1) All-in-one 컨테이너

All-in-one 컨테이너 데이터베이스
웹 서버

2) 분리된 애플리케이션 컨테이너

분리된 컨테이너 데이터베이스
웹 서버

'Cloud Dev > Docker' 카테고리의 다른 글

5. Dockerfile  (0) 2022.04.12
3. 도커 컨테이너(Docker Container)  (0) 2022.04.11
2. 도커 이미지(Docker image)  (0) 2022.04.11
1. Docker  (0) 2022.04.11