컨테이너와 Docker (2) - 도커 생성 중지 삭제

Share

Last Updated on 1월 21, 2024 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 도커 컴포넌트, 컨테이너의 namespace, cgroups, 도커 이미지의 다운로드, 도커 이미지 실행(컨테이너 구동), 컨테이너 중지, 삭제 등에 대해서 확인해보도록 하겠습니다. 

이전 포스팅 글


이전 포스팅 기준으로 docker 컨테이너의 구동 등의 모든 작업은 devops 일반 계정을 통해 진행하였으며 포스팅 내에서 Docker 와 도커 의 표현을 혼용하여 사용하였습니다.

또한 앞으로 개념적인 설명 내용은 책의 내용을 참조하였습니다.
(완벽한 IT 인프라 구축을 위한 Docker 2판)
                 

1. Docker 컴포넌트

Docker 는 몇개의 컴포넌트로 구성되어 있습니다. 핵심 기능이 되는 Docker Engine 을 중심으로 컴포넌트를 조합하여 애플리케이션 실행 환경이 구축되게 됩니다. 도커는 커맨드라인(터미널,명령줄) 에서 조작(CLI) 하는 것이 특징이며 중심입니다.


1-1 Docker Engine

도커 이미지를 생성하고 컨테이너를 기동 시키기 위한 Docker의 핵심 기능이며 Docker 명령의 실행이나 Dockerfile에 의한 이미지 생성 기능을 지원합니다


1-2 Docker Registry

Docker Registry 는 컨테이너의 바탕이 되는 도커 이미지를 공개 및 공유하기 위한 레지스트리 기능입니다. Docker의 공식 레지스트리 서비스인 Docker Hub 도 이 Docker Registry 를 사용하고 있습니다.


1-3 Docker Compose

Docker Compose 는 여러 개의 컨테이너 구성 정보를 코드로 정의하고, 명령을 실행함으로써 애플리케이션의 실행 환경을 구성하는 컨테이너들을 일원 관리하는 위한 툴 입니다.


1-4 Docker Machine

Docker Machine 은 로컬 호스트용인 Virtualbox를 비롯하여 Amazon Web Services EC2 나 MS Azure 와 같은 클라우드 환경에서 Docker의 실행 환경을 명령으로 자동 생성하기 위한 툴 입니다.


1-5 Docker Swarm

Docker Swarm 은 여러 Docker 호스트를 클러스터화 하기 위한 툴 입니다 Docker Swarm 에서는 클러스터를 관리하거나 API를 제공하는 역할은 manager가 , Docker 컨테이너를 실행하는 역할은 Node 가 담당을 하게 됩니다. 또한 유사/동일한 기능으로 오픈소스인 Kubernetes 도 이용할 수 있습니다.
                 

2. namespace

Docker 는 컨테이너라는 독립적인 환경을 만들고, 그 컨테이너를 구획화하여 애플리케이션의 실행 환경을 만들게 됩니다. 이런 컨테이너를 구획하는 기술을 Linux 커널의 namespace 라는 기능을 사용하게 됩니다.

namespace 이란 한 덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고 쉽게 참조할 수 있게 하는 개념입니다. 이름과 연결된 실체는 그 이름이 어떤 이름 공간에 속해 있는지 고유하게 정해집니다. 그래서 이 이름공간이 다르면 동일한 이름이라도 다른 실체로 처리가 되게 됩니다.  

Linux 커널의 namespace 기능은 리눅스의 오브젝트에 이름을 붙임으로써 아래의 6개의 독립된 환경을 구축할 수 있습니다.


2-1 PID namespace

PID 란 Linux 에서 각 프로세스 할당된 고유한 ID 를 의미합니다. PID namespace 는 PID 와 프로세스를 격리시킵니다. namespace 가 다른 프로세스끼리는 서로 액세스 할 수 없습니다.


2-2 Network namespace

Network namespace 는 네크워크 디바이스,IP 주소, 포트 번호, 라우팅 테이블, 필터링 테이블 등과 같은 네트워크 리소스를 격리된 namespace 마다 독립적으로 가질 수 있습니다. 이 기능을 사용하면 호스트 OS 상에서 사용 중인 포트가 있더라도 컨테이너 안에서 동일한 포트를 사용할 수 있습니다.


2-3 UID namespace

UID namespace는 UID(사용자 ID), GID(그룹 ID) 를 namespace 별로 독립적으로 가질 수 있습니다. namespace 안과 호스트 OS상의 UID/GID가 서로 연결되어 이름공간 안과 밖에서 서로 다른 UID/GID를 가질 수 있게 됩니다.

예를 들어 namespace 안에서는 UID/GID가 0 인 root 사용자를, 호스트 OS 상에서는 일반 사용자로서 취급할 수 있습니다. 이것은 namespace 안에서 관리자 계정은 호스트 OS 에 대해서 관리 권한을 일절 갖지 않는 것을 의미하게 됩니다.


2-4 MOUNT namespace

Linux 에서 파일 시스템을 사용하기 위해서는 볼륨 또는 디스크의 마운트가 필요 합니다. 마운트란 컴퓨터 OS 에 연결된 기기나 기억장치 또는 저장장치를 OS에 인식시켜서 사용이 가능한 상태로 만드는 것을 의미합니다.

Mount namespace 는 마운트 조작을 하면 namespace 에서 격리된 파일 시스템 트리를 만들게 됩니다. 다른 namespace 기능과 마찬가지로 namespace 안에서 수행한 마운트는 호스트 OS나 다른 namespace 에서 엑세스 할 수 없게 되어 있습니다.


2-5 UTS namespace

UTS namespace 는 namespace 별로 호스트명이나 도메인명을 독자적으로 가질 수 있게 합니다.


2-6 IPC namespace

IPC namespace 는 프로세스 간의 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있도록 합니다. IPC는 System V 프로세스 간의 통신 오브젝트라고 하는 공유 메모리나 세마포어(Semaphore) 또는 메세지 큐를 말합니다.

