Skip to main content

Command Palette

Search for a command to run...

Docker-Utility Containers

Updated
3 min read
Docker-Utility Containers

유틸리티 컨테이너

유틸리티 컨테이너란?

유틸리티 컨테이너는 애플리케이션이 담긴 컨테이너가 아니라 특정 환경만 포함하는 컨테이너를 의미한다. 예를 들면 NodeJS환경이나 PHP환경같은 것을 말하는 것이다.

왜 사용하는가?

기본적으로 호스트 머신에 환경을 구축하지 않고 이를 도커를 통해 사용하기 위해서 이용한다.


컨테이너에서 명령을 실행하는 다양한 방법

docker run node를 터미널에서 입력하면 컨테이너가 그대로 죽는다. interactive모드로 실행해야 정상 작동하기 때문이다.

docker run -it node 로 실행하면 터미널에서 interactive모드로 노드 컨테이너를 돌려서 실행할 수 있지만 우리가 원하는 건 detached모드에서(백그라운드에서 실행하면서) 컨테이너가 죽지 않게 하는 것이다. 이것은 간단하게

docker run -it -d node

-d옵션 하나만 더 붙여줘도 가능하다.

이를 실행하고 docker ps를 통해 실행중인 컨테이너를 확인하면

docker ps                                                                  ─╯
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
4551887165c2   node      "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds             eager_dubinsky

이런식으로 컨테이너가 생성된 것을 볼 수 있다.

그런데 이제 위에 만들어둔 컨테이너 내에 npm init이든, 뭐든 컨테이너 내부에 명령을 실행하고 싶을 수 있다. 그런데 이제 interactive모드에서 직접 터미널에서 바로 명령을 주는 것이 아니라, 저렇게 백그라운드에서 둔 상태로.

이를 위해 docker exec 명령어를 쓸 수 있다.

docker exec는 아까 말한 바와 같이 컨테이너에 특정 명령어를 실행할 수 있게 한다.

아까 docker run node-it 옵션을 붙여서 실행해야했으므로 마찬가지로

docker exec -it node_container_name npm init

을 실행하면 패키지에 대해 입력을 받는 부분들이 나오고 컨테이너에 패키지가 설치된다. 이러면 호스트 머신에 이들을 설치하지 않아도 환경을 만들 수 있다.


유틸리티 컨테이너 구축하기

만약 아래와 같은 도커파일을 작성했을 때

FROM node:14-alpine

WORKDIR /app

아래에 CMB npm init을 한 줄 더 적어줄 수도 있지만 init명령만 실행하는 것보다 유연하게 만들고자 한다.

그래서 도커파일은 위 상태 그대로 놔두고 이미지를 빌드해준 후 아까 했던대로 npm init명령어를 컨테이너에서 실행하고자 한다.

그런데 여기서 명령어는 컨테이너 내부에서만 돌기 때문에 이를 호스트 머신에서 관측하기 위해 미러링을 하려고 하는데, 이건 바인드 마운트를 이용해줄 수 있다.

docker run -it -v /home/max/devops/study_docker/section7:/app node-util npm init

와 같이 실행해주면 호스트 머신에도 package.json(컨테이너의 npm init 옵션에서 사용한 것들이) 생성된다.


ENTRYPOINT

ENTRYPOINTCMD와 외관상 유사해보이는 명령인데, 작동 방식은 조금 다르다.

CMD명령의 경우 CMD를 도커파일에 지정해놓아도 위에서 실행한 npm install명령을 실행해주면 도커파일에 있는 것을 덮어씌우고 진행되지만,

ENTRYPOINT의 경우 덮어씌우는 것이 아니라 그 뒤에 들어가게 된다. 그러니까

FROM node:14-alpine

WORKDIR /app

ENTRYPOINT ["npm"]

의 도커파일로 이미지를 빌드했다면

docker run -it -v /home/max/devops/study_docker/section7:/app node-util npm init

이렇게 init만 붙여도 되는 것이다.

마찬가지로

docker run -it -v /home/max/devops/study_docker/section7:/app node-util npm install express --save

도 같은 방식으로 실행해줄 수 있다.


Docker Compose 사용하기

도커파일이 하나이지만 도커 컴포즈를 여기서도 유용하게 사용할 수 있다.

version: "3.8"
services:
  npm:
    build: ./
    stdin_open: true
    tty: true
    volumes:
      - ./:/app

아까 엔트리포인트를 사용한 도커파일을 둔 디렉토리에 이런 식으로 도커 컴포즈 파일을 작성했을 때

