[Ansible] 도커 컨테이너 ID 가져오기

도커 컨테이너의 ID로 여러가지 작업을 하기 위해 Ansible에서 도커 컨테이너의 ID를 가져오는 작업을 진행해봅니다.

 

Playbook 생성

web-server이름의 도커 컨테이너 ID를 가져오는 Playbook을 작성해봅니다.

- name: Regist web-server docker container id
  shell: docker ps -q -f "name=web-server"
  register: web_server_container_id

도커 컨테이너 ID는 web_server_container_id 이름으로 등록하였습니다.


테스트를 위해 web_server_container_id 의 전체 결과 값을 출력해보는 로직도 추가해봤습니다.

- name: Logging web_server_container_id
  debug:
    msg: "{{ web_server_container_id }}"

 

 

Playbook 실행

작성한 yml 파일을 실행하여 로그를 확인해봅니다.

ansible-playbook -i {{Inventory}} test_work.yml

TASK [test_work : Regist web-server docker container id] ***************************************************************************************************************************************************************************************
changed: [node0]

TASK [test_work : Logging web_server_container_id] *****************************************************************************************************************************************************************************************************
ok: [node0] => {
    "msg": {
        "changed": true,
        "cmd": "docker ps -q -f \"name=web-server\",
        "delta": "0:00:00.025528",
        "end": "2023-02-20 10:57:08.057040",
        "failed": false,
        "msg": "",
        "rc": 0,
        "start": "2023-02-20 10:57:08.031512",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "c7326be211bf",
        "stdout_lines": [
            "c7326be211bf"
        ]
    }
}

전체 결과 값을 확인할 수 있으며 stdout 값에 도커 컨테이너 ID를 정상적으로 가져왔음을 확인할 수 있습니다.

 

실제 yml 파일에서 해당 값을 사용하려면 아래와 같이 .stdout를 추가하여 해당 값만 가져와 사용할 수 있습니다.

- name: Using web_server_container_id
  debug:
    msg: "{{ web_server_container_id.stdout }}"

 

위 방법으로 도커 컨테이너 ID를 Ansible에서 불러와 사용할 수 있습니다.

'Infrastructure As Code > Ansible' 카테고리의 다른 글

[Ansible] Yum 패키지 관리  (0) 2023.05.19
[Ansible] 시스템 OS 재시작 하기  (0) 2023.03.10

[Linux] 문자열 앞, 마지막 부분 출력하기

리눅스 head 명령어를 통해 문자열의 앞부분을 확인하거나 tail 명령어로 마지막 부분을 출력할 수 있습니다.

 

 

테스트 시 활용할 text 파일 내용

# cat text
An apple is a fruit.
The sky is blue.
Today is Monday.
Cutting paper with scissors.
Trees grow on the ground.
The sun rises in the east.
The earth is round.
The winter night air is cold.
Drinking water every morning.
The bus has already left.

 

 

문자열 앞부분 출력하기

  • 문자열 앞부분 두번째 줄까지 출력하기
  • -n 옵션을 사용하거나 직접 -2 숫자를 지정할 수 있습니다.
# cat text | head -n 2
An apple is a fruit.
The sky is blue.

# cat text | head -2
An apple is a fruit.
The sky is blue.

 

  • 문자열 앞부분부터 특정 바이트 단위까지 출력하기
  • -c 옵션 사용
# cat text | head -c 50
An apple is a fruit.
The sky is blue.
Today is Mon

 

 

문자열 마지막 부분 출력하기

  • 문자열 마지막 부분 세번째 줄까지 출력하기
  • -n 옵션을 사용하거나 직접 -2 숫자를 지정할 수 있습니다.
# cat text | tail -n 3
The winter night air is cold.
Drinking water every morning.
The bus has already left.

# cat text | tail -3
The winter night air is cold.
Drinking water every morning.
The bus has already left.

 

  • 문자열 마지막 부분부터 특정 바이트 단위까지 출력하기
  • -c 옵션 사용
# cat text | tail -c 50
ng water every morning.
The bus has already left.

'Linux' 카테고리의 다른 글

[Linux] RPM 패키지 상세 정보 확인하기  (0) 2023.05.09
[Linux] Rocky 설치하기  (0) 2023.05.03
[Linux] 특정 문자열 기준으로 출력하기  (0) 2022.09.22

