728x90
반응형

1. Dockerfile 작성

프로젝트 루트경로에 작성해준다.

FROM openjdk:11
# FROM amazoncorretto:11 ==> amazon corretto 11 사용할 경우
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","/app.jar"]
# => 설정파일을 분리해서 사용할 때
# java -jar -Dspring.profiles.active=prod app.jar

 

2. Build

# Spring Boot 빌드
./gradlew build -x test

 

3. 이미지 생성

# gradle linux/amd64 옵션은 맥북 M1을 위한 옵션
$ docker build --build-arg DEPENDENCY=build/dependency -t 도커허브 ID/Repository --platform linux/amd64 .

# maven
$ docker build -t 도커허브 ID/Repository --platform linux/amd64 .

# 확인
$ docker images

 

Spring Boot 2.3.x 버전 이상인 경우 Dockerfile 작성 없이 Plugin으로 이미지 생성이 가능하다.

# yml, properties를 여러개 사용하는 경우 profile을 지정하여 image를 생성한다.
$ ./gradlew bootBuildImage --imageName=ID/Repository

4. Docker 업로드

# 로그인
$ docker login

# 업로드
$ docker push ID/Repository

 

배포 팁

환경변수중에 SPRING_PROFILES_ACTIVE=prod 를 지정하면 자동으로 application-prod.properties 파일을 바라봅니다.

개발할 땐 application.properties 설정을 바라보고 docker로 운영 서버에 배포할 땐 -e SPRING_PROFILES_ACTIVE=prod 만 추가하면 됩니다.

728x90
반응형
728x90
반응형

1. Docker를 설치한다.

https://typo.tistory.com/entry/Docker-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0?category=896128 

 

Docker | 시작하기

1. Docker 란?  Docker란 컨테이너를 생성하고 관리하기 위한 도구이다. 여기서 컨테이너란 표준화된 소프트웨어 유닛을 말한다. 기본적으로 해당 코드를 실행하는데 필요한 종속성과 도구가 포함

typo.tistory.com

 

2. Spring Boot 프로젝트를 만든다.

https://start.spring.io/

 

3. IntelliJ에서 열고 Docker plugin을 설치한다.

 

4. 프로젝트 루트 경로에 Dockerfile을 생성한다.

/Dockerfile

FROM openjdk:11
# FROM amazoncorretto:11 ==> amazon corretto 11 사용할 경우
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# ENTRYPOINT ["java","-jar","-Dspring.profiles.active=prod","/app.jar"]
# => 설정파일을 분리해서 사용할 때
# java -jar -Dspring.profiles.active=prod app.jar

 

5. 아래 명령어로 빌드를 해준다.

./gradlew build -x test

 

6. Dockerhub Repository 생성

 

7. 이미지 생성

Spring Boot 2.3.x 버전 이상인 경우 Dockerfile 작성 없이 Plugin으로 이미지 생성이 가능하다.

# yml, properties를 여러개 사용하는 경우 profile을 지정하여 image를 생성한다.
# SPRING_PROFILES_ACTIVE=dev
# ./gradlew bootBuildImage -Pprofile=dev --imageName=ID/Repository
$ ./gradlew bootBuildImage --imageName=ID/Repository

 

※ 아닐 경우

# gradle linux/amd64 옵션은 맥북 M1을 위한 옵션
$ docker build --build-arg DEPENDENCY=build/dependency -t 도커허브 ID/Repository --platform linux/amd64 .

# maven
$ docker build -t 도커허브ID/Repository --platform linux/amd64 .

# 확인
$ docker images

 

8. 업로드

# 로그인
docker login

# 업로드
docker push ID/Repository

 

728x90
반응형
728x90
반응형
.env
node_modules
pakage-lock.json
config.json