세마포어(Semaphore)란 프로세스가 요구하는 자원 관리에 이용되는 베타적인 장치이며, 메세지 큐란 여러 프로세스 간에서 비동기 방식 통신을 할때 사용되는 큐잉(Queuing) 장치입니다.


Docker 는 이러한 namespace 장치를 이용하여 호스트 상에서 컨테이너를 가상적으로 격리시키게 됩니다. Docker 를 사용할 때는 특별히 의식할 필요는 없지만 Docker의 구조를 이해하기 위해서는 내용을 이해할 필요는 있습니다.
                

3. cgroups

Docker 에서는 물리 머신 상의 자원을 여러 컨네이너가 공유하여 작동하게 됩니다. 이때 리눅스는 커널 기능인 'control groups(cgroups)' 기능을 사용하여 자원의 할당 등을 관리하게 됩니다. 

Linux에서는 프로그램을 프로세스로 실행하게 됩니다. 프로세스는 하나 이상의 스레드를 가질 수 있습니다. cgroups 는 프로세스와 스레드를 그룹화하여, 그 그룹안에 존재하는 프로세스와 스레드의 대한 관리를 수행하기 위한 기능입니다.

예를 들어 호스트 OS의 CPU나 메모리와 같은 자원을 제한함으로써 특정 컨테이너가 호스트 OS의 자원을 모두 사용해 버려서 다른 컨테이나 호스트OS 에서 동작하는 다른 애플리케이션에 영향을 주는 일을 방지하게 됩니다.


cgroups 로 관리할 수 있는 주요 기능으로 아래와 같습니다.

cpu : cpu 사용량을 제한
cpuacc : cpu 사용량 통계 정보를 제공
cupset : cpu 나 메모리 배치를 제어
memory : 메모리나 스왑 사용량을 제한
devices : 디바이스에 대한 액세스 허가 거부
freezer : 그룹에 속한 프로세스 정지/재개
net_cls : 네트워크 제어 태크를 부가
blkio : 블록 디바이스 입출력량 제어


cgroups 는 계층 구조를 사용하여 프로세스를 그룹화하여 관리할 수 있습니다. 예를 들어 사용자 애플리케이션 과 서버와 같은 데몬 프로세스를 나눠 각각 그룹에 CPU 사용량을 할당할 수 있으며 cgroups 의 부모 자식 관계에서는 자식이 부모의 제한된 사항을 그대로 물려받게 됩니다.
그래서 자식이 부모에 설정된 제한을 초과하는 설정을 하더라도 부모 cgroups 의 제한에 걸리게 됩니다.
             

4. Docker 컨테이너 관리

Docker 를 통해 도커 컨테이너 이미지 다운로드, 시작, 중지, 삭제 등 도커를 다루는 전반적인 내용에 대해서 확인해보도록 하겠습니다.
                      

Docker Search

기본적으로는 Public Registry(hub.docker.com) 에서 검색과 다운로드를 받게 됩니다. 먼저 도커 이미지를 검색하기 위해서는 search 명령어를 사용하면 됩니다

-- 이미지 조회
[devops@docker1 ~]$ docker search httpd
NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                   The Apache HTTP Server Project                  3559      [OK]       
centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or bui…   40                   
centos/httpd                                                                            34                   [OK]
polinux/httpd-php                       Apache with PHP in Docker (Supervisor, CentO…   5                    [OK]
solsson/httpd-openidc                   mod_auth_openidc on official httpd image, ve…   2                    [OK]
hypoport/httpd-cgi                      httpd-cgi                                       2                    [OK]
salim1983hoop/httpd24                   Dockerfile running apache config                2                    [OK]
dariko/httpd-rproxy-ldap                Apache httpd reverse proxy with LDAP authent…   1                    [OK]
manageiq/httpd                          Container with httpd, built on CentOS for Ma…   1                    [OK]
publici/httpd                           httpd:latest                                    1                    [OK]
dockerpinata/httpd                                                                      1                    
lead4good/httpd-fpm                     httpd server which connects via fcgi proxy h…   1                    [OK]
clearlinux/httpd                        httpd HyperText Transfer Protocol (HTTP) ser…   1                    
inanimate/httpd-ssl                     A play container with httpd, ssl enabled, an…   1                    [OK]
jonathanheilmann/httpd-alpine-rewrite   httpd:alpine with enabled mod_rewrite           1                    [OK]
centos/httpd-24-centos8                                                                 1                    
appertly/httpd                          Customized Apache HTTPD that uses a PHP-FPM …   0                    [OK]
amd64/httpd                             The Apache HTTP Server Project                  0                    
interlutions/httpd                      httpd docker image with debian-based config …   0                    [OK]
e2eteam/httpd                                                                           0                    
manasip/httpd                                                                           0                    
trollin/httpd                                                                           0                    
ysli/httpd                              Httpd for DeepWeb                               0                    [OK]
manageiq/httpd_configmap_generator      Httpd Configmap Generator                       0                    [OK]
itsziget/httpd24                        Extended HTTPD Docker image based on the off…   0                    [OK]

       

Docker pull

pull 은 이미지만 다운로드를 받는 명령어입니다. 도커 이미지에 대한 검색은 위의 내용과 같이 search 를 통해 조회하면 되며 조회된 결과를 바탕으로 이미지를 다운 받으면 됩니다.

다운로드 된 컨테이너 이미지에 대한 조회는 images 로 하면 됩니다. 별도의 버전을 명시하지 않으면 이미지명:latest 인 최신 버전의 이미지(latest) 로 다운로드가 됩니다.

~]$ docker pull httpd:2.4
2.4: Pulling from library/httpd
b4d181a07f80: Pull complete 
4b72f5187e6e: Pull complete 
12b2c44d04b2: Pull complete 
ef481fc2a03a: Pull complete 
d483d945fcab: Pull complete 
Digest: sha256:3b85095d8cac6a62357b4944497ca8ea4198e210425fa7a3ccfe144089f1b12d
Status: Downloaded newer image for httpd:2.4
docker.io/library/httpd:2.4