[Docker] Network 설정

도커 컨테이너는 서로 간의 통신을 위해 도커 네트워크를 통해 통신합니다.

별도의 네트워크를 생성하여 사용하거나, 네트워크 대역을 설정하는 등 관리할 수 있습니다.

 

네트워크 리스트 확인

docker network ls 명령어로 도커 네트워크 리스트를 확인할 수 있습니다.
기본 값으로 bridge, host, none 이름의 도커 네트워크가 생성됩니다.

# docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
1828940023a0   bridge              bridge    local
ed4ac8c45f9c   host                host      local
f906c4534681   none                null      local

bridge 네트워크 드라이브

bridge 네트워크 드라이브는 기본 네트워크 드라이버입니다. 드라이버를 지정하지 않고 docker-compose를 작성하여 컨테이너를 생성하면 기본적으로 bridge 네트워크 드라이브로 네트워크가 생성됩니다. 일반적으로 응용프로그램이 통신해야 하는 독립형 컨테이너에서 실행될 때 사용됩니다.

 

host 네트워크 드라이브

 host 네트워크 드라이브는 Docker 호스트 간의 네트워크 분리를 제거하고 호스트의 네트워킹을 직접 사용합니다.

 

none 네트워크 드라이브

 none 네트워크 드라이브는 모든 네트워크을 비활성화하는 설정입니다.

 

 

기본 설정

별도의 도커 네트워크를 설정하지 않고 docker-compose를 통해 도커 컨테이너를 생성하면 bridge 네트워크 드라이브로 네트워크가 생성됩니다. 동일한 docker-compose 파일에 별도의 네트워크 설정 없이 여러 컨테이너를 추가했다면 모두 동일한 도커 네트워크가 할당됩니다.

services:
  httpd:
    image: httpd:latest
    container_name: "my-web-server1"
    restart: "always"
    ports:
      - "8081:80"

 

컨테이너를 실행하면 webserver_default 이름의 네트워크가 생성됩니다.
네트워크 이름 규칙은 docker-compose.yml 파일이 위치한 디렉토리 이름에 '_default' 추가된 형태로 생성됩니다.

(docker-compose 버전에 따라 기본 생성 이름은 달라질 수 있습니다.)

# docker-compose up -d
Creating network "webserver_default" with the default driver
Creating my-web-server1 ... done

 

 

docker network ls 명령어로 네트워크가 추가된 것을 확인하실 수 있습니다.

# docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
1828940023a0   bridge              bridge    local
ed4ac8c45f9c   host                host      local
f906c4534681   none                null      local
162b8673c609   webserver_default   bridge    local

 

상세 정보 확인

생성된 네트워크는 inspect 옵션을 통해 상세 정보를 확인할 수 있습니다.

도커 네트워크에 할당된 컨테이너는 "Containers" 항목에서 확인하실 수 있습니다.

# docker network inspect webserver_default
[
    {
        "Name": "webserver_default",
        "Id": "162b8673c60998f9e127f6c3d3c946b7f3005db0277270a0302d64a5d25734bc",
        "Created": "2022-11-22T23:16:11.2384848+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.25.0.0/16",
                    "Gateway": "172.25.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "72c4f8408a4c09f12f667de5188452550fa444d57656ac51fbd709f3d28b727e": {
                "Name": "my-web-server1",
                "EndpointID": "9ace8e9ea4647d52abd9cae0a90e62b7955fecffdfde46c16686b9060aba6714",
                "MacAddress": "02:42:ac:19:00:02",
                "IPv4Address": "172.25.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "webserver",
            "com.docker.compose.version": "1.29.2"
        }
    }
]

 

도커 네트워크에 2개 이상의 컨테이너가 할당되면 아래와 같이 확인 가능합니다.

