[도커 ]도커 유틸리티 컨테이너 practice

 

mkdir dockerUtility && cd $_
touch Dockerfile

dockerUtility라는 새로운 이름의 디렉토리를 만들고 도커파일을 만든다.

 

FROM node:14-alpine

WORKDIR /app

이런 내용으로 구성 된 도커파일을 빌드한다.

 

docker run -it -v /Users/june/dockerUtility:/app util npm init

디폴트로 이 명령은 컨테이너 내부의 app 폴더에서 실행된다. 그걸 로컬 폴더에 미러링 하고자 하는데, -v 옵션으로 바인드 마운트 하여서 컨테이너에서 생성한 것들을 호스트 머신에서도 사용할 수 있게 된다.

그리고 이렇게 세팅 스크립트가 나와서 다 응답을 완료하면, package.json파일이 호스트 머신에 생긴다. 바인드마운트로 컨터이너 내부의 폴더와 호스트머신의 폴더를 공유하기 때문이다. 그리고 컨테이너 내부에서 실행하는 명령은 호스트머신에도 영향을 미친다.


ENTRYPOINT

CMD와 유사하지만 중요한 차이점이 하나 있다.

CMD는 docker run에서 이미지 이름 뒤에 명령을 추가하면, 그 명령을 덮어쓴다. npm init 처럼 말이다.

하지만 ENTRYPOINT에서는 docker run에서 이미지 이름 뒤에 입력하는 모든것이 ENTRYPOINT 뒤에 추가된다.

package.json은 지워준다. 그리고 ENTRYPOINT에 ["npm"]을 넣고 -t 옵션으로 npm 이름으로 빌드를 한다.

 

docker run -it -v /Users/june/dockerUtility:/app npm init

ENTRYPOINT에 npm 이 있으니, docker run을 할 때 덮어쓰여지는것이 아니라 그 뒤에 쓰여진다. 그래서 npm init이 아니라 init을 하면 npm init이 컨테이너 내부에서 실행이되는것이다.

그리고 완료되었을 때 바인드 마운트 된 호스트의 경로에서 package.json을 확인할 수 있다.

docker run -it -v /Users/june/dockerUtility:/app npm install

이런 원리로 npm install 대신 이미지 명인 npm 뒤에 install을 넣고 실행하면 모든 종속성이 설치되는것을 알 수 있다.

하지만 명령이 종료되면 항상 컨테이너가 종료된다.


docker run -it -v /Users/june/dockerUtility:/app npm install express -save

express를 설치하고 node_modules가 생기는것도 볼 수 있다.


도커 컴포즈

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

하지만 위에 명령은 너무 길다... 그래서 도커 컴포즈 파일로 다시 만들어누다. 그러면 유지관리가 쉬워지고, 항상 다시 작성하고 그럴 필요가 없다.

build의 ./는 빌드를 할 Dockerfile이 현재 디렉토리의 경로에 있다는 의미이고

stdin_open은 -i 인터렉티브모드 옵션이다.

그리고 tty는 입력이 필요한 경우의 입력을 받겠다는 -t 옵션이다.

volumes은 바인드 마운트를 하는데 ./로 호스트머신의 현재 경로와 컨테이너의 /app 경로를 바인드 마운트 해주는것이다.

 

docker compose up

npm 커맨드 추천이 뜨면서 아무것도 안된것을 알 수 있다. npm만 입력이 된 것이기 때문이다.

ENTRYPOINT에 npm만 있고 다른 명령을 지정하지 않았기 때문이다.


docker compose run

docker compose run npm init

위 명령어로 yaml 파일에 여러 서비스가 있는 경우에 단일 서비스만 실행할 수 있다.

여기서는 서비스 이름이 npm 이니까 npm 을 run 뒤에 넣어주고, ENTRYPOINT에 쓰여있는 npm 뒤에 사용할 명령어인 init을 넣고, 실행하면 스크립트들이 나온다. 실행이 되었다는 것이다.

 docker compose run --rm npm init

docker compose run 에는 up 과 down이 없다. 그저 컨테이너가 시작되어 작업을 수행하고 명령이 완료되면 종료된다.

그러면 --rm 옵션을 주면, 명령을 실행한 후 컨테이너가 제거가 된다.

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Docker 다른 글

    이전 글

    다음 글