~]$ docker images;
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
httpd        2.4       30287d899656   13 hours ago   138MB


docker 명령어에서 중간에 몇 가지 명령어(인자, 옵션)가 생략이 가능하며 pull 의 경우 image 가 생략 가능 하여 위의 예제에서는 생략하고 실행을 하였습니다.

docker [image] pull 이미지명

docker image pull 과 docker pull 은 같은 의미를 가지게 됩니다

다만 docker image 와 docker images 는 다릅니다 images 는 저장된 Docker 이미지를 확인하는 명령어입니다.

위의 예제에서는 이미지를 다운로드 받을 때 버전을 2.4 라고 명시하여서 다운로드를 진행하였으며 이렇게 다운로드가 완료된 Docker 이미지를 로컬 캐시 라고 부릅니다.
          

Docker run/ps

run 은 기본적인 커맨드이면서 가장 빈번하고 자주 사용될 명령어입니다. 의미 그대로 도커 이미지를 실행하여 컨테이너로 구동하게 하는 명령어입니다.

위에서 다운로드 받은 도커 이미지 파일을 실행하기 위해서는 아래와 같이 run 을 통해 실행을 하면 됩니다

[devops@docker1 ~]$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
httpd        2.4       30287d899656   3 days ago   138MB

[devops@docker1 ~]$ docker run httpd:2.4
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Sat Jun 26 11:55:47.673102 2021] [mpm_event:notice] [pid 1:tid 140177948288128] AH00489: Apache/2.4.48 (Unix) configured -- resuming normal operations
[Sat Jun 26 11:55:47.673299 2021] [core:notice] [pid 1:tid 140177948288128] AH00094: Command line: 'httpd -D FOREGROUND'