"Containers": {
    "5af2aed3ae0a96e79aadbb007babb48fad29a866623bbefb10410071def95d91": {
        "Name": "my-web-server2",
        "EndpointID": "28e88ea1fb41743162a5c7f85af97f7cf152dd1e80c9ace503ae7d11dc355db4",
        "MacAddress": "02:42:ac:1a:00:03",
        "IPv4Address": "172.26.0.3/16",
        "IPv6Address": ""
    },
    "7d669f907151d747074c50a97ce1c35c32ce214857b6b012ab18dc747883bb28": {
        "Name": "my-web-server1",
        "EndpointID": "671b2b651d7e4033fc268806c9137e2ac3d517d1397e1cf84f2d667ab177eb31",
        "MacAddress": "02:42:ac:1a:00:02",
        "IPv4Address": "172.26.0.2/16",
        "IPv6Address": ""
    }
},

 


IP 대역 설정

docker-compose.yml 파일을 통해 도커 네트워크를 생성하고, IP 대역을 지정할 수 있습니다.
테스트로 "172.16.101.0/24" 대역으로 도커 네트워크를 생성하고, 도커 컨테이너에 적용해봅시다.

services:
  httpd:
    image: httpd:latest
    container_name: "my-web-server1"
    restart: "always"
    ports:
      - "8081:80"
    networks:
      - test-network-1

networks:
  test-network-1:
    ipam:
      driver: default
      config:
        - subnet: "172.16.101.0/24"

 

도커 컨테이너 실행 후 생성된 네트워크 정보를 확인해보면 "172.16.101.0/24" IP 대역으로 도커 네트워크가 생성되고 "172.16.101.2/24" IP로 도커 컨테이너에 할당된 것을 확인하실 수 있습니다.

# docker network inspect webserver_test-network-1
[
    {
        "Name": "webserver_test-network-1",
        "Id": "6dd881586154cbf2f95d710fc67f6ed6ec79149478b4e7502b3b6472eaf71b8a",
        "Created": "2022-12-01T23:29:47.4810513+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.16.101.0/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "e5436808ad268cccee655a2df0ae7a5dc31c8d9e0bd1387cc6dd5aa29cf93a3b": {
                "Name": "my-web-server1",
                "EndpointID": "d16c3da2b0ccb72a772c8682db0ed7a49441b731b6f2a48cd87b901c833672cb",
                "MacAddress": "02:42:ac:10:65:02",
                "IPv4Address": "172.16.101.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "test-network-1",
            "com.docker.compose.project": "webserver",
            "com.docker.compose.version": "1.29.2"
        }
    }
]

 

네트워크 설정은 이 외에도 다양하게 설정할 수 있지만 간단히 네트워크를 구성하는 방법을 알아보았습니다.

[Docker] Logging 설정

도커 컨테이너 실행 시 기본적으로 컨테이너에서 발생하는 로그를 저장하여 관리하고 있습니다.

발생되는 로그는 docker logs {Name} or {ID} 명령어를 통해 간단히 확인할 수 있습니다.

Logging 설정을 통해 로그를 남기는 형식을 변경하거나 로그 파일을 관리하는 정책을 설정할 수 있습니다.

 

기본 설정

도커 컨테이너에서 Logging 관련 설정 시 logging driver를 설정할 수 있으며 지원되는 여러가지 driver 중 3가지 설정을 확인해보겠습니다.

 

첫 번째로는 기본 설정인 json-file 설정으로 도커 컨테이너에 로그를 남기는 기능입니다.

driver: "json-file"

 

두 번째 설정은 syslog 설정으로 syslog 서버로 로그를 전송하여 syslog 서버에서도 로그를 관리하는 설정입니다.

driver: "syslog"

 

세 번째 설정은 none 설정으로 로그를 별도로 관리하지 않는 설정입니다.

driver: "none"

 

1. json-file 설정

json-file 설정은 Default 설정으로 별도로 logging을 설정하지 않아도 아래와 같이 적용되어 동작합니다.

아래 내용으로 도커 컨테이너 실행 및 웹 접속 후 로그를 확인해봅니다.

# cat docker-compose.yml
services:
  httpd:
    image: httpd:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    logging:
      driver: "json-file"

 

아래 형식으로 로그가 기록됩니다.

# docker logs my-web-server --tail 1
172.29.0.1 - - [21/Oct/2022:13:39:05 +0000] "GET / HTTP/1.1" 200 45

 

docker-compose 파일에서 아래 내용을 제거해도 Default 설정이므로 로그는 동일하게 기록됩니다.

logging:
  driver: "json-file"

 

