Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 2019카카오코테
- 윤곽선검출
- 이것이자바다9장
- 백준9012
- KT포트포워딩
- 백준괄호
- 코테
- 이것이자바다확인문제
- 확인문제
- 컴퓨터비전
- 운영체제
- 백준10828
- 백준스택
- 스파르타코딩클럽
- 백준평범한배낭
- 코딩테스트실력진단
- 냅색알고리즘
- 카카오코테
- 코드트리
- BOJ
- 딥러닝
- 합성곱연산
- 가운데를말해요
- java
- 백준온라인저지
- 웹개발기초
- 백준가운데를말해요
- 백준
- 이것이자바다
- BOJ1655
Archives
- Today
- Total
코딩하는 락커
섹션 7: "유틸리티 컨테이너"로 작업하기 & 컨테이너에서 명령 실행하기 본문
모듈 소개 & "유틸리티 컨테이너"란 무엇인가?
- 유틸리티 컨테이너: 특정 환경만 포함하는 컨테이너를 의미함
- 유틸리티 컨테이너에서 환경을 시작할 때 애플리케이션을 시작하지 않음
- 대신 특정 작업을 실행하기 위해 지정한 명령과 함께 실행함
유틸리티 컨테이너: 왜 사용하는가?
- 많은 프로젝트와 많은 프로그래밍 언어는 프로젝트 초기 생성시 호스트 컴퓨터의 시스템에 설치할 부가적인 툴이 필요함
- 이 부분을 유틸리티 컨테이너가 도와줄 수 있음
컨테이너에서 명령을 실행하는 다양한 방법
- 빈 프로젝트 생성 후 터미널 입력
- 도커 허브의 공식 node 이미지 실행
$ docker run node
- 결과
- 즉시 중지됨
- 인터렉티브 모드에서 시작해야 하는 이미지이기 때문
- 인터렉티브 모드로 재시작
- 몇몇 기본 명령어 실행가능
- 중요한 점은 노드 컨테이너를 이러한 방식으로 시작할 수 있다는 것임
$ docker run -it node
- 인터렉티브 모드 + detached 모드로 재시작
- 명령을 입력할 수는 없지만 내부적으로 컨테이너는 입력을 계속 기다리고 있으므로 컨테이너가 계속 실행됨
$ docker run -it -d node
- 실행중인 컨테이너에 추가 명령어 실행
- docker exec 실행중인_컨테이너_이름: 컨테이너가 실행하는 기본 명령 외에 실행 중인 컨테이너 내에서 특정 명령을 실행할 수 있음. 인터렉티브 모드에서 시작되어야만 함
- 즉 애플리네이션은 계속 실행 중인 상태에서 컨테이너 내에 추가적인 명령을 실행할 수 있음
- npm init: 노드 프로젝트 생성
- 실행 후 설치할 패키지 이름을 입력하면 컨테이너 내부에 생성될 새로운 프로젝트의 설정을 입력할 수 있음
$ docker exec -it magical_chandrasekhar npm init
- 디폴트 명령을 오버라이드 하여 실행
- node 컨테이너를 시작할 때 컨테이너에서 실행되는 디폴트 명령은 node 실행 파일 그 자체이며, node 이미지가 실행되어 node 명령을 실행할 수 있는 인터렉티브 모드로 진입함
- npm init을 지정하면 인터렉티브 입력 node 코드 모드를 진행하는 대신 npm init을 실행하게 됨
$ docker run -it node npm init
첫 번째 유틸리티 컨테이너 구축
- dockerfile 작성
# 14-alpine 버전 사용
# node 버전 14이지만 내부적으로 조금 더 슬림한 운영 체제인 alpine 버전을 사용함
# 유틸리티 컨테이너를 만들기 위해서 더 슬림한 설정을 필요로 함
FROM node:14-alpine
# 작업 디렉토리 설정
# 이 컨테이너와 이 이미지에서 실행되는 명령에 의해 사용될 폴더 설정
WORKDIR /app
# CMD npm init 명령어를 작성하지 않도록 하여
# 사용자에게 이 이미지에 대한 모든 권한 부여
- 노드 유틸리티임을 지정하여 빌드
- -t node-util: 노드 유틸리티임을 의미하는 태그 지정
$ docker build -t node-util .
- 빌드 완료 후 node-util 이미지에 "npm init" 명령어를 실행하고 미러링 하기
- 미러링: 컨테이너에서 생성한 것들을 호스트 컴퓨터에서 사용하게 함. 즉 컨테이너로 호스트 컴퓨터에서 프로젝트 생성
- 유틸리티 컨테이너를 사용하여 호스트 컴퓨터에 부가 도구를 설치하지 않고도 node 프로젝트를 실행할 수 있음
- -it : 인터렉티브 모드에서 실행
- -v {바인드_마운트_할_폴더의_위치}:{컨테이너_작업_디렉토리} : 폴더를 작업 디렉토리에 바인딩함
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util npm init
- 결과
- 컨테이너의 package.json이 호스트 컴퓨터 프로젝트에도 나타남
ENTRYPOINT 활용
- Dockefile 수정
FROM node:14-alpine
WORKDIR /app
# CMD와의 차이점
# 아래 명령어로 실행한다고 했을 때
# docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util npm init
# CMD ["executalbe"] 작성시 실행되는 명령어
# docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util "executable"
# 즉, docker run {이미지_이름} 뒤의 명령이 "executable"으로 덮어쓰여짐
# ENTRYPOINT ["executalbe"] 작성시 실행되는 명령어
# docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" node-util "executable" npm init
# 즉, docker run {이미지_이름} 뒤의 명령이 "executable" 뒤에 추가됨
ENTRYPOINT [ "npm" ]
- -t mynpm 태그를 사용하여 태그
$ docker build -t mynpm .
- 컨테이너 실행
- 여기서 npm init 이 아니라 그냥 init으로 작성하는데 그 이유는 Dockerfile에서 ENTRYPOINT로 npm 을 이미 입력해줬기 때문에 작성할 필요가 없음
- 모든 npm 명령어를 실행할 수 있음
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" mynpm init
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" mynpm install
- 명시적 종속성 설치
- express --save: 명시적 종속성 설치
- --save: npm install 명령이 이 프로젝트에 대한 종속성으로 express 패키지를 추가하도록 허용하는 플래그
$ docker run -it -v "/Users/roxyyujin/Docker & Kubernetes/docker-complete:/app" mynpm install ex
Docker Compose 사용
- docker-compose.yml 파일 작성
version: "3.8"
services:
# 서비스명 지정
npm:
# 도커 파일 위치 지정
# 즉, 이 컨테이너가 사용될 때 이 이미지를 빌드해야 함을
# 컴포즈에게 알려줌
build: ./
# 입력이 필요한 명령의 경우 입력을 받게 함
stdin_open: true
tty: true
# docker-compose.yml 파일이 있는 폴더를
# 컨테이너 내부의 'app'폴더에 연결하여
# 바인드 마운트 추가
volumes:
- ./:/app
- docker compose로 실행
- docker-compose up: docker-compose.yml 파일에 정의된 서비스를 불러오기 위한 명령어
- docker-compuse run
- yml 파일에 여러 서비스가 있는 경우에 단일 서비스로 실행할 수 있음
- 서비스 이름으로 단일 서비스를 지정 가능
- 여기서는 npm
- 그 뒤에 도커 컴포즈에 의해 생성된 이미 실행중인 컨테이너에 ENTRYPOINT 다음 추가되어야 할 명령을 넣음
$ docker-compose run npm init
- 컨테이너 종료시 자동으로 제거되도록 실행
- -down: docker-compose up 명령시 컨테이너가 자동으로 제거되도록 함
- 그러나 run 명령으로는 down 태그를 사용할 수 없음
- --rm: docker-compose run 명령어 사용시 컨테이너가 자동으로 제거되도록 함
$ docker-compose run --rm npm init
'🐳 도커와 쿠버네티스' 카테고리의 다른 글
섹션 8: 더 복잡한 설정: Laravel & PHP 도커화 프로젝트 (0) | 2022.08.15 |
---|---|
섹션 6: Docker Compose: 우아한 다중 컨테이너 오케스트레이션 (0) | 2022.07.26 |
섹션 5: Docker로 다중 컨테이너 애플리케이션 구축하기 (0) | 2022.07.13 |
섹션4: 네트워킹: (교차) 컨테이너 통신 (0) | 2022.07.06 |
섹션3. 데이터 관리 및 볼륨으로 작업하기 (0) | 2022.06.29 |
Comments