[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED          STATUS          PORTS     NAMES
79c86f56eb4a   httpd:2.4   "httpd-foreground"   29 seconds ago   Up 23 seconds   80/tcp    vigorous_sinoussi


먼저 run 의 경우도 위에서 설명한 것과 마찬가지로 container 라는 명령어 인자가 생략이 가능 합니다 그래서 docker container run 과 docker run 은 같은 의미입니다.

다운로드 된 이미지(로컬 캐시) 이름과 태그를 확인하고 run 을 통해 수행하였습니다. 기본적으로 아무런 옵션 인자 값 없이 실행하게 되면 컨테이너 이름은 랜덤하게 지정되어 구동되게 됩니다 예제에서는 vigorous_sinoussi 으로 기동되었습니다. 그리고 기본적으로 실행하면 foreground 모드로 실행됩니다.

그리고 뒤에서 설명할 stop 으로 정지된 컨테이너는 docker ps 로는 확인되지 않습니다 이럴 경우 docker ps -a 를 통해서 실행 중인 컨테이너 와 정지된 컨테이너 모두를 확인할 수 있습니다.

foreground 모드로 실행하게 되면 화면에서 실행 내용과 로그내용이 출력 되기 때문에 디버깅이나 문제 원인 추척 등을 위해서 확인할 수 있어서 좋지만 해당 터미널 또는 세션을 사용하기가 어렵습니다 그래서 보통은 background 모드로 실행하면 되며 -d 를 통해서 실행하면 됩니다.

[devops@docker1 ~]$ docker run -d --name myapache1 httpd:2.4
10d74e00f0c4250b7d74fdc0176c45675ee20e4d1077368ff796eca88b96c2b7


[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED              STATUS          PORTS     NAMES
10d74e00f0c4   httpd:2.4   "httpd-foreground"   13 seconds ago       Up 8 seconds    80/tcp    myapache1
07bd5e8794c2   httpd:2.4   "httpd-foreground"   About a minute ago   Up 58 seconds   80/tcp    vigorous_sinoussi



처음 foreground 로 실행한 컨테이너와 이름을 명시적으로 지정하여 기동한 컨테이너 2개가 확인되며, apache 컨테이너의 기본 웹 페이지도 접속되는지 확인해보겠습니다.

[devops@docker1 ~]$ curl http://172.17.0.2
<html><body><h1>It works!</h1></body></html>

[devops@docker1 ~]$ curl http://172.17.0.3
<html><body><h1>It works!</h1></body></html>


뒤에서 설명을 추가로 하겠지만 docker 는 기본적으로 172.17.0.0/16 인 B Class 를 사용하게 됩니다. 172.17.0.1 은 GW 로 사용되며 컨테이너는 2 부터 할당됩니다. 조회를 하면 알 수 있지만 조회하지 않고 대략 적으로 추측해도 첫 번째 가동한 컨테이너에는 172.17.0.2 그 다음은 172.17.0.3 이 된 다는 건 유추할 수 있습니다.

[devops@docker1 ~]$ ip addr show docker0
6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:b2:9b:e3:2a brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 <------------
       brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:b2ff:fe9b:e32a/64 scope link 
       valid_lft forever preferred_lft forever


그리고 foreground 모드로 실행한 세션에서는 접속시 아래와 같이 access.log 내용이 출력 되게 됩니다.

[devops@docker1 ~]$ docker run httpd:2.4
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Sat Jun 26 12:40:23.446705 2021] [mpm_event:notice] [pid 1:tid 139828930823296] AH00489: Apache/2.4.48 (Unix) configured -- resuming normal operations
[Sat Jun 26 12:40:23.446797 2021] [core:notice] [pid 1:tid 139828930823296] AH00094: Command line: 'httpd -D FOREGROUND'
172.17.0.1 - - [26/Jun/2021:12:58:41 +0000] "GET / HTTP/1.1" 200 45
172.17.0.1 - - [26/Jun/2021:13:08:10 +0000] "GET / HTTP/1.1" 200 45
172.17.0.1 - - [26/Jun/2021:13:08:11 +0000] "GET / HTTP/1.1" 200 45
172.17.0.1 - - [26/Jun/2021:13:08:11 +0000] "GET / HTTP/1.1" 200 45
172.17.0.1 - - [26/Jun/2021:13:08:11 +0000] "GET / HTTP/1.1" 200 45

         

Docker exec

exec 는 컨테이너에 명령문을 수행할 수 있는 기능으로 먼저 간단하게 호스트OS 에서 exec 를 통해서 컨테이너 안에서 명령어를 수행할 수 있게 됩니다.

-- 호스트 정보
[devops@docker1 ~]$ cat /etc/centos-release
\S
Kernel \r on an \m

CentOS Linux release 7.9.2009 (Core)


-- 컨테이너 ID 확인
[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED              STATUS          PORTS     NAMES
10d74e00f0c4   httpd:2.4   "httpd-foreground"   13 seconds ago       Up 8 seconds    80/tcp    myapache1
07bd5e8794c2   httpd:2.4   "httpd-foreground"   About a minute ago   Up 58 seconds   80/tcp    vigorous_sinoussi


-- 컨테이너 에 명령어 수행을 전달
[devops@docker1 ~]$ docker exec 07bd5e8794c2 cat /etc/issue
Debian GNU/Linux 10 \n \l

[참고]exec  뒤에는 컨테이너ID 나 컨테이너 명을 입력합니다.


위와 같이 docker 수행한 명령어는 컨테이너에서 수행된 결과임을 확인할 수 있습니다 다만 컨테이너의 특성을 설명하면서 기술되었던 컨테이너는 경량화 되어 있기 때문에 호스트 OS 만큼의 명령어를 가지고 있지 않은 경우가 대부분입니다.

그래서 지금의 예제에서 사용한 컨테이너 이미지도 최대한 경량화를 위해서 필요한 명령어와 라이브러리만 포함된 상태입니다 아래와 같이 조회를 하게 되면 없는 컨테이너내 없는 명령어 임으로 에러가 발생되게 됩니다.

[devops@docker1 ~]$ docker exec 07bd5e8794c2 ifconfig
OCI runtime exec failed: exec failed: container_linux.go:380
: starting container process caused: 
exec: "ifconfig": executable file not found in $PATH: unknown


[devops@docker1 ~]$ docker exec 07bd5e8794c2 ip addr show
OCI runtime exec failed: exec failed: container_linux.go:380
: starting container process caused: 
exec: "ip": executable file not found in $PATH: unknown


[devops@docker1 ~]$ docker exec 07bd5e8794c2 vim
OCI runtime exec failed: exec failed: container_linux.go:380: 
starting container process caused: 
exec: "vim": executable file not found in $PATH: unknown

[참고] 가로 길이를 위해서 개행 되어 있습니다.


exec 명령어 사용 중에 보통적으로 사용하는 패턴은 bash 쉘을 실행하여 컨테이너 내부로 진입하여 컨테이너의 안의 내용을 살펴보거나 추가적인 패키지를 설치하거나 파일을 편집하는 등의 조작을 하는 형태입니다.

[devops@docker1 ~]$ pwd
/home/devops
[devops@docker1 ~]$ docker exec -it myapache1 /bin/bash
root@10d74e00f0c4:/usr/local/apache2# pwd
/usr/local/apache2
root@10d74e00f0c4:/usr/local/apache2# ls -al
total 36
drwxr-xr-x. 1 www-data www-data   18 Jun 23 06:37 .
drwxr-xr-x. 1 root     root       21 Jun 23 06:32 ..
drwxr-xr-x. 2 root     root     4096 Jun 23 06:36 bin
drwxr-xr-x. 2 root     root      167 Jun 23 06:37 build
drwxr-xr-x. 2 root     root       78 Jun 23 06:36 cgi-bin
drwxr-xr-x. 4 root     root       84 Jun 23 06:37 conf
drwxr-xr-x. 3 root     root     4096 Jun 23 06:36 error
drwxr-xr-x. 2 root     root       24 Jun 23 06:36 htdocs
drwxr-xr-x. 3 root     root     8192 Jun 23 06:36 icons
drwxr-xr-x. 2 root     root     4096 Jun 23 06:36 include
drwxr-xr-x. 1 root     root       23 Jun 26 12:41 logs
drwxr-xr-x. 2 root     root     8192 Jun 23 06:36 modules


이와 같이 exec -it 그리고 /bin/bash 를 사용하여 컨테이너 내부로 진입할 수 있습니다.

[참고] -i 는 input , -t 는 tty 또는 terminal 의 의미입니다.


그럼 위에서 설명한 조회 나 조작이 가능한 부분에 대해서 간단하게 살펴보겠습니다. 해당 컨테이너 에는 vi 나 vim 이 없기 때문에 echo 로 파일의 내용을 변경하여 확인해보겠습니다.

-- 먼저 index.html 의 내용을 확인 합니다.
[devops@docker1 ~]$ curl http://172.17.0.3
<html><body><h1>It works!</h1></body></html>


-- 컨테이너 내부로 진입 합니다.
[devops@docker1 ~]$ docker exec -it myapache1 /bin/bash
root@10d74e00f0c4:/usr/local/apache2# cd htdocs/
root@10d74e00f0c4:/usr/local/apache2/htdocs# ls -al
total 4
drwxr-xr-x. 2 root     root     24 Jun 23 06:36 .
drwxr-xr-x. 1 www-data www-data 18 Jun 23 06:37 ..
-rw-r--r--. 1     1000     1000 45 Jun 11  2007 index.html

-- echo 를 통해서 파일에 내용을 변경 합니다.
root@10d74e00f0c4:/usr/local/apache2/htdocs# echo "Welcome to Docker World~!" > index.html
root@10d74e00f0c4:/usr/local/apache2/htdocs# exit
exit

-- 다시 index.html 를 조회 합니다.
[devops@docker1 ~]$ curl http://172.17.0.3
Welcome to Docker World~!
   <--- 내용이 변경되었습니다


위와 같이 파일 내용이 변경된 것을 확인할 수 있습니다. 컨테이너 이미지에 따라 할 수 있는 것이 다를 수 있습니다 포스팅에서 사용하는 컨테이너는 Debian 이고 apt 가 있기 때문에 패키지도 설치를 해볼 수 있습니다.

-- 컨테이너 안으로 진입
[devops@docker1 ~]$ docker exec -it myapache1 /bin/bash

-- apt 정보 최신화
root@10d74e00f0c4:/usr/local/apache2# apt update
Get:1 http://deb.debian.org/debian buster InRelease [122 kB]
Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]      
Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:4 http://deb.debian.org/debian buster/main amd64 Packages [7907 kB]
<... 중략 ...>


-- vim 와 net-tools 패키지 설치를 시도
root@10d74e00f0c4:/usr/local/apache2# apt install vim net-tools
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  lsb-base
<... 중략 .. .>
Processing triggers for libc-bin (2.28-10) ...
-> 설치가 완료됨


-- ifconfig 조회
root@10d74e00f0c4:/usr/local/apache2# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 4534  bytes 16379745 (15.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2824  bytes 155567 (151.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


-- vi 확인
root@10d74e00f0c4:/usr/local/apache2# vi htdocs/index.html 
Welcome to Docker World~!



root@10d74e00f0c4:/usr/local/apache2# which vi
/usr/bin/vi

root@10d74e00f0c4:/usr/local/apache2# exit


이와 같이 패키지도 설치를 하는 등 컨테이너내에서는 일반 VM 과 다를 것이 없이 여러 가지를 할 수 있습니다. 물론 컨테이너가 경량화에 다수의 컨테이너의 구동을 하여 사용하기 때문에 필요치 않는 라이브러리 나 패키지 등을 설치할 필요는 없습니다.

그리고 나중에 자세히 설명하겠지만 기본적인 컨테이너는 휘발성인 특성이 있습니다, 즉 컨테이너를 종료 후 컨테이너를 삭제하게 되면 지금의 조작 및 변경사항이 반영이 되지 않는 다는 의미입니다. 그래서 뒤에 언급되겠지만 이미지의 변경사항은 COMMIT 을 데이터의 저장 관련해서는 Volume Mount 를 사용해야 할 수도 있습니다.


컨테이너 실행 명령어를 확인해보고 있기 때문에 추가적으로 격리성과 자원 공유를 간단하게 살펴보겠습니다. 컨테이너의 특징 중 대표적인 내용으로 격리성을 설명하였습니다. 컨테이너 간에는 격리된 상태로 간섭이나 영향 받지 않고 별도로 수행되는 격리화가 컨테이너의 특징입니다.


VM 과 컨테이너와 차이점으로 VM 은 하이퍼바이저 위에 다시 OS 를 구동을 하면서 CPU 나 메모리를 VM이 받지만 하이퍼바이저에 의해서 제어되거나 변환되어 사용되게 될 수 있습니다. 하지만 컨테이너는 격리화가 되어 있지만 호스트 OS 에서 바로 실행되는 만큼 호스트 OS의 커널과 자원을 그대로 공유해서 사용하게 됩니다.

-- 호스트 정보
[devops@docker1 ~]$ uname -a
Linux docker1 3.10.0-1160.el7.x86_64 #1 SMP 
x86_64 x86_64 x86_64 GNU/Linux

-- 컨테이너 정보
[devops@docker1 ~]$ docker exec -it myapache1 /bin/bash
root@10d74e00f0c4:/usr/local/apache2# uname -a
Linux 10d74e00f0c4 3.10.0-1160.el7.x86_64 #1 SMP 
x86_64 GNU/Linux


-- 호스트 정보
[devops@docker1 ~]$ cat /proc/cpuinfo  | grep "model name" | sort -u
model name      : Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz

-- 컨테이너 정보
[devops@docker1 ~]$ docker exec -it myapache1 /bin/bash
root@10d74e00f0c4:/usr/local/apache2# cat /proc/cpuinfo  | grep "model name" | sort -u
model name      : Intel(R) Core(TM) i5-9600K CPU @ 3.70GHz

[참고] 가로 길이에 의해서 개행 되어 있습니다.

호스트OS CentOS 7.9 이고 컨테이너 OS 는 Debian 이지만 커널 정보가 동일하고 CPU 정보 또한 동일 합니다 즉 호스트 OS 의 커널과 CPU 와 같은 장치를 공유해서 컨테이너는 사용되게 됩니다.
        

Docker inspect

inspect 는 단어의 의미대로 Docker Image 나 Container 정보를 보는 명령어입니다. 해당 명령어를 통해서 실행 중인 컨테이너의 Ip 정보나 다운로드된 로컬 캐시 이미지의 각 정보를 확인할 수 있습니다.

[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED       STATUS       PORTS     NAMES
10d74e00f0c4   httpd:2.4   "httpd-foreground"   3 hours ago   Up 3 hours   80/tcp    myapache1
07bd5e8794c2   httpd:2.4   "httpd-foreground"   3 hours ago   Up 3 hours   80/tcp    vigorous_sinoussi

[devops@docker1 ~]$ docker inspect myapache1 | more
[
    {
        "Id": "10d74e00f0c4250b7d74fdc0176c45675ee20e4d1077368ff796eca88b96c2b7",
        "Created": "2021-06-26T12:41:08.384094638Z",
        "Path": "httpd-foreground",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
    <.... 중략 ....>
    
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,

                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]



위와 같이 실행 중인 컨테이너에 대한 상세정보를 확인할 수 있으며 Gateway IP 및 컨테이너에서 사용중인 IP 등의 정보를 확인할 수 있습니다. 내용이 상세한 만큼 많기 때문에 -f 옵션을 통해서 별도의 항목만 선택해서 확인할 수 있습니다.

[devops@docker1 ~]$ docker inspect -f "{{ .NetworkSettings.IPAddress }}" myapache1
172.17.0.3


실행중인 컨테이너가 아니더라도 다운로드가 된 로컬 캐시 이미지도 조회할 수 있습니다.
           

Docker Overlay Driver

이번에는 도커 컨테이너 레이어 구조와 저장형태를 살펴보려고 합니다. 도커에서 많이 등장하는 표현으로 계층화 라는 부분과 휘발성 등의 표현이 있습니다. 관련하여 살펴보면 도커 컨테이너는 아래와 같은 레이어로 구성되어 있습니다.

[devops@docker1 ~]$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
httpd        2.4       30287d899656   3 days ago   138MB

-- docker history 로 확인
[devops@docker1 ~]$ docker history httpd:2.4
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
30287d899656   3 days ago   /bin/sh -c #(nop)  CMD ["httpd-foreground"]     0B        
<missing>      3 days ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
<missing>      3 days ago   /bin/sh -c #(nop) COPY file:c432ff61c4993ecd…   138B      
<missing>      3 days ago   /bin/sh -c #(nop)  STOPSIGNAL SIGWINCH          0B        
<missing>      3 days ago   /bin/sh -c set -eux;   savedAptMark="$(apt-m…   61.2MB    
<missing>      3 days ago   /bin/sh -c #(nop)  ENV HTTPD_PATCHES=           0B        
<missing>      3 days ago   /bin/sh -c #(nop)  ENV HTTPD_SHA256=1bc826e7…   0B        
<missing>      3 days ago   /bin/sh -c #(nop)  ENV HTTPD_VERSION=2.4.48     0B        
<missing>      3 days ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   7.38MB    
<missing>      3 days ago   /bin/sh -c #(nop) WORKDIR /usr/local/apache2    0B        
<missing>      3 days ago   /bin/sh -c mkdir -p "$HTTPD_PREFIX"  && chow…   0B        
<missing>      3 days ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/apach…   0B        
<missing>      3 days ago   /bin/sh -c #(nop)  ENV HTTPD_PREFIX=/usr/loc…   0B        
<missing>      3 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      3 days ago   /bin/sh -c #(nop) ADD file:4903a19c327468b0e…   69.3MB

-- 주요 부문만 별도로 filter
[devops@docker1 ~]$ docker history httpd:2.4 | grep -v nop
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
<missing>      3 days ago   /bin/sh -c set -eux;   savedAptMark="$(apt-m…   61.2MB    
<missing>      3 days ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   7.38MB    
<missing>      3 days ago   /bin/sh -c mkdir -p "$HTTPD_PREFIX"  && chow…   0B   



레이어는 아래서 부터 위로 올라가는 형태이며, 따라서 맨 아래 표기된 라인이 layer1 이 되게 되고 그 다음이 layer2 ,layer3 형태로 올라가게 되며 layer3 위에 컨테이너 이미지가 올라가게 됩니다.

그리고 아래 이미지와 같이 각 레이어 들은 읽기 전용이며 이미지의 내용이 달라지지 않게 됩니다 그리고 그 위에 실행한 레이어가 올라가게 되는 형태입니다.

그래서 이전에 설명한 휘발성이라는 표현 처럼 컨테이너를 종료(docker rm) 하게 되면 변경한 내용이 모두 날라가게 되는(원복 또는 미반영) 것입니다.

[https://docs.docker.com/storage/storagedriver]



[참고] 
OverlayFS는 AUFS와 유사하지만 더 빠르고 간단한 구현을 가진 최신 통합 파일 시스템입니다. OverlayFS에 대한 두 개의 드라이버를 제공하고 있으며 overlay 와 새롭고 더 안정을 overlay2 를 지원하고 있습니다.

OverlayFS 를 사용할 경우 inode 활용 측면에서 더 효율적인 overlay2 드라이버 사용이 권장되며 overlay 대신 overlay2 드라이버를 사용하기 위해서는 Linux 커널 버전 4.0 이상이나 3.10.0-514 이상 버전을 사용하는 RHEL 또는 CentOS가 필요 합니다.

overlay 간의 차이점 과 overlay2 지원 리눅스 대한 자세한 내용은 Docker 스토리지 드라이버 페이지를 참조하시면 됩니다.



그럼 실제 컨테이너 마운트 구조 정보를 확인해보도록 하겠습니다.

[devops@docker1 ~]$ docker inspect -f "{{ .GraphDriver}}" myapache1 \
| sed 's/:/\n/g' | sed 's/ /\n/g' | sed 's/\/var/  \/var/g'

{map[LowerDir
  /var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad-init/diff
  /var/lib/docker/overlay2/097077aa5dc967f3f66070d6a473b0896d10a68cba703f0e2c7384a7cf8c5bb5/diff
  /var/lib/docker/overlay2/051a83331c697ec481e72187d494612763cc6d9a440630bf1b5ce06071e7f9a1/diff
  /var/lib/docker/overlay2/25a175a633ac28704ffda116a7762a93f389e80971a9fdf4bdb303707320b8fd/diff
  /var/lib/docker/overlay2/39f96a9df8e350e081cecac0769e37edecf8295e4d82464ee7f47f4fe0d9b335/diff
  /var/lib/docker/overlay2/b8f12bd03c56db963b75527c031721a4a2266f531ad537865909f30fcf9dd1b7/diff
MergedDir
  /var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad/merged
UpperDir
  /var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad/diff
WorkDir
  /var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad/work]
overlay2}



컨테이너가 실행하면서 사용중인 레이어가 마운트 되는 정보를 확인할 수 있습니다.

컨테이너의 특징인 격리화 라는 의미처럼 로컬 캐시를 통해 컨테이너를 다른 이름으로 여러 개 실행하더라도 이미지 레이어만 공유가 되고 각각 컨테이너 별로 쓰기 레이어가 생성되기 때문에 컨테이너 별로 영향을 주지 않게 됩니다.

먼저 LowerDir 는 이미지 레이어가 포함되어 있으며 UpperDir 이 컨테이너 레이어가 되게 됩니다. 그래서 위에서 확인되는 LowerDir 와 UpperDir 를 확인해보면 apache의 원래 기본 페이지의 index.html 과 위에서 변경한 index.html 파일이 같이 있음을 확인할 수 있습니다.

[devops@docker1 ~]$ sudo find /var/lib/docker/overlay2/ -name index.html
/var/lib/docker/overlay2/3dbbfedf324951d24c4b80dd913a75871ec490cb9472317792b0fb9789285f81/merged/usr/local/apache2/htdocs/index.html
/var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad/diff/usr/local/apache2/htdocs/index.html
/var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad/merged/usr/local/apache2/htdocs/index.html
/var/lib/docker/overlay2/051a83331c697ec481e72187d494612763cc6d9a440630bf1b5ce06071e7f9a1/diff/usr/local/apache2/htdocs/index.html
      <-- 이미지 레이어 



각각의 index.html 파일을 살펴보면 아래와 같이 파일의 내용이 다름을 확인할 수 있습니다.

-- 이미지 레이어
[devops@docker1 ~]$ sudo cat /var/lib/docker/overlay2/051a83331c697ec481e72187d494612763cc6d9a440630bf1b5ce06071e7f9a1/diff/usr/local/apache2/htdocs/index.html
<html><body><h1>It works!</h1></body></html>


-- 컨테이너 레이어
[devops@docker1 ~]$ sudo ls -al /var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad/diff/usr/local/apache2/htdocs/
-rw-r--r--. 1  xxx  xxx  26 Jun 26 22:55 index.html
[devops@docker1 ~]$ sudo cat /var/lib/docker/overlay2/ab6ec813b338a029faabd29b45454cb587885ec477454f361f45cbe77400ebad/diff/usr/local/apache2/htdocs/index.html
Welcome to Docker World~!

          

Docker Stop/rm/rmi

도커 컨테이너의 중지, 삭제, 컨테이너 이미지(로컬캐시) 삭제를 알아보도록 하겠습니다.

실행 중인 도커 컨테이너는 stop 으로 중지를 합니다.

[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED       STATUS       PORTS     NAMES
10d74e00f0c4   httpd:2.4   "httpd-foreground"   6 hours ago   Up 6 hours   80/tcp    myapache1
07bd5e8794c2   httpd:2.4   "httpd-foreground"   6 hours ago   Up 6 hours   80/tcp    vigorous_sinoussi


-- 컨테이너 중지
[devops@docker1 ~]$ docker stop 10d74e00f0c4
10d74e00f0c4

[devops@docker1 ~]$ docker stop vigorous_sinoussi
vigorous_sinoussi


-- docker ps
[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


-- docker ps -a
[devops@docker1 ~]$ docker ps -a
CONTAINER ID   IMAGE       COMMAND              CREATED       STATUS                      PORTS     NAMES
10d74e00f0c4   httpd:2.4   "httpd-foreground"   6 hours ago   Exited (0) 57 seconds ago             myapache1
07bd5e8794c2   httpd:2.4   "httpd-foreground"   6 hours ago   Exited (0) 39 seconds ago             vigorous_sinoussi


중지된 컨테이너 이미지는 ps 로는 확인되지 않으며 ps -a 로 확인됩니다.

중지된 컨테이너 이미지는 restart 틀 통해 해당 컨테이너를 재시작 할 수 있습니다.


등록된 컨테이너의 삭제는 rm 을 통해 진행할 수 있습니다.

[devops@docker1 ~]$ docker ps -a
CONTAINER ID   IMAGE       COMMAND              CREATED       STATUS                     PORTS     NAMES
10d74e00f0c4   httpd:2.4   "httpd-foreground"   6 hours ago   Exited (0) 7 minutes ago             myapache1
07bd5e8794c2   httpd:2.4   "httpd-foreground"   6 hours ago   Exited (0) 7 minutes ago             vigorous_sinoussi

[devops@docker1 ~]$ docker rm 10d74e00f0c4
10d74e00f0c4

[devops@docker1 ~]$ docker rm vigorous_sinoussi
vigorous_sinoussi



로컬 캐시 이미지의 삭제는 rmi 를 통해서 진행할 수 있습니다.

[devops@docker1 ~]$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
httpd        2.4       30287d899656   3 days ago   138MB

[devops@docker1 ~]$ docker rmi 30287d899656
Untagged: httpd:2.4
Untagged: httpd@sha256:3b85095d8cac6a62357b4944497ca8ea4198e210425fa7a3ccfe144089f1b12d
Deleted: sha256:30287d8996563077ca1aeb138cb8d7b6b80d8c50b2cc6f3422b950c9f280277b
Deleted: sha256:9091725bc9f201a9a3c7f8e5d66fa46fffb0c95d9e8d0a6aaab47b362a2b0237
Deleted: sha256:b340508c21f16922e46a2904197c7eafc6fcfc6c031d6cf5b3eb7514afc66848
Deleted: sha256:356e3acf71a1a4ccc94a250fa7e6351f7b1691b7dc0ee48be96c97709cd1b7b8
Deleted: sha256:43c41c92588e603f75963bab3a334a02109a6381002f784223bdeec5f46ba7a3
Deleted: sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7

       

다량의 생성/중지/삭제

도커 이미지를 통해서 100개의 컨테이너를 생성해야 할 경우가 있을 경우, 또는 테스트 나 기타 이유로 등록된 수십 개 컨테이너를 중지 또는 삭제 등이 필요할 경우 아래와 같이 사용할 수 있습니다.


• 반복문으로 다량의 컨테이너 실행

-- 이전 단계에서 삭제하였기 때문에 없는 상태 입니다
[devops@docker1 ~]$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[devops@docker1 ~]$


-- docker run 수행시 로컬 캐시 이미지가 없다면 먼저 다운로드를 받고 실행 까지 진행 합니다
-- 도커 컨테이너 10개 실행 
for i in {1..10}
do
docker run -d --name myapache${i} httpd:2.4
echo "myapache${i} container started"
done
Unable to find image 'httpd:2.4' locally  <-- 로컬에 없음을 확인 하고 다운로드를 진행함
2.4: Pulling from library/httpd
b4d181a07f80: Downloading [================>  ]  18.16MB/27.15MB
4b72f5187e6e: Download complete 
12b2c44d04b2: Download complete 
ef481fc2a03a: Download complete 
d483d945fcab: Download complete 

-- 다운로드 완료된 도커 이미지로 컨테이너 실행, 10개 생성 됨
myapache1 container started
0842f8be5ba290f607ed6ded3fdd49438486a6b14ab588b06afdebe7b2367826
myapache2 container started
4a1a9d779d6be129e8a612514f3ebd16b6b93a910e29204cada15c5163e9a55d
myapache3 container started
abd960afd698c78733bfbb5e5d4555a2483f338a02e2792b57d3718dea0ee496
<... 중략 ...>


[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED              STATUS          PORTS     NAMES
e66cae2d1890   httpd:2.4   "httpd-foreground"   17 seconds ago       Up 12 seconds   80/tcp    myapache10
2557ca036af8   httpd:2.4   "httpd-foreground"   22 seconds ago       Up 17 seconds   80/tcp    myapache9
ae8e8dfd912b   httpd:2.4   "httpd-foreground"   27 seconds ago       Up 22 seconds   80/tcp    myapache8
ed502db7f50a   httpd:2.4   "httpd-foreground"   33 seconds ago       Up 28 seconds   80/tcp    myapache7
68e70c91b27b   httpd:2.4   "httpd-foreground"   38 seconds ago       Up 33 seconds   80/tcp    myapache6
56a16578eef4   httpd:2.4   "httpd-foreground"   43 seconds ago       Up 38 seconds   80/tcp    myapache5
abd960afd698   httpd:2.4   "httpd-foreground"   48 seconds ago       Up 43 seconds   80/tcp    myapache4
4a1a9d779d6b   httpd:2.4   "httpd-foreground"   54 seconds ago       Up 49 seconds   80/tcp    myapache3
0842f8be5ba2   httpd:2.4   "httpd-foreground"   59 seconds ago       Up 54 seconds   80/tcp    myapache2
a3e6279501cd   httpd:2.4   "httpd-foreground"   About a minute ago   Up 59 seconds   80/tcp    myapache1



이와 같이 실행중인 여러 개, 다수의 컨테이너를 한 번에 종료하기 위해서는 아래와 같이 ps -aq 에서 조회된 컨테이너ID 통해 중지할 수 있습니다

[devops@docker1 ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND              CREATED         STATUS         PORTS     NAMES
e66cae2d1890   httpd:2.4   "httpd-foreground"   3 minutes ago   Up 3 minutes   80/tcp    myapache10
2557ca036af8   httpd:2.4   "httpd-foreground"   3 minutes ago   Up 3 minutes   80/tcp    myapache9
ae8e8dfd912b   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 3 minutes   80/tcp    myapache8
ed502db7f50a   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    myapache7
68e70c91b27b   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    myapache6
56a16578eef4   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    myapache5
abd960afd698   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    myapache4
4a1a9d779d6b   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    myapache3
0842f8be5ba2   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    myapache2
a3e6279501cd   httpd:2.4   "httpd-foreground"   4 minutes ago   Up 4 minutes   80/tcp    myapache1


-- docker ps -aq 를 통해 컨테이너ID 만 조회
[devops@docker1 ~]$ docker ps -aq
42271e863d0e
02d916519bd2
e66cae2d1890
2557ca036af8
ae8e8dfd912b
ed502db7f50a
68e70c91b27b
56a16578eef4
abd960afd698
4a1a9d779d6b
0842f8be5ba2
a3e6279501cd


-- 컨테이너ID 를 인자로 하여 중지를 실행
[devops@docker1 ~]$ docker stop $(docker ps -aq)
42271e863d0e
02d916519bd2
e66cae2d1890
2557ca036af8
ae8e8dfd912b
ed502db7f50a
68e70c91b27b
56a16578eef4
abd960afd698
4a1a9d779d6b
0842f8be5ba2
a3e6279501cd



컨테이너 삭제도 위의 방법과 같이 수행하면 됩니다.

[devops@docker1 ~]$ docker rm $(docker ps -qa)
42271e863d0e
02d916519bd2
e66cae2d1890
2557ca036af8
ae8e8dfd912b
ed502db7f50a
68e70c91b27b
56a16578eef4
abd960afd698
4a1a9d779d6b
0842f8be5ba2
a3e6279501cd
[devops@docker1 ~]$



로컬 캐시 이미지도 이와 유사하게 삭제를 할 수 있습니다 docker images -q 를 사용합니다.

[devops@docker1 ~]$ docker rmi $(docker images -q)
Untagged: httpd:2.4
Untagged: httpd@sha256:317cc1a2ded5e96225e4181323737f6d29b4fda58a6cc840a5752af6493a231f
Deleted: sha256:30287d8996563077ca1aeb138cb8d7b6b80d8c50b2cc6f3422b950c9f280277b
Deleted: sha256:9091725bc9f201a9a3c7f8e5d66fa46fffb0c95d9e8d0a6aaab47b362a2b0237
Deleted: sha256:b340508c21f16922e46a2904197c7eafc6fcfc6c031d6cf5b3eb7514afc66848
Deleted: sha256:356e3acf71a1a4ccc94a250fa7e6351f7b1691b7dc0ee48be96c97709cd1b7b8
Deleted: sha256:43c41c92588e603f75963bab3a334a02109a6381002f784223bdeec5f46ba7a3
Deleted: sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7
[devops@docker1 ~]$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[devops@docker1 ~]$



여기까지 도커 컨테이너의 기본적인 실행, 중지, 삭제 등을 확인해보았습니다. 다음 포스팅에서는 브릿지 네트워크와 도커 이미지 생성 등 확인해보도록 하겠습니다
                   

5. Reference

Reference book
완벽한 IT 인프라 구축을 위한 Docker 2판 [L]


Reference link
44bits.io/how-docker-image-work [L]

docker.com/storagedriver [L]
docker.com/overlayfs-driver [L]


이어지는 다음 글



관련된 다른 글

 

 

 

                 

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x