json-file 옵션

json-file driver의 옵션을 통해 로그 파일의 사이즈와 갯수를 제한하거나 기타 옵션을 사용할 수 있습니다.

# cat docker-compose.yml
services:
  httpd:
    image: httpd:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    logging:
      driver: "json-file"
      options:
        max-size: "10k"
        max-file: "3"

로그 사이즈는 10k, 갯수는 3개로 설정하였고, 실제로 생성되는 로그 파일을 확인해봅니다.
(로그는 스크립트를 통해 접속 로그를 생성하였습니다)

 

docker inspect 명령어틑 통해 컨테이너 정보 중 로그 생성 경로를 확인합니다.

# docker inspect my-web-server | grep LogPath
  "LogPath": "/var/lib/docker/containers/98ffd3097dbf7c29aa19c5ccb54ad5e174841bd8472200828362668c058ccd31/98ffd3097dbf7c29aa19c5ccb54ad5e174841bd8472200828362668c058ccd31-json.log",

 

로그 생성 경로를 확인하여 10k 사이즈로 3개의 갯수로 로그가 생성된 것을 확인할 수 있습니다.

# ll /var/lib/docker/containers/98ffd3097dbf7c29aa19c5ccb54ad5e174841bd8472200828362668c058ccd31/
total 72
-rw-r----- 1 root root  7553 Oct 25 22:51 98ffd3097dbf7c29aa19c5ccb54ad5e174841bd8472200828362668c058ccd31-json.log
-rw-r----- 1 root root 10077 Oct 25 22:51 98ffd3097dbf7c29aa19c5ccb54ad5e174841bd8472200828362668c058ccd31-json.log.1
-rw-r----- 1 root root 10070 Oct 25 22:51 98ffd3097dbf7c29aa19c5ccb54ad5e174841bd8472200828362668c058ccd31-json.log.2

간단히 로그 사이즈와 갯수로 로그 파일을 관리하는 부분이지만,
서비스별 특성에 따라 생성되는 로그양과 관리 정책에 따라 해당 설정을 조정하여 사용해보시면 좋을 것 같습니다.

 

 

2. syslog 설정

syslog driver 옵션을 통해 로그를 syslog 서버에 저장할 수 있습니다.
syslog 서버 구축은 간단히 정리한 글이 있어 링크를 참고해주시면 될 것 같습니다. [syslog 서버 구축]

 

로그는 로컬에 구성한 syslog 서버에 로그를 저장하도록 설정하였습니다.

# cat docker-compose.yml
services:
  httpd:
    image: httpd:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    logging:
      driver: "syslog"
      options:
        syslog-address: "udp://localhost:514"

서비스 로그 생성 시 Docker 와 syslog 서버에서 모두 로그를 확인할 수 있습니다.
syslog 서버뿐만 아니라 Docker에도 로그가 생성된다는 점을 기억하시면 좋을 것 같습니다.

 

[ Docker 로그 ]

# docker logs my-web-server --tail 1
172.20.0.1 - - [07/Nov/2022:13:05:22 +0000] "GET / HTTP/1.1" 200 45

[ syslog 로그 ]

# cat messages | tail -1
Nov 7 22:05:22 172.19.0.1 c320e2a10055[172]: 172.20.0.1 - - [07/Nov/2022:13:05:22 +0000] "GET / HTTP/1.1" 200 45

 

중요도가 높은 서비스거나 별도로 로그를 관리하기 위해 syslog를 사용하면 좋을 것 같습니다.

 

 

3. none 설정

none driver 옵션은 로그를 생성하지 않겠다는 설정입니다.

# cat docker-compose.yml
services:
  httpd:
    image: httpd:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    logging:
      driver: "none"

 

네. 진짜 로그 저장안됩니다...

# docker logs my-web-server
Error response from daemon: configured logging driver does not support reading

서비스 특성에 따라 로그 확인이 필요 없을 경우 사용하거나,
테스트 용도로 로그 양이 많이 발생하는 경우 일시적으로 사용할 수 있을 것 같습니다.

 

 

logging 설정 중 간단히 3가지 설정을 확인해봤습니다.
각각의 서비스 특성에 따라 상황에 맞는 옵션을 사용하여 Docker 컨테이너를 더욱 원활히 관리해 보세요...!

