코알못

[Docker] 구성 및 기본 명령어 본문

ETC

[Docker] 구성 및 기본 명령어

코린이s 2022. 3. 25. 18:24
728x90

도커의 기본 단위인 '이미지', '컨테이너' 에 대해 알아 봅시다.

이미지와 컨테이너는 1:N 관계로 아래와 같이 정의 됩니다.

  • 이미지 : 컨테이너를 생성할때 필요한 요소로 컨테이너의 목적에 맞는 바이너리와 의존성이 설치 되어 있음, 여러개의 계층으로 된 바이너리 파일로 존재
  • 컨테이너 : 호스트와 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스로 이미지는 읽기 전용으로 사용하여 변경 사항은 컨테이너 계층에 저장
    • -> 컨테이너에서 무엇을 하든 이미지는 영향 받지 않음 

도커 파일을 bulid 하면 도커 이미지가 되며, 도커 이미지를 run 하면 도커 컨테이너가 됩니다.

도커 이미지 이름의 경우 아래와 같이 지정할 수 있으며

[저장소이름]/[이미지이름]/[이미지태그]

저장소 이름 생략시 기본 저장소 '도커 허브'로 인식

이미지 태그 생략시 최신 리비전을 가리키는 'lastest'로 인식 됩니다.

이미지 저장소의 경우 public, private 저장소가 있으며

public 의 경우 공개형으로 누구나 이미지를 가져다가 쓸 수 있으며 예로 quay, docker hub 가 있다.

private 의 경우 비공개형으로 보통 기업내에서 만들어 사용시에 이용하며 예로 aws ecr, docker registry 가 있다.

도커의 라이프 사이클의 경우 매우 복잡하나 간단하게 표현하면 아래와 같다.

이제 도커에서 사용하는 명령어를 보자!

아래와 같이 컨테이너를 시작 할 수 있으며 만약 로컬에 이미지가 없다면 도커 엔진이 도커 저장소로 부터 이미지를 pull 한다.

// 컨테이너 생성 및 시작 
$ docker run [image]
// 컨테이너 생성
$ docker create [image]
// 컨테이너 시작 
$ docker start [container]
// 도커 실행중인 컨테이너 목록
$ docker ps 
// 도커 전체 컨테이너 목록
$ docker ps -a

실습을 통해 명령어를 익혀보자!

// run 을 통한 nginx 이미지 생성 및 실행 , 종료

$ docker run nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
ae13dd578326: Pull complete
6c0ee9353e13: Pull complete
dca7733b187e: Pull complete
352e5a6cac26: Pull complete
9eaf108767c7: Pull complete
2022/03/25 08:10:56 [notice] 1#1: start worker process 32
2022/03/25 08:10:56 [notice] 1#1: start worker process 33
2022/03/25 08:10:56 [notice] 1#1: start worker process 34
2022/03/25 08:10:56 [notice] 1#1: start worker process 35
2022/03/25 08:10:56 [notice] 1#1: start worker process 36
exit

프로세스 확인

// 실행중이 아니므로 안나옴
$ docker ps
// 실행중으로 종료 되었다고 나옴
$ docker ps -a
CONTAINER ID   IMAGE                                 COMMAND                  CREATED              STATUS                      PORTS                                                                                                                                  NAMES
163bad5d12a5   nginx                                 "/docker-entrypoint.…"   About a minute ago   Exited (0) 32 seconds ago                                                                                                                                          serene_benz

// create start를 통한 nginx 이미지 생성 및 실행 , 종료

// 도커 컨테이너 아이디 리턴
$ docker create nginx
abcdsdsadasdasdasdasdsdsadasd
// 도커 ID, Name 확인 (12 자리로 ID 표기되며, 이름도 자동으로 생성)
$ docker ps -a
CONTAINER ID   IMAGE                                 COMMAND                  CREATED             STATUS                     PORTS                                                                                                                                  NAMES
abcdsdsadasd   nginx                                 "/docker-entrypoint.…"   9 seconds ago       Created                                                                                                                                                           happy_germain
163bad5d12a5   nginx                                 "/docker-entrypoint.…"   3 minutes ago       Exited (0) 2 minutes ago                                                                                                                                          serene_benz
// 도커 name 으로 기동 
$ docker start happy_germain
// 프로세스 확인
$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED             STATUS             PORTS                                                                                                                                  NAMES
abcdsdsadasd   nginx                                 "/docker-entrypoint.…"   38 seconds ago      Up 4 seconds       80/tcp