단순히 docker compose up을 하게 되면 ENTRYPOINT ["npm"]밖에 없기 때문에 npm init이라든가 그 이후의 명령은 바로 실행되지 않는다.

그래서 사용할 수 있는 것이 docker compose run인데,

docker compose run npm init

을 실행해주면 우리가 원하는대로 npm init을 돌려줄 수 있다. 여기서 npm은 컴포즈 파일의 서비스 이름에서 온 것이고, init은 엔트리 포인트 이후의 명령이다.

그런데 docker compose rundocker compose up과 다르게 docker compose down에 대응하는 것이 없다. 기본적으로 컨테이너가 시작되어 명령이 완료되면 종료되지만, 자동으로 제거되지는 않는다.

docker compose run --rm으로 --rm을 달아주면 종료될 시 자동으로 제거되게 할 수 있다.

17 views

More from this blog

락프리 데이터 구조와 알고리즘

여기서는 락프리 데이터 구조를 설명한다. 락프리(lock-free) 란 배타락을 이용하지 않고 처리를 수행하는 데이터 구조 및 그에 대한 조작 알고리즘을 총칭한다. 왜 락프리인가? 전통적인 동시성 제어 방법인 뮤텍스나 세마포어는 여러 문제점을 가지고 있다: 성능 저하: 락 경합(lock contention)으로 인한 대기 시간 데드락: 여러 스레드가 서로의 락을 기다리는 상황 우선순위 역전: 낮은 우선순위 스레드가 높은 우선순위 스레드를 ...

Jul 27, 20257 min read126

소프트웨어 트랜잭셔널 메모리

소프트웨어 트랜잭셔널 메모리 동시성 프로그래밍에서 공유 자원에 대한 안전한 접근은 항상 중요한 과제다. 전통적으로 뮤텍스 락과 같은 비관적 락(Negative Lock) 방식을 사용해왔다. 이 방식은 크리티컬 섹션에 진입하기 전에 반드시 락을 획득해야 하며, 락을 얻지 못하면 코드 실행 자체가 블록된다. 하지만 이와는 다른 접근 방식이 있다. 바로 낙관적 락(Optimistic Lock) 방식인데, 이는 "일단 실행하고 나중에 검증하자"는 철학...

Jul 20, 202517 min read263

공평한 배타 제어

공평한 배타 제어 여기서는 공평한 배타 제어에 대해 설명한다. 먼저 컨텐션(contention) 이라는 개념을 이해할 필요가 있다. 컨텐션이란 여러 스레드가 동시에 같은 락을 획득하려고 경쟁하는 상황을 말한다. 컨텐션이 높을수록 스레드들이 락을 기다리는 시간이 길어지고 성능이 저하된다. 이러한 컨텐션 상황은 시스템 아키텍처에 따라 더욱 복잡해질 수 있다. 특히 비균일 메모리 접근(Non-Uniform Memory Access, NUMA) 와 같...

Jul 13, 20259 min read21

KernelSnitch[논문 리뷰]

Paper 1. Intro 이 글은 NDSS 2025에서 발표된 KernelSnitch 논문을 소개이다. 이 연구는 커널의 평범한 데이터 구조체들이 가진 본질적인 특성이 어떻게 심각한 보안 취약점이 되는지를 보여준다. 핵심은 이러하다: "데이터 구조체의 크기에 따른 접근 시간 차이를 이용해 커널의 비밀 정보를 유출할 수 있다" 여기서는 커널 힙 포인터 유출에 집중해서 설명한다. 이 공격이 성공하면 KASLR을 우회하고 더 심각한 커널 익스플로...

Jul 11, 20257 min read131

멀티태스크와 액터 모델

멀티태스크 협조적/비협조적 멀티태스크 선점: 프로세스와의 협조 없이 수행하는 컨택스트 스위칭이라고는 하나, 결국 뺏어오는 게 가능하냐의 문제다. 협조적 멀티태스크(비선점형, cooperative): 각각의 프로세스가 자발적으로 컨택스트 스위칭을 수행하는 멀티태스크 방식. 장점: 멀티태스크 매커니즘을 구현하기 쉽다. 단점: 프로세스가 자발적으로 컨텍스트 스위칭을 해야하는데, 만약 버그가 발생하여 프로세스가 무한 루프에 빠지거나 정지하게 되면 그 ...

Jul 6, 20252 min read25
M

MaxLog

35 posts