[Docker] Syslog 서버 구축

syslog는 서버의 전반적인 로그를 관리하고 생성하는 데몬이자 도구입니다.

docker 컨테이너를 통해 syslog 서버를 구축해봅니다.

 

이미지 다운로드

balabit/syslog-ng 이미지를 다운받아 syslog 서버 구성에 사용합니다.

# docker pull balabit/syslog-ng:latest
latest: Pulling from balabit/syslog-ng
bc2ca2f3fe95: Pull complete
192f45bd4334: Pull complete
b6703b37ab44: Pull complete
98d97b578ab1: Pull complete
9216e5c2bf8e: Pull complete
Digest: sha256:1a13ed478136ed7a2638095f87da510121fa4d4d15b6171b543bab42948e4ae7
Status: Downloaded newer image for balabit/syslog-ng:latest
docker.io/balabit/syslog-ng:latest

 

docker-compose 설정

syslog의 로그 저장 경로인 /var/log 디렉토리를 호스트에서 확인할 수 있도록 ./data/log 디렉토리와 마운트 하였으며,

syslog 에서 사용하는 포트 정보(UDP:514/TCP:601/TLS:6514)를 포트 포워딩 하였습니다.

# cat docker-compose.yml
services:
  syslog-ng:
    image: balabit/syslog-ng:latest
    container_name: syslog-ng
    volumes:
      - ./data/log:/var/log
    ports:
      - 514:514/udp
      - 601:601/tcp
      - 6514:6514/tcp

 

로그 생성 디렉토리인 ./data/log 디렉토리를 생성합니다.

# mkdir -p ./data/log

 

 

docker-compose 실행 및 확인

설정이 완료 후 docker-compose up -d 명령어로 컨테이너를 실행합니다.

# docker-compose up -d
Creating network "syslog_default" with the default driver
Creating syslog-ng ... done

 

docker ps 명령어로 컨테이너 상태를 확인합니다.

# docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                             PORTS                                                                                                                     NAMES
3bd1260b5ce3   balabit/syslog-ng:latest   "/usr/sbin/syslog-ng…"   17 seconds ago   Up 14 seconds (health: starting)   0.0.0.0:601->601/tcp, :::601->601/tcp, 0.0.0.0:514->514/udp, :::514->514/udp, 0.0.0.0:6514->6514/tcp, :::6514->6514/tcp   syslog-ng

 

netstat 명령어로 포트포워딩 설정이 정상적으로 설정되었는지 확인합니다.

# netstat -nap | grep -E "514|601|6514"
tcp        0      0 0.0.0.0:601             0.0.0.0:*               LISTEN      8586/docker-proxy
tcp        0      0 0.0.0.0:6514            0.0.0.0:*               LISTEN      8563/docker-proxy
tcp6       0      0 :::601                  :::*                    LISTEN      8594/docker-proxy
tcp6       0      0 :::6514                 :::*                    LISTEN      8569/docker-proxy
udp        0      0 172.31.0.1:37144        172.31.0.2:514          ESTABLISHED 8608/docker-proxy
udp        0      0 0.0.0.0:514             0.0.0.0:*                           8608/docker-proxy
udp6       0      0 :::514                  :::*                                8614/docker-**proxy**

 

로그 저장 디렉토리에 messages 관련 파일이 자동으로 생성되었는지 확인합니다.

# ls -al ./data/log/
total 16
drwxr-xr-x 2 root root 4096 Nov  1 22:26 .
drwxr-xr-x 3 root root 4096 Nov  1 22:25 ..
-rw------- 1 root root  260 Nov  1 22:29 messages
-rw------- 1 root root  473 Nov  1 22:29 messages-kv.log

 

syslog 사용법

syslog 서버에 로그를 남기고자 하는 서버에서 syslog 서버의 IP와 포트 정보(UDP:514/TCP:601/TLS:6514)를 지정하여 사용하시면 됩니다.


로그는 기본적으로 마운트한 ./data/log 디렉토리 안에 생성되니 확인해보시면 될 것 같습니다.

 

추가적으로 syslog 관련 설정을 변경하고 싶으시면 아래와 같이 syslog 관련 설정 파일을 마운트하여 설정을 변경하신 후 컨테이너를 재시작하여 사용가능합니다.