컨테이너를 run으로 시작시 여러 옵션을 줄 수 있으며 아래와 같다.

$ docker run \            -- docker 시작
-i -t \                   -- 표준 입력/출력 사용, 가상 터미널 할당
--rm \                    -- 컨테이너 실행 종료후 자동 삭제
-d \                      -- 백그라운드 모드로 시작 
--name docker-corin \     -- 컨테이너 이름 지정
-p 80:80 \                -- 컨테이너간 포트 바인딩
-v /test/docker:/docker \ -- 컨테이너간 볼륨 바인딩
nginx:last \              -- 실행할 이미지
ls                        -- 컨테이너 내 실행 명령어

실습을 통해 손에 익혀보자!

ubuntu 이미지를 가져와서 설치하며 정상적으로 pull 이 되었다.

$ docker run ubuntu:focal
Unable to find image 'ubuntu:focal' locally
focal: Pulling from library/ubuntu
4d32b49e2995: Pull complete
Digest: sha256:bea6d19168bbfd6af8d77c2cc3c572114eb5d113e6f422573c93cb605a0e2ffb
Status: Downloaded newer image for ubuntu:focal

확인 해보면 실행중인 컨테이너 항목에는 없으며

전체 컨테이너 목록을 보면 30초 전에 생성 되었고 기본 명령어 bash를 사용 하였으며 28초 전에 종료 되었다고 한다.

$ docker ps -a
CONTAINER ID   IMAGE                                 COMMAND                  CREATED             STATUS                      PORTS                                                                                                                                  NAMES
be2e4f954e02   ubuntu:focal                          "bash"                   30 seconds ago      Exited (0) 28 seconds ago                                                                                                                                          relaxed_easley
// 없음
$ docker ps

이유는 bash 명령어의 경우 표준 입력 필요로 하나 할 수 없었기에 종료 된 것이다.

이럴때 -i -t 이며 옵션을 주어 run 하면 표준 입력을 받을 수 있으며 해결 가능하다.

$ docker run -i -t ubuntu:focal
root@67f0a8685f1e:/#

여러가지 명령어를 입력해본다.

root@67f0a8685f1e:/# ls -l
total 48
lrwxrwxrwx   1 root root    7 Mar 16 17:07 bin -> usr/bin
drwxr-xr-x   2 root root 4096 Apr 15  2020 boot
drwxr-xr-x   5 root root  360 Mar 25 08:30 dev
drwxr-xr-x   1 root root 4096 Mar 25 08:30 etc
drwxr-xr-x   2 root root 4096 Apr 15  2020 home
lrwxrwxrwx   1 root root    7 Mar 16 17:07 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Mar 16 17:07 lib32 -> usr/lib32
lrwxrwxrwx   1 root root    9 Mar 16 17:07 lib64 -> usr/lib64
lrwxrwxrwx   1 root root   10 Mar 16 17:07 libx32 -> usr/libx32
drwxr-xr-x   2 root root 4096 Mar 16 17:07 media
drwxr-xr-x   2 root root 4096 Mar 16 17:07 mnt
drwxr-xr-x   2 root root 4096 Mar 16 17:07 opt
dr-xr-xr-x 245 root root    0 Mar 25 08:30 proc
drwx------   2 root root 4096 Mar 16 17:09 root
drwxr-xr-x   5 root root 4096 Mar 16 17:10 run
lrwxrwxrwx   1 root root    8 Mar 16 17:07 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Mar 16 17:07 srv
dr-xr-xr-x  13 root root    0 Mar 25 08:30 sys
drwxrwxrwt   2 root root 4096 Mar 16 17:10 tmp
drwxr-xr-x  13 root root 4096 Mar 16 17:07 usr
drwxr-xr-x  11 root root 4096 Mar 16 17:09 var
root@67f0a8685f1e:/#
root@67f0a8685f1e:/# uname -a
Linux 67f0a8685f1e 5.10.104-linuxkit #1 SMP Wed Mar 9 19:05:23 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
root@67f0a8685f1e:/#
root@67f0a8685f1e:/#cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"