# Logs
logs
logs/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Snowpack dependency directory (https://snowpack.dev/)
web_modules/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test
.env.production

# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache

# Next.js build output
.next
out

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port

# Stores VSCode versions used for testing VSCode extensions
.vscode-test

# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

# vscode
.vscode

# Dev Files
ConstantLocal.js
RESTLocal.js
728x90
반응형
728x90
반응형

1. Docker Compose 란?

  1. 'docker build'와 'docker run' 명령을 대체할 수 있는 도구
  2. Dockerfile을 대체하지 않는다. 함께 작동한다.
  3. 이미지나 컨테이너를 대체하지 않는다.
  4. 다수의 호스트에서 다중 컨테이너를 관리하는데는 적합하지 않다.

 

2. Docker Compose를 쓰는 이유?

기본적으로 터미널에서 도커 명령으로 할 수 있는 것들을 service(컨테이너) 로 관리할 수 있다.

  • 포트 정의
  • 환경변수 정의
  • 볼륨 정의
  • 네트워크 정의

 

3. 사용하기

프로젝트 루트 파일에 docker-compose.yaml 파일을 생성해준다.

 

 ( https://docs.docker.com/compose/compose-file 참조 )

 

/docker-compose.yaml

version: "3.8"
service:
	mongodb:
		# 이미지
		image: 'mongo'
        
		# 볼륨
		volumes:
			- data:/data/db
            
		# 환경변수
		environmnet:
			MONGO_USERNAME: max
            
		# 환경변수 파일일 경우
		env_file:
			- ./env/mongo.env
            
		# 네트워크
		networks:
			- goals-net
	backend:
    	
	frontend:

 

4. Linux에 Docker Compose 설치

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose --version

 

5. Docker Compose up

아래 명령어를 입력하면 이미지를 빌드하고 컨테이너를 실행해준다.

-d 플래그를 붙여 detached 모드에서 실행할 수도 있다.

$ docker-compose up

 

6. Docker Compose down

아래 명령어를 입력하면 모든 컨테이너가 삭제되고 디폴트 네트워크와 모든 것이 종료된다.

-v 플래그를 추가해 볼륨도 삭제할 수 있다.

$ docker-compose down

 

 

7. Backend file, Frontend file 컴포징

version: "3.8"
service:
	mongodb:
    	...
	backend:
		
		# 이미지 빌드
		build: ./backend
		
		# 도커 파일 직접 명시할 때 ( 파일 이름이 Dockerfile이 아닐 때 )
		# build:
		#	context: ./backend
		#	dockerfile: Dockerfile
		#	args:	
		#		some-arg: 1
		
		# 포트지정
		ports:
			- '80:80'	
		
		# 볼륨지정		
		volumes:		
			- logs:/app/logs	
			- ./backend:/app	
			- /app/node_modules	
		
		# 환경 변수 파일	
		env_file:
			- ./env/backend.env
				
		# 의존성 추가
		depends_on				
			- mongodb
						
		
		
	frontend:
    
		# 이미지 빌드
		build: ./frontend
        
		# 포트지정
		ports:
			- '80:80'	

		# 볼륨지정		
		volumes:		
			- ./frontend/src:/app/src

		# it 플래그
		stdin_open: true
		tty: true
        
		# 의존성 추가
		depends_on
			- mongodb
728x90
반응형
728x90
반응형

1. Network 생성

$ docker network create goals-net

 

2. MongoDB 컨테이너 시작

$ docker run --name mongodb \
 -e MONGO_ROOT_USERNAME=root \ <- 몽고db 아이디
 -e MONGO_ROOT_PASSWORD=secret \ <- 몽고db 비밀번호
 -v data:/data/db \ <- 몽고db 바인드 마운트
 --rm \ <- 컨테이너 중지 시 삭제
 -d \ <- detached 모드
 --network goals-net \ <- 네트워크 활성화
 mongo

 

3. NodeJS 이미지 빌드

$ docker build -t goals-node .

 

4. NodeJS 컨테이너 시작

$ docker run --name goals-backend \
 -e MONGODB_USERNAME=max \ <- 환경설정 추가(db아이디)
 -e MONGODB_PASSWORD=secret \ <- 환경설정추가(db비밀번호)
 -v logs:/app/logs \ <- 컨테이너 로그 바인딩 마운트
 -v /Users/abc/def/gh:/app \ <- 하드 드라이브 내 코드 바인딩 마운트
 -v /app/node_modules \
 --rm \
 -d \
 --network goals-net \ 
 -p 80:80 \ <- 포트 포워딩
 goals-node

 

5. ReactJS 컨테이너 시작

$ docker run --name goals-frontend \
 -v /Users/abc/def/gh/frontend/src:/app/src \ <- src 소스코드 바인딩 마운트
 --rm
 -d
 -p 3000:3000 \
 -it \ <- 개발자 모드로 실행
 goals-react

 

 

728x90
반응형
728x90
반응형

지금까지의 이미지 & 컨테이너에서는 한 종류의 데이터만 다뤄봤지만 이번엔 볼륨이라는 개념과 함께 다른 종류의 데이터들도 다뤄보는 방법을 알아보겠다.

 

1. 아래 파일을 다운로드 한다.

data-volumes-01-starting-setup.zip
0.01MB

 

npm package들을 다운받고 서버를 실행해보자.

$ npm install
$ node server.js

 

localhost 80번 포트로 웹을 열어보면

 

이런 식으로 화면이 구성 된 것을 볼 수 있다. 서버 파일을 잠시 보면

 

app.post('/create', async (req, res) => {
  const title = req.body.title;
  const content = req.body.text;

  const adjTitle = title.toLowerCase();

  const tempFilePath = path.join(__dirname, 'temp', adjTitle + '.txt');
  const finalFilePath = path.join(__dirname, 'feedback', adjTitle + '.txt');

  await fs.writeFile(tempFilePath, content);
  exists(finalFilePath, async (exists) => {
    if (exists) {
      res.redirect('/exists');
    } else {
      await fs.rename(tempFilePath, finalFilePath);
      res.redirect('/');
    }
  });
});

내가보낸 피드백이 파일 형식으로 저장이 되는 것 또한 볼 수 있다.

 

이제부턴 이 앱을 도커화를 해보자. 먼저 Dockerfile을 만들어준다.

 

/Dockerfile

FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

CMD ["node","server.js"]

 

터미널에서 만든 Dockerfile로 이미지를 빌드한다.

$ docker build -t feedback-node .

 

빌드된 이미지로 run 명령어를 실행한다.

$ docker run -p 3000:80 -d --name feedback-app --rm feedback-node

 

이제는 localhost 3000번 포트에서 사이트를 볼 수 있다.

여기서 피드백을 작성하고 저장을 하면 localhost:3000/feedback/title.txt ( 피드백 제목 )

경로에서 내용을 확인할 수도 있다. ( 서버파일 참조 )

 

하지만 우리는 이미 켜둔 VSCode 프로젝트 안에서는 feedback 폴더 밑에 파일이 생기지 않은 것을 알 수 있다.

이는 당연하겠지만 이미지는 컨테이너를 만드는데에 쓰임이 끝났고, 파일은 격리된 컨테이너에만 생성됐기 때문이다.

 

2. 볼륨이란?

볼륨은 도커에 내장된 기능이며 위에 경우처럼 컨테이너가 삭제될 경우 데이터를 보존할 수 있도록 도와준다.

볼륨은 컨테이너나 이미지에 있는게 아니라 호스트 컴퓨터에 장착된 하드 드라이브에 존재하여 사용가능하거나 컨테이너로 매핑되는 것을 의미한다.

 

3. 컨테이너에 볼륨 적용하기

Dockerfile 파일 안에 VOLUME 을 추가해줄 수 있다.

/Dockerfile

FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

# 저장하려는 볼륨
VOLUME ["/app/feedback"]

CMD ["node","server.js"]

 

이제 다시 이미지를 빌드하고 실행해보자.

$ docker build -t feedback-node:volumes .
$ docker run -d -p 3000:80 --rm --name feedback-app feedback-node:volumes

 

이러고 서버를 실행해보면 

피드백을 작성하고 저장버튼을 누르면 로딩이 되면서 더이상 진행이 안되는 것을 확인할 수 있다. 

로그를 확인해보자.

 

$ docker logs feedback-app

 

/create 라우터를 보면 fs.rename이라는 메소드가 있는데 이 부분을 바꿔준다.

app.post('/create', async (req, res) => {
  const title = req.body.title;
  const content = req.body.text;

  const adjTitle = title.toLowerCase();

  const tempFilePath = path.join(__dirname, 'temp', adjTitle + '.txt');
  const finalFilePath = path.join(__dirname, 'feedback', adjTitle + '.txt');

  await fs.writeFile(tempFilePath, content);
  exists(finalFilePath, async (exists) => {
    if (exists) {
      res.redirect('/exists');
    } else {
      // await fs.rename(tempFilePath, finalFilePath);
      await fs.copyFile(tempFilePath, finalFilePath);
      await fs.unlink(tempFilePath);
      res.redirect('/');
    }
  });
});

 

이제 이미지를 삭제한 뒤 다시 만들고 실행해준다.

$ docker stop feedback-app
$ docker rmi feedback-node:volumes
$ docker rmi feedback-node:volumes
$ docker run -d -p 3000:80 --rm --name feedback-app feedback-node:volumes

 

다시 실행해보면 정상적으로 파일이 읽히는 것을 볼 수 있다.

 

이번엔 컨테이너를 종료하고 파일이 잘 남아있는지 확인해보자.

$ docker stop feedback-app

 

이러고 다시 실행해서 확인해보면 test.txt 가 읽혀지지 않는 것을 볼 수 있다.

 

4. 볼륨의 종류

볼륨의 종류에는 명명된 볼륨, 익명의 볼륨이 있다.

볼륨을 확인하는 명령은 다음과 같다.

$ docker volume ls

 

Dockerfile에서 VOLUME 레이어를 삭제한 뒤 이미지를 재구축하고 다시 실행해보자. 

이 때 run 명령어에 볼륨을 지칭하는 부분을 넣어준다.

$ docker stop feedback-app
$ docker rmi feedback-node:volumes
$ docker rmi feedback-node:volumes
$ docker run -d -p 3000:80 -rm --name feedback-app -v feedback:/app/feedback feedback-node:volumes

 

이러면 컨테이너를 삭제하더라도 볼륨의 데이터가 정상적으로 남아있는 것을 확인할 수 있다.

 

4. 바인드 마운트

우리가 개발한 환경을 이미지화해서 컨테이너를 만들고, 다시 이미지를 수정할 경우 계속 언급해왔듯 변경 사항이 바로 반영이 되지않으므로 이미지를 재구축하고 다시 실행해야 했다. 개발하는 동안에 코드를 수정할 때마다 이 과정을 반복하면 매우 불편하고 시간 소요도 클 것이다. 이것을 바인드 마운트가 도와준다.

 

호스트 컴퓨터의 절대경로로 현재 app이 지정하는 파일 경로를 붙여서 다음과같이 run 을 실행한다. ( 한 줄로 구성된 명령어입니다. )

$ docker run -d -p 3000:80 -rm --name feedback-app -v feedback:/app/feedback
-v "/Users/Desktop/workspace/docker:/app" feedback-node:volumes

 

5. docker volume 명령어들

 

728x90
반응형
728x90
반응형

전 포스트에서는 이미지에 대한 기본 지식과 빌드하는 방법을 살펴보았다.

이번 포스트에서는 이미지와 컨테이너를 관리하는 방법에 대해서 알아보겠다.

 

1. docker start vs docker run

docker run 명령어로 컨테이너를 실행할 때는 터미널이 더이상 명령어를 입력할 수 없는 것을 볼 수 있었다. 

docker start를 사용하면 백그라운드에서 컨테이너가 실행되기 때문에 별개로 터미널에서 다른 작업을 할 수 있다.

 

docker run 명령어로 컨테이너를 실행하면 터미널에서 실시간으로 컨테이너의 console.log 출력 결과를 확인할 수 있다.

이를 attached 모드라고 한다. 또한 컨테이너가 새로 생성되면서 실행까지 된다.

 

1. 만약 이미 실행중인 컨테이너에 연결하고 싶으면 docker  attach 를 사용하면 된다.

2. 컨테이너의 이미 지나간 로그 기록을 보고 싶으면 docker logs 라는 명령어도 존재한다. -f 옵션을 주면 attatch 까지 가능하다.

3. docker start 를 attatch 모드로 실행하고 싶으면 docker start -a 옵션을 주면 된다.

 

 

2. 컨테이너 삭제하기

컨테이너를 중지한 뒤 삭제를 안하고 새로 만들고 하다보면 언젠가 계속 쌓이게 될 것이다. 때때로 이 목록을 정리해야 될 필요가 있다.

docker rm '컨테이너이름' 명령어로 컨테이너를 삭제할 수 있는데 이는 컨테이너가 실행중이면 오류가 발생한다.

때문에 실행중이면 컨테이너를 종료하고 제거를 해야한다.

 

3. 이미지 삭제하기

이미지를 삭제할 때에는 docker rmi '이미지ID' 명령어를 사용한다. 다만 한 가지 유의사항이 있다면 해당 이미지를 가지고 있는 컨테이너가 한 개라도 존재할 경우엔 이미지 삭제가 불가능하다. 때문에 컨테이너를 먼저 삭제한 뒤 이미지를 삭제해야한다.

 

다만 docker image prune 이라는 명령어도 존재하는데, 이는 사용되지 않는 모든 이미지를 제거할 수 있게 해준다.

 

4. 중지된 컨테이너 자동으로 제거하기 

이미지로 docker run 을 실행하여 만들어진 컨테이너를 중지될 때 자동으로 제거하게끔 만드는 명령어가 있다.

docker run -p 3000:80 -d --rm '이미지id'

 

5. 컨테이너와 이미지에 이름 지정 & 태그 지정하기

 컨테이너의 자동 생성된 이름을 사용하기에는 불편함이 있을 수 있다. ( 까먹거나 너무 길 경우에 )

docker run -p 3000:80 -d --rm --name teepo '이미지id'

 

이미지에는 이름과 태그를 설정할 수 있는데,

name : tag 이런식으로 설정된다. ( tag 는 부 주제로 버전 등을 나타낼 수 있다)

docker build -t teepo:latest -> latest는 최신 버전임을 나타냄, 숫자도 가능

 

docker images 명령어로 이미지들을 확인할 수 있다.

 

 

728x90
반응형
728x90
반응형

1. 이미지 vs 컨테이너

 컨테이너는 애플리케이션, 웹사이트, 노드 서버, 애플리케이션을 실행하는 전체 환경 등 무엇이든 포함하는 유닛 패키지다.

이미지는 쉽게 말해 컨테이너의 블루프린트가 되는 것인데, 실제로 코드와 코드를 실행하는데 필요한 도구를 포함한다.

예를 들어 NodeJS 환경이 깔린 이미지가 있으면 도장처럼 찍어서 여러개의 nodeJS 환경이 구성된 컨테이너를 만들어낼 수 있다.

 

2. 외부 (사전 빌드된) 이미지의 사용 및 실행

 도커 허브 사이트에 가보면 매우 일반적인 ( 우분투나 node 같은 ) 이미지를 받을 수 있다.  아래 명령어를 입력해보자.

$ docker run node

 그 다음 아래 명령어를 입력하면 컨테이너가 생성되어 실행되는 것을 확인할 수 있다.

 

$ docker ps -a

 

도커 프로그램을 켜봐도 알 수 있다.

 

보통은 이렇게 일반적인 이미지로 컨테이너를 만들고 자신의 환경에 맞게 코딩한 다음 나만의 이미지로 만들어서 사용한다.

 

3. 나만의 node 이미지 만들기

1. 먼저 파일을 다운로드 받고 VSCode 에서 폴더를 연다.

nodejs-app-starting-setup.zip
0.00MB

 

2. 설치된 npm 패키지들을 받기 위해 아래 명령어를 입력한다.

$npm install

 

 

3. Docker 확장 프로그램을 설치하고 다운로드 받았던 프로젝트 안에 Dockerfile 을 만들어준다.

 

 

/Dockerfile

# 위에서 도커 허브 node 이미지를 기반으로 로컬로 다운로드 및 캐싱 되었기 때문에 이미지를 가져올 수 있다.
FROM node 

# 만약 컨테이너 안의 이미지의 경로가 /app 이런식으로 되어있다면 작업할 div 경로를 설정할 수도 있다.
# 설정해주면 COPY 의 두번째 경로를 ./ 이것으로 했을 때 자동으로 /app 경로가 된다.
WORKDIR /app

# 어떤 파일이 이미지에 들어가야 하는지 
# 첫 번째 .은 이 프로젝트의 모든 폴더 및 파일들 (Dockerfile을 제외한)
# 두 번째 .은 파일을 저장할 컨테이너 내부 경로 (ex /app)
COPY . /app

# 이미지를 받으면 npm install을 자동으로 해줌
RUN npm install

# 도커에게 우리가 서버를 실행할 포트를 말해준다.
EXPOSE 80

# 이미지가 생성될 때 실행되지 않고 컨테이너가 실행될 때 수행하는 명령어
CMD ["node", "server.js"]

 

4. 터미널에서 아래 명령어를 입력해보자

$docker build .

위에 생성된 image ID 를 복사해서 docker run을 해보면,

이렇게 컨테이너가 실행된 것을 확인할 수 있다.

 

이제 이미지로 만들었고 컨테이너 실행도 했겠다 80번 포트에 열린 사이트를 확인해 보자.

??? 화면이 뜨질 않는다 이 이유는 아래에 나온다.

 

 

5. docker ps 명령어를 입력하면 현재 실행중인 프로세스를 확인할 수 있다.

컨테이너 실행도 잘 되었다. 하지만 우리는 문서상으로만 포트 80번을 expose 한다고 명시하였고, 실제로 컨테이너안의 포트를 로컬 포트에 할당시켜주질 않았다. 이는 run 명령어를 실행할 때 쓰면 된다. 일단 컨테이너를 중지시키고 포트를 할당해준 뒤 다시 시작해보자.

 

$ docker stop '위에서 확인한 컨테이너의 이름'

 

 

포트를 할당해주고 다시 실행한다. (위에서 만들었던 컨테이너의 id 를 씁니다.)

$ docker run -p 3000:80 sha256:5ed67ec470b78df4b721d82a9ae3924059e432e58d710782d2f73a6efd6dbb75

 

그 다음 웹을 켜보면

로컬 3000번 포트에 컨테이너의 80번 포트가 할당되어 잘 나타나는 것을 볼 수 있다.

 

이미지는 읽기 전용이기 때문에 이 방법으로는 만약 변경사항이 생겨 적용하고 싶으면 이미지를 다시 빌드해야 한다.

 

 

또한 Dockerfile 이미지 레이어에는 캐시를 사용하는데, 빌드했었던 이미지를 다시 빌드할 때 변경사항이 없으면 매우 빠르게 빌드된다. 

이것을 이용해서 다음과 같이 npm package에 대한 변경사항이 없을 때 npm install 을 빠르게 넘어갈 수도 있다

 

/Dockerfile

# 위에서 도커 허브 node 이미지를 기반으로 로컬로 다운로드 및 캐싱 되었기 때문에 이미지를 가져올 수 있다.
FROM node 

# 만약 컨테이너 안의 이미지의 경로가 /app 이런식으로 되어있다면 작업할 div 경로를 설정할 수도 있다.
# 설정해주면 COPY 의 두번째 경로를 ./ 이것으로 했을 때 자동으로 /app 경로가 된다.
WORKDIR /app

# package.json 파일을 복사한다. 만약 다시 빌드할 때 변경사항이 없을 경우 npm install까지 그냥 넘어간다.
COPY package.json /app

# 이미지를 받으면 npm install을 자동으로 해줌
RUN npm install

# 어떤 파일이 이미지에 들어가야 하는지 
# 첫 번째 .은 이 프로젝트의 모든 폴더 및 파일들 (Dockerfile을 제외한)
# 두 번째 .은 파일을 저장할 컨테이너 내부 경로 (ex /app)
COPY . /app

# 도케에게 우리가 서버를 실행할 포트를 말해준다.
EXPOSE 80

# 이미지가 생성될 때 실행되지 않고 컨테이너가 실행될 때 수행하는 명령어
CMD ["node", "server.js"]

 

 

728x90
반응형
728x90
반응형

1. Docker 란?

 Docker란 컨테이너를 생성하고 관리하기 위한 도구이다. 여기서 컨테이너란 표준화된 소프트웨어 유닛을 말한다.

기본적으로 해당 코드를 실행하는데 필요한 종속성과 도구가 포함된 패키지라고 보면 된다. 컨테이너라는 곳에 우리가 개발을 한 환경 자체를 넣어버리고 그 환경을 다른 곳에서 불러오면 문제없이 동일하게 사용할 수 있다.

 

2. 컨테이너가 왜 필요한가?

소프트웨어에서 왜 독립적인 표준화된 애플리케이션 패키지를 원하는지에 대한 이유를 생각해보면 컨테이너의 중요성을 좀 더 정확하게 깨닫게 된다. 도커의 주요 사용 사례 중 하나는 우리가 종종 다른 개발 제품 생산 환경을 가지게 될 때 환경 별로 관리하기 위한 사례인데,

 

예를 들어 Node js 버전이 14.3인 환경에서 

다음과 같은 코드를 짰을 때 에러가 뜨는 것을 확인할 수 있고 이에 따라 우리는 14.13 보다 높은 버전이 필요한 것을 알게 된다.

이와 같이 버전 문제로 인해 문법에 에러가 뜨는데 우리가 사용할 수 있는 환경이 로컬밖에 없다면 이 코드는 아예 사용할 수 없을 것이다.

그렇다고 코드 자체를 버리기엔 애매한 상황이 있을 때 우리가 로컬 환경 자체를 바꾼다고 해서(Node js 버전 업그레이드 등)는 상당한 소요가 필요할 것이다. (이 코드 뿐만 아니라 다른 곳에서 에러가 뜰 수도 있기 때문에)

이 때 애플리케이션이 자체적으로 필요한 Node 버전을 제공하는 컨테이너를 사용한다면 테스트를 해보기에 훨씬 편리할 수 있다.

 

물론 프로젝트가 몇 개 안되고 모든 프로젝트가 하나의 버전을 똑같이 사용한다면 별로 필요가 없겠지만, 큰 회사에서 복잡한 프로젝트들이 여러개 있을 경우 각각의 프로젝트에 적합한 버전이 있을 수도 있을 것이고, 그 복잡한 프로젝트를 똑같은 버전으로 만드는 것 자체가 큰 일이 될 수도 있다고 생각되었다. 그럴 때 컨테이너를 여러개 만들고 버전별로 관리하면 상당히 유용할 것이다.

 

3. 가상 머신과 도커 컨테이너의 차이점?

물론 위의 상황이 있을 때 가상머신으로도 버전 별로 프로젝트를 관리하는 것은 가능하다. 하지만 가상 머신을 사용할 때 가장 큰 문제점은 오버헤드이다. 컴퓨터 안에 컴퓨터를 집어넣는 행동을 여러번 반복하다보면 메모리, cpu, 내 하드 드라이브의 공간을 낭비하게 될 것이고 컴퓨터는 계속 무거워지고 나중엔 오버헤드가 발생할 것이다. 실제로 학생 때 가상 머신을 사용해봤는데 가상 환경을 한 개만 만들었어도 컴퓨터 성능이 별로 좋지 않으면 내 컴퓨터 자체가 느려지는 것을 볼 수 있었다. 이에 비해 컨테이너는 자체에 OS를 가지고 있고, 가상 머신보단 훨씬 가벼운 느낌이 있다.

 

4. Windows 에서 도커 설치하기

https://typo.tistory.com/entry/Docker-in-Windows?category=896128 

 

Docker | Windows |Docker in Windows

먼저 Windows 에서 도커를 사용하기 위해선 WSL2(Windows Subsystem for Linux 2)가 필요하다. 마이크로소프트 스토어에서 Windows Terminal을 다운받는다. 그다음 관리자 권한으로 실행한다. 터미널에 DISM 명..

typo.tistory.com

 

 

5. MacOS 에서 도커 설치하기

https://www.docker.com/products/docker-desktop/

 

Docker Desktop - Docker

MOST COMMON

www.docker.com

 

해당 사이트에서 다운로드 받으면 된다.

 

 

728x90
반응형
728x90
반응형

윈도우 하위시스템에서 우분투 컨테이너를 사용할 때 기존 mongo 사용법과 달리

sudo service mongod start 명령어가 안먹힐 때가 있다.

 

그럴 땐 먼저 아래 링크로 들어가 복사를 한다.

https://github.com/mongodb/mongo/blob/master/debian/init.d

 

GitHub - mongodb/mongo: The MongoDB Database

The MongoDB Database. Contribute to mongodb/mongo development by creating an account on GitHub.

github.com

 

데비안 계열의 우분투에서 쓰는 init script 내용을 아래 명령어로 들어가 붙여넣기한다.

$ sudo vi /etc/init.d/mongod

 

그 다음 권한을 설정해준다.

$ chmod 755 mongod

 

이제는 명령어가 잘 먹히는 것을 확인할 수 있다.

 $ sudo service mongod start
728x90
반응형

+ Recent posts