volumes:
  - "$PWD/syslog-ng.conf":/etc/syslog-ng/syslog-ng.conf

'Docker' 카테고리의 다른 글

[Docker] Network 설정  (0) 2022.12.01
[Docker] Logging 설정  (0) 2022.11.07
[Docker] Healthcheck 설정을 통한 컨테이너 상태 점검  (0) 2022.10.19
[Docker] Volumes 설정  (0) 2022.10.11
[Docker] Restart 설정  (0) 2022.09.20

[Docker] Healthcheck 설정을 통한 컨테이너 상태 점검

healthcheck 설정은 컨테이너가 healthy 상태인지 여부를 확인하기 위해 사용합니다. 컨테이너의 상태를 확인하는 방법을 정의하여 주기적으로 작동 중인지 검사합니다.

 

기본 설정

nginx 컨테이너 이미지를 사용하여 웹 서비스를 구동시키고 healthcheck 옵션을 추가하여 상태를 확인해봅시다.

httpd 컨테이너 이미지를 사용하고자 하였으나 컨테이너에 curl 등 확인 명령어가 없어 nginx 컨테이너 이미지를 사용하였습니다.

# cat docker-compose.yml
services:
  nginx:
    image: nginx:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    healthcheck:
      test: curl -f http://localhost:80 || exit 1

healthcheck 옵션을 사용하지 않으면 disable: true 옵션이 적용되어 별도로 healthcheck 옵션은 동작하지 않습니다.

 

 

nginx 서비스를 구동시킨 후 docker ps 명령어로 컨테이너 상태를 확인해보면 healthcheck 옵션을 추가하지 않은 것과 달리 STATUS 에 (health: {STATUS}) 항목이 추가된 것을 확인하실 수 있습니다.

# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                             PORTS                               NAMES
b91ed9482b75   nginx:latest   "/docker-entrypoint.…"   30 seconds ago   Up 26 seconds (health: starting)   0.0.0.0:80->80/tcp, :::80->80/tcp   my-web-server

 

healthcheck 를 통해 정상을 확인한 후 health 상태가 starting 에서 healthy로 변경된 것을 확인하실 수 있습니다.

# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                   PORTS                               NAMES
b91ed9482b75   nginx:latest   "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp   my-web-server

healthcheck 옵션을 통해 상태 검사를 시작하면 starting 상태이며 이후 상태 검사를 통과할 때마다 healthy 상태가 됩니다. 일정 횟수를 실패한 후에는 unhealthy 상태로 변경되며 총 3가지의 상태가 존재합니다.

 

옵션 설정

healthcheck 옵션을 통해 검사를 진행하는 주기와 시간 등을 설정할 수 있습니다. 기본 설정은 아래와 같이 적용되며 각각의 설정 값을 설정하여 상황에 따른 설정을 적용할 수 있습니다.

 

서비스의 특성에 따라 검사 주기(interval)을 짧게 설정할 수도 있고, 반대로 네트워크가 안정적이지 않은 환경에서는 재시도(retries) 횟수나 타임아웃(timeout) 시간을 늘려서 설정할 수도 있습니다.

[ healthcheck 옵션 ]
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
// start_period 옵션은 3.4 버전에 추가되었습니다.

 

healthcheck 옵션을 아래와 같이 추가하였으며 10초마다 검사하도록 설정하고 10초간 응답이 없으면 타임아웃, 그리고 2회 재시도해도 응답이 없으면 unhealthy 상태가 되도록 설정하였습니다.

# cat docker-compose.yml
services:
  nginx:
    image: nginx:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    healthcheck:
      test: curl -f http://localhost:80 || exit 1
      interval: 10s
      timeout: 10s
      retries: 2

10초마다 검사하도록 설정하였으므로 docker-compose up -d 명령어로 컨테이너 시작 후 starting 상태에서 healthy 까지 기본 설정(30초)가 아닌 10초가 경과한 이후에 상태가 변경되는 것을 확인하실 수 있습니다.

 

Health 상태 상세 확인

docker inspect 명령어는 도커 컨테이너의 정보 및 상태를 확인할 수 있는 명령어로 healthcheck 옵션을 통한 검사 결과를 확인하실 수 있습니다.