만약 종료 없이 나오고 싶다면 'ctrl+p+q' 를 입력하여 나오면 되고, 종료 하길 원한다면 'ctrl+c' 를 눌러서 나온다.

// ctrl+c 눌렀을시 컨테이너가 죽어 있다.
$ docker ps -a
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS                      PORTS                                                                                                                                  NAMES
67f0a8685f1e   ubuntu:focal                          "bash"                   6 minutes ago    Exited (0) 6 seconds ago                                                                                                                                           musing_haibt
// ctrl+p+q 눌렀을시 컨테이너가 살아 있다.
$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                  NAMES
f47e5be74df0   ubuntu:focal                          "bash"                   35 seconds ago   Up 34 seconds                                                                                                                                          admiring_einstein

이제 nginx 를 백그라운드로 실행 시켜 보자!

정상적으로 백그라운드로 뜬것을 확인 할 수 있으며

$ docker run -d nginx
d47a77779363b84cd185f79f79299620fec7075c2d0d12c4dd9eda6d057f121a
$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                  NAMES
d47a77779363   nginx                                 "/docker-entrypoint.…"   5 seconds ago    Up 4 seconds    80/tcp                                                                                                                                 objective_cartwright

이번에는 name 을 지정하여 띄워 보자!

정상적으로 'corin-nginx' 이름으로 뜬것을 확인 할 수 있다.

$ docker run -d --name corin-nginx nginx
9e54d599cc92a1cb6432a94c390b050188937c373f7db3685017aebd3a0b459b

$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED              STATUS              PORTS                                                                                                                                  NAMES
9e54d599cc92   nginx                                 "/docker-entrypoint.…"   5 seconds ago        Up 5 seconds        80/tcp                                                                                                                                 corin-nginx

그 다음 포트 바인딩을 이용하여 로컬의 80 포트를 컨테이너 80 포트(nginx 기본 포트)와 연결하여 nginx 를 띄워 본다.

docker run -p 80:80 -d nginx
10467971fb3e8a6125e1e4b43244f872d1f1c01a7f7f59d472449fab0d79a296
$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                  NAMES
10467971fb3e   nginx                                 "/docker-entrypoint.…"   3 seconds ago    Up 2 seconds    0.0.0.0:80->80/tcp                                                                                                                     magical_volhard

정상적으로 바인딩 되었는지 호출해보면 정상적으로 nginx 와 연결됨을 확인 할 수 있다.

$ 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 installed and
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>

이제 기본 명령어를 변경하여 컨테이너를 실행해보자!

id 라는 명령어가 실행 될 수 있도록 아래와 같이 입력하면 

컨테이너가 실행 되고 id 명령어를 호출한 결과를 리턴한뒤 종료 한다.

$ docker run ubuntu:focal id
uid=0(root) gid=0(root) groups=0(root)
$ docker ps -a
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS                      PORTS                                                                                                                                  NAMES
55985036d4ec   ubuntu:focal                          "id"                     11 seconds ago   Exited (0) 9 seconds ago                                                                                                                                           jolly_ishizaka

이제 컨테이너 상세정보를 확인한다. 이 명령어를 통해 컨테이너 이슈시 상세 정보를 확인 한다.

