본문 바로가기
  • Where there is a will there is a way.
개발/기타개발

도커 컨테이너 자원 할당 제한

by 소확행개발자 2020. 2. 1.

 

컨테이너를 생성하는 run, create 명령어에서 컨테이너의 자원 할당량을 조정하도록 옵션을 입력할 수 있다.

 

아무런 옵션을 입력하지 않으면 컨테이너는 호스트의 자원을 제한 없이 쓸 수 있게 설정되므로 제품 단계의 컨테이너를 고려한다면 컨테이너의 자원 할당을 제한해 호스트와 다른 컨테이너의 동작을 방해하지 않게 설정하는 것이 좋다.

 

컨테이너의 자원 할당 옵션을 설정하지 않은면 호스트의 자원을 전부 점유해 컨테이너들뿐 아니라 호스트 자체의 동작이 멈출 수도 있다.

 

현재 컨테이너에 설정된 자원 제한을 확인하는 가장 쉬운 방법은 docker inspect 명령어를 입력하는 것이다.

 

docker inspect a6dba55d667f

[
    {
        "Id": "a6dba55d667f2b618cf62ed2131b9050c21e03a75fc63f3edb17f8c53a8f22b5",
        "Created": "2020-02-01T12:03:44.187434175Z",
        "Path": "/.r/r",
        "Args": [
            "/bin/sh",
            "-c",
            "java -jar -Dspring.profiles.active=${ACTIVE_PROFILE} cube_goods-0.1.0.jar"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 26564,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-02-01T12:03:44.852915486Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:1f3fcdfa88233d1b7b4f82ccfd416356be5fa2af7cad89dfaef76d481f37935d",
        "ResolvConfPath": "/var/lib/docker/containers/a6dba55d667f2b618cf62ed2131b9050c21e03a75fc63f3edb17f8c53a8f22b5/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/a6dba55d667f2b618cf62ed2131b9050c21e03a75fc63f3edb17f8c53a8f22b5/hostname",
        "HostsPath": "/var/lib/docker/containers/a6dba55d667f2b618cf62ed2131b9050c21e03a75fc63f3edb17f8c53a8f22b5/hosts",
        "LogPath": "/var/lib/docker/containers/a6dba55d667f2b618cf62ed2131b9050c21e03a75fc63f3edb17f8c53a8f22b5/a6dba55d667f2b618cf62ed2131b9050c21e03a75fc63f3edb17f8c53a8f22b5-json.log",
        "Name": "/r-cube-goods-build-1-dfa33779",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "rancher-cni:/.r:ro"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },

이런식으로 나온다

 

여기서 컨테이너의 자원 할당 제한은

 

1. 메모리 제한

2. cpu 제한

3. Block I/O 제한 

 

3가지가 있다.

 

1. 은 앞에서 이야기 했듯이 제한하지 않으면 호스트의 자원을 전부 점유할 수 있다.

docker run -d \
--memory = "1g" \
nginx

docker inspect memory_1g | grep \"memory\"

컨테이너 내에서 동작하는 프로세스가 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료되므로 애플리케이션에 따라 메모리를 적절하게 할당하는 것이 좋다. 

 

2. 가상 머신이 특정 개수의 CPU 를 할당받던 것과는 다르게 모든 컨테이너의 작업은 CPU 스케줄링에서 같은 비율로 처리한다. 

따라서 컨테이너 하나에 CPU를 한 개 할당하는 방식이 아닌 CPU 스케줄링에서 CPU 를 얼마나 많이 차지할 것인가를 설정해야 한다. 

'개발 > 기타개발' 카테고리의 다른 글

SQL group by 와 기본적인 문법 이해  (0) 2020.03.29
객체 지향 설계 5단계  (0) 2020.03.26
도커 컨테이너 로깅  (0) 2020.02.01
리팩토링  (0) 2019.07.25
RESTFul Api 3장 HTTP를 이용한 인터랙션 설계  (0) 2019.03.05

댓글