# docker inspect my-web-server
====================== 생략 ======================
"Health": {
  "Status": "healthy",
  "FailingStreak": 0,
  "Log": [
    {
      "Start": "2022-10-19T22:42:46.673233+09:00",
      "End": "2022-10-19T22:42:46.807225+09:00",
      "ExitCode": 0,
      "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n
      ====== 생략 ======
    }

상태 정보는 healthy이고 실패 횟수(FailingStreak)가 0 값인 것을 확인하실 수 있습니다. 또한 검사 명령어를 요청한 시간과 응답 시간, 응답 값 등을 확인하실 수 있습니다.

 

healthcheck 설정을 통해 컨테이너의 상태를 검사하여 사용해보시기 바랍니다.

'Docker' 카테고리의 다른 글

[Docker] Logging 설정  (0) 2022.11.07
[Docker] Syslog 서버 구축  (0) 2022.11.01
[Docker] Volumes 설정  (0) 2022.10.11
[Docker] Restart 설정  (0) 2022.09.20
[Docker] Container name 설정  (0) 2022.09.19

[Docker] Volumes 설정

컨테이너를 실행하면 컨테이너 내부에 데이터가 저장되어 관리되며 기본적으로 컨테이너가 제거되면 데이터가 모두 사라집니다. 파일이나 디렉토리를 volumes 설정을 통해 설정 파일과 데이터 등을 저장하여 사용합니다.

 

volumes 설정에는 크게 Volume과 Bind mount 두가지 방식이 존재하며 Bind mount 방식으로 설정해보겠습니다.

 

기본 설정

mariadb의 데이터를 계속 저장하여 관리할 수 있도록 data 디렉토리를 만들어 관리해봅시다.
data 디렉토리와 mariadb 데이터 디렉토리인 /var/lib/mysql 디렉토리를 ':'로 구분하여 volume을 설정합니다.

# cat docker-compose.yml
services:
  db:
    image: mariadb:10.4.25
    container_name: db-server
    environment:
      MARIADB_ROOT_PASSWORD: DbP@ssWord
    volumes:
      - ./data:/var/lib/mysql

 

mariadb 컨테이너 실행 시 자동으로 데이터를 생성하며 volume을 설정한 data 디렉토리에 데이터가 생성되었음을 확인할 수 있습니다.

# ls -al data/
total 140156
drwxr-xr-x 4  999 docker     4096 Oct  4 23:18 .
drwxr-xr-x 3 root root       4096 Oct  4 23:18 ..
-rw-rw---- 1  999 docker 17661952 Oct  4 23:18 aria_log.00000001
-rw-rw---- 1  999 docker       52 Oct  4 23:18 aria_log_control
-rw-rw---- 1  999 docker      930 Oct  4 23:18 ib_buffer_pool
-rw-rw---- 1  999 docker 50331648 Oct  4 23:18 ib_logfile0
-rw-rw---- 1  999 docker 50331648 Oct  4 23:18 ib_logfile1
-rw-rw---- 1  999 docker 12582912 Oct  4 23:18 ibdata1
-rw-rw---- 1  999 docker 12582912 Oct  4 23:18 ibtmp1
-rw-rw---- 1  999 docker        0 Oct  4 23:18 multi-master.info
drwx------ 2  999 docker     4096 Oct  4 23:18 mysql
-rw-r--r-- 1  999 docker       15 Oct  4 23:18 mysql_upgrade_info
drwx------ 2  999 docker     4096 Oct  4 23:18 performance_schema

 

디렉토리 뿐만 아니라 특정 파일을 설정할 수 있습니다.

mariadb 설정 파일을 volume 설정하여 컨테이너에 직접 들어가지 않고도 설정을 수정할 수 있습니다.

services:
  db:
    image: mariadb:10.4.25
    container_name: db-server
    environment:
      MARIADB_ROOT_PASSWORD: DbP@ssWord
    volumes:
      - ./data:/var/lib/mysql
      - ./conn.cnf:/etc/mysql/conf.d/conn.cnf

 

권한 설정

volumes 설정 뒤에 ro, rw 옵션을 추가하여 권한을 부여할 수 있습니다. (기본 설정은 rw 입니다)
기본 data 디렉토리를 삭제하고 ro 옵션을 추가한 후 다시 mariadb 컨테이너를 실행해봅니다.

volumes:
  - ./data:/var/lib/mysql:ro

 

컨테이너 실행 시 data 디렉토리에 대한 권한이 없기 때문에 데이터를 생성할 수 없게됩니다.

# ls -al data/
total 8
drwxr-xr-x 2 root root 4096 Oct  4 23:34 .
drwxr-xr-x 3 root root 4096 Oct  4 23:34 ..

 

권한 설정을 통해 컨테이너에서 파일을 추가, 수정하지 못하도록 제어할 수 있습니다. 상황에 따라 권한 설정을 부여하시기 바랍니다.

'Docker' 카테고리의 다른 글

[Docker] Syslog 서버 구축  (0) 2022.11.01
[Docker] Healthcheck 설정을 통한 컨테이너 상태 점검  (0) 2022.10.19
[Docker] Restart 설정  (0) 2022.09.20
[Docker] Container name 설정  (0) 2022.09.19
[Docker] compose 기본 사용법  (0) 2022.09.19

[Linux] 특정 문자열 기준으로 출력하기

sed 명령어를 활용하여 특정 문자열을 기준으로 출력을 제어해봅니다.

 

테스트 시 활용할 text 파일 내용

# cat text
An apple is a fruit.
The sky is blue.
Today is Monday.
Cutting paper with scissors.
Trees grow on the ground.
The sun rises in the east.
The earth is round.
The winter night air is cold.
Drinking water every morning.
The bus has already left.

 

특정 문자열이 포함된 문자열부터 끝까지 출력하기

문자열 Cutting paper 부터 끝까지 출력

# cat text | sed -n '/Cutting paper/,$p'
Cutting paper with scissors.
Trees grow on the ground.
The sun rises in the east.
The earth is round.
The winter night air is cold.
Drinking water every morning.
The bus has already left.

-n 옵션 : 패턴에 일치하는 값만 출력 / 콤마(,) : 범위 지정 / $ : 문자열 끝 명시 / p : 출력

 

특정 문자열부터 특정 문자열까지 출력하기

문자열 Cutting paper 부터 문자열 Drinking 까지 출력

# cat text | sed -n '/Cutting paper/,/Drinking/p'
Cutting paper with scissors.
Trees grow on the ground.
The sun rises in the east.
The earth is round.
The winter night air is cold.
Drinking water every morning.

-n 옵션 : 패턴에 일치하는 값만 출력 / 콤마(,) : 범위 지정 / p : 출력

 

특정 문자열부터 특정 문자열까지 제외하고 출력하기

문자열 Cutting paper 부터 문자열 Drinking 까지 제외하고 출력

# cat text | sed '/Cutting paper/,/Drinking/d'
An apple is a fruit.
The sky is blue.
Today is Monday.
The bus has already left.

콤마(,) : 범위 지정 / d : 제외

 

처음부터 특정 문자열까지 출력하기

문자열 Cutting paper 까지 출력

# cat text | sed -n '1,/Cutting paper/p'
An apple is a fruit.
The sky is blue.
Today is Monday.
Cutting paper with scissors.

-n 옵션 : 패턴에 일치하는 값만 출력 / 1 : 첫번째 열 / p : 출력

 

특정 문자열부터 특정 문자열까지의 범위에서 문자열 변경

문자열 sky 부터 문자열 night까지의 범위 중 blue 문자열을 dark 로 변경

# cat text | sed "/sky/,/night/s/blue/dark/g"
An apple is a fruit.
The sky is dark.
Today is Monday.
Cutting paper with scissors.
Trees grow on the ground.
The sun rises in the east.
The earth is round.
The winter night air is cold.
Drinking water every morning.
The bus has already left.

콤마(,) : 범위 지정 / s : 문자열 치환 / g : 전체 적용

'Linux' 카테고리의 다른 글

[Linux] RPM 패키지 상세 정보 확인하기  (0) 2023.05.09
[Linux] Rocky 설치하기  (0) 2023.05.03
[Linux] 문자열 앞, 마지막 부분 출력하기  (0) 2023.01.10

+ Recent posts