// 컨테이너 상세정보 확인
$ docker inspect [name or container id]
[
    {
        "Id": "10467971fb3e8a6125e1e4b43244f872d1f1c01a7f7f59d472449fab0d79a296",
        "Created": "2022-03-25T08:53:33.2276823Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,...
 ]

아래와 같이 일시 중지로 컨테이너를 일시적으로 중단 및 재개 할 수 있다.

// 컨테이너 일시 중지
$ docker pause 10467971fb3e
10467971fb3e

$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS                   PORTS                                                                                                                                  NAMES
10467971fb3e   nginx                                 "/docker-entrypoint.…"   14 minutes ago   Up 14 minutes (Paused)   0.0.0.0:80->80/tcp                                                                                                                     magical_volhard

// 컨테이너 재개
$ docker unpause 10467971fb3e
10467971fb3e

$ docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                  NAMES
10467971fb3e   nginx                                 "/docker-entrypoint.…"   14 minutes ago   Up 14 minutes   0.0.0.0:80->80/tcp                                                                                                                     magical_volhard

컨테이너 종료 관련 명령어는 아래와 같다.

// 컨테이너 정상적 종료 (SIGTERM 시그널 전달)
$ docker stop [container]
// 컨테이너 강제 종료 (SIGKILL 시그널 전달)
$ docker kill [container]
// 모든 컨테이너 종료
$ docker stop $(docker ps -a -q)

모튼 컨테이너 종료 실습을 진행해본다.

아래 명령어 입력시 모든 컨테이너의 아이디를 가져오며 

$ docker ps -a -q
55985036d4ec
10467971fb3e
9e54d599cc92
d47a77779363
f47e5be74df0
67f0a8685f1e
be2e4f954e02
cf13e44f664c
163bad5d12a5
3fb9db0a8d30

전체 종료후 실행 중인 프로세스 항목이 없는것을 확인 할 수 있다.

$ docker stop $(docker ps -a -q)
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

그 다음 아래와 같이 컨테이너를 삭제 할 수 있으며 실행 중인 컨테이너는 삭제할 수 없어 -f 옵션을 이용하여 강제적으로 종료후 삭제 한다.

여기서 팁은 container id 를 전체적으로 입력 하지 않고 일부만 입력 하여도 도커가 알아서 구분하여 삭제한다.

$ docker run -d nginx
91b40b82ad667fa64129d7a5ccb23a58d697e26c4ee845c9f63f3797c9aaf989
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
91b40b82ad66   nginx     "/docker-entrypoint.…"   16 seconds ago   Up 15 seconds   80/tcp    silly_hofstadter
$ docker rm 91b40b82ad66
Error response from daemon: You cannot remove a running container 91b40b82ad667fa64129d7a5ccb23a58d697e26c4ee845c9f63f3797c9aaf989. Stop the container before attempting removal or force remove
$ docker rm -f 91b40b8
91b40b8
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

마지막으로 생성된 도커 컨테이너 모두를 삭제하는 명령어를 실습해본다.

아래와 같이 전체 컨테이너 목록 확인시 리스트가 없음을 확인 할 수 있다.

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
55985036d4ec1a1a85f2c006f9a00dfc6f9e4930dbdde09e4d322684ffec92a8
10467971fb3e8a6125e1e4b43244f872d1f1c01a7f7f59d472449fab0d79a296
9e54d599cc92a1cb6432a94c390b050188937c373f7db3685017aebd3a0b459b
d47a77779363b84cd185f79f79299620fec7075c2d0d12c4dd9eda6d057f121a
f47e5be74df0bd022fd2ed1907c66e64977fdd69df835c45c3a31d08733a845a
67f0a8685f1ea3f2ca9a7c28bb1f23f01a2b2bb7b8774d9a74f74f29bada268f
be2e4f954e028191bd6cc2b6ed140f3c36ff90b61b216755868eaed3e0aec53d
cf13e44f664cdeafd25d18f15d85dcd96cf1d259e4c44609962bbecedc4981bf
163bad5d12a5eb5cd3f911df822514bde054a5ec1cdcb8771b93221e4eb67964
3fb9db0a8d30a200165e46e9c5fe0eff0122030aedd815ac332e06706cc46354

Total reclaimed space: 3.105MB
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
728x90

'ETC' 카테고리의 다른 글

[Docker] 네트워크  (0) 2022.03.26
[Docker] 설정 방법 및 실행중인 컨테이너 접속  (0) 2022.03.25
[Docker] 설치  (0) 2022.03.25
[Kubernetes & Docker] 무엇인가?  (0) 2022.03.25
5분 안에 구축하는 APIDoc (API 규격서)  (0) 2022.02.27
Comments