티스토리 뷰
요즘 도커와 쿠버네티스를 모르는 개발자는 없다. 써보지 않았더라도 적어도 들어봤을 것이다.
나도 도커와 쿠버네티스에 대해 주변에서 이야기를 많이 해 들어보긴 많이 들어봤지만 지금까지 한 번도 직접 설정하고 사용해본 적은 없다.
그래서 이제부터 공부를 하고 정리를 해보려 한다.
Docker란?
도커란 애플리케이션을 개발하고 배포하기 위한 오픈 플랫폼이다. 애플리케이션을 실행 시점의 구성을 도커 이미지라는 것으로 고정 시키고 그 이미지를 컨테이너라는 것으로 띄워 배포시킬 수 있다.
Docker Image(도커 이미지)
도커 이미지는 도커 컨테이너를 실행시킬 때 읽는 설정 파일이다.
여기에는 실행할 때 필요한 명령어와 포트 등이 포함되어 있다.
이 이미지로 독립된 인스턴스인 컨테이너를 여러 개 띄울 수 있다.
Docker Container(도커 컨테이너)
도커 이미지를 읽어 실행한 인스턴스이다.
컨테이너는 다른 컨테이너와 분리되어 있지만 호스트 OS와 커널 환경은 공유한다.
즉, 여러 개의 컨테이너가 하나의 서버에 있으면 서로 다른 시스템이 실행되는거지만 근본적인 OS와 커널은 같은 것을 공유한다는 것이다.
Docker 사용 이유
1. 여러 서버를 관리할 때 동일하게 구성할 수 있다.
보통 서버는 하나가 아니라 똑같은걸 여러 개 둔다. 이 때 A서버와 B서버가 있을 때 A 서버에 배포한 것과 B 서버에 배포한 것을 동일하게 관리하기란 여간 번거로운게 아니다. 애플리케이션을 업데이트하면서 새로 배포 할 때 A 서버에는 배포를 하지만 잊고 B 서버에는 배포를 안 할 수 있고, 애초에 두 서버를 처음 구성할 때 서로 조금씩 다르게 배포해 구성할 수 있다.
이 때 도커를 사용하면 A서버와 B서버에 동일한 이미지 파일을 이용해 컨테이너를 띄워 동일하게 배포를 할 수 있어 이 번거로움이 사라진다. 실행 시점을 고정시켜주는거라서 여러 서버가 배포된 시기가 달라도 같은 이미지 파일을 이용하면 중간에 업데이트가 있더라도 같은 실행 시점의 설정으로 서버들을 동일하게 배포할 수 있다.
2. 서버에 대해 다른 사람과 공유하기 좋다.
도커 이미지에는 서버를 배포할 때의 설정들이 담겨 있다. 그리고 이 이미지는 도커 파일로 다른 사람과 공유할 수 있다.
다른 사람에게 서버를 배포한 것에 대해 설명하고 그 사람이 같은 서버를 배포하도록 할 때 구구절절하게 이것저것 번거롭게 설명할 필요없이 도커 이미지를 주고 배포하라고 하면 같은 서버를 배포시킬 수 있다.
Docker 설치(mac)
도커는 git과 비슷하다. git이 코드를 repository에 올려서 사용하는 것처럼 도커는 도커 이미지를 repository에 올려서 사용한다.
이 때 git과 마찬가지로 도커 이미지도 로컬 repository에 올리기만 할 수도 있고 클라우드에 올려서 사용할 수 있다.
Docker download
로컬에서 도커를 사용할 수 있도록 도커를 다운로드 받아보자.
https://www.docker.com/products/docker-desktop/
설치 방법은 여타 다른 애플리케이션 설치 방법과 동일하다.
도커를 다운로드 받고 실행을 시켜보면 아래와 같이 대시보드가 나타난다.
도커 툴을 사용하다보면 곳곳에서 로그인하라는 페이지가 나타는데 이는 Docker hub 계정으로 git을 사용할 때 회원가입하는 것과 비슷하다. 회원가입을 하고
예제로 도커 컨테이너 띄우기
도커 도큐먼트를 보면 도커를 처음 다루는 사람들을 위해 예제가 나와있다.
도커가 무엇인지 감을 잡기 위해 이 예제로 컨테이너를 띄워보고 호출해보길 추천한다.
https://docs.docker.com/get-started/
1. 도커 이미지 생성
예제는 react로 구성되어 있는 간단한 node 프로젝트이다.
https://github.com/docker/getting-started/tree/master/app
프로젝트를 다운로드 받고 보면 루트에 Dockerfile과 docker-compose.yml이 있는 것을 확인할 수 있다.
여기서 Dockerfile은 도커 이미지를 생성하기 위한 파일이고 docker-compose.yml은 컨테이너를 여러 개 빌드할 때 사용되는 파일이다.
미리 생성되어 있는 Dockerfile, docker-compose.yml은 도커 도큐먼트 앱(docs 폴더)을 실행하기 위한 것이고 예제 프로젝트는 별도 Dockerfile을 생성해서 도커 이미지를 생성하고 컨테이너를 빌드해야 한다.
예제는 app 폴더 안에 있는 것으로 app 폴더 안에 Dockerfile을 생성한다.
이 때 Dockerfile 내용은 단순하게 아래와 같이 입력한다. (도커 도큐먼트에 있는 코드에서 필요없는 EXPOSE만 제거)
Dockerfile 문법에 대해서는 추후 정리해보도록 하고 간단하게 이해하면 /app에서 node src/index.js 명령어를 통해 노드 프로젝트를 실행시킨다는 것이다.
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
이와 같이 Dockerfile을 작성했다면 터미널을 열어 아래 명령어를 통해 도커 이미지를 생성한다.
(Vscode 터미널 단축키: Ctrl + `)
docker build -t getting-started .
build : Dockerfile 빌드해서 도커 이미지 생성
-t ${이미지 이름} : 도커 이미지 이름을 붙일 수 있는 옵션
. : Dockerfile이 있는 위치
도커 대시보드를 확인해보면 아래와 같이 이름을 지정한대로 getting-started로 도커 이미지가 생성된 것을 확인할 수 있다.
2. 도커 이미지 실행해 컨테이너 띄우기
도커 이미지를 생성했다면 이제 이 이미지를 실행시켜 컨테이너를 띄울 수 있다. 이거는 그냥 도커 대시보드에서 해당 도커 이미지를 RUN하면 간단하게 끝나지만 도커 명령어도 익힐겸 터미널 명령어를 통해 띄워보도록 하겠다.
터미널을 열고 아래 명령어를 입력하면 생성되어 있는 도커 이미지를 컨테이너로 띄울 수 있다.
docker run -dp 3000:3000 getting-started
run : 도커 이미지 실행
-d : 백그라운드에서 실행(이 옵션을 안 넣으면 터미널에 계속 로그가 찍히고 터미널 종료 시 컨테이너 종료)
-p : OS와 컨테이너의 포트 매핑
3000:3000 : 앞의 3000은 컨테이너에 접근할 포트, 뒤 3000은 컨테이너에서 앱에 접근할 포트(노드 프로젝트는 기본 포트 3000번으로 실행되므로)
명령어를 에러 없이 동작했다면 도커 대시보드에 들어가서 해당 이미지가 사용 중이라는 것과 컨테이너 목록에 내가 지정한 포트로 컨테이너가 띄워져 있는 것을 확인할 수 있다. (컨테이너 목록에 표시되는 포트는 컨테이너에 접근할 포트인 OS 포트이다.)
설정한 OS 포트로 웹에 주소를 쳐보면 예제 프로젝트가 잘 실행되어 있는 것을 확인할 수 있다.
(http://localhost:3000/)
또한 도커 컨테이너 목록에서 해당 컨테이너를 클릭해보면 로그도 확인할 수 있다.
예제 파일에 이미 있었던 Dockerfile도 위와 같은 방법으로 빌드해서 이미지 생성하고 컨테이너를 띄워보면 아래와 같이 docker labs 페이지를 로컬에 띄울 수 있다.
✋ Docker document
https://docs.docker.com/get-started/overview/
'Kubernetes' 카테고리의 다른 글
k8s 기본 구조 (0) | 2024.03.10 |
---|---|
deployment livenessProbe, readinessProbe (0) | 2024.02.23 |
- Total
- Today
- Yesterday
- Spring
- MAC
- rabbitmq
- enum
- ssh
- Intellij
- 메시지큐
- cache
- 공간데이터
- 스프링부트
- k8s
- 이클립스
- eclipse
- springboot
- 어노테이션
- JPA
- mockito
- DATABASE
- HttpClient
- annotation
- 캐시
- 데이터베이스
- DB
- postgres
- 역직렬화
- 자바
- PostgreSQL
- 캐싱
- Caching
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |