티스토리 뷰
왜 도커를 사용하나요?
스프링 애플리케이션의 서버 환경을 구축하기 위한 투두리스트
1. Ubuntu 설치하기
2. Java 11 설치하기
3. MySQL Database 설치하기
4. MySQL Schema 생성하기
5. 80 포트 열기
6. ...
위의 투두리스트를 따라하면서 단일 스프링 애플리케이션 서버를 구축했다고 가정해봅시다.
애플리케이션의 규모가 커지기 시작하면 하나의 서버만 운영하는 모놀리식 아키텍처로는 한계가 느껴지기 시작합니다.
서비스의 규모가 어느 지점에 다다르면 결국 단일 서버를 확장시켜야 합니다.
서버를 확장하기 위해 현재 운영 중인 서버와 똑같은 환경으로 서버를 하나 더 추가한다고 생각해봅시다.
두 번째 스프링 애플리케이션 서버도 투두리스트를 따라 직접 하나 하나 구축하고 있는데..
이 때 개발자의 실수로 두 번째 서버에는 Ubuntu가 아닌 CentOS를 설치해버렸습니다.
어찌저찌 CentOS로 구축한 두 번째 서버도 잘 돌아가는 듯 하지만..
관리하는 과정에 있어 몇 가지 불편함이 느껴지네요 😥
불편한 점
1. 첫 번째 서버에서는 Ubuntu 명령어를, 두 번째 서버에서는 CentOS 명령어를 사용해야 합니다.
2. 그렇다고 두 번째 서버의 환경을 처음부터 다시 구축하자니 여기에 드는 시간적 비용이 큽니다.
지금은 오직 2개의 서버만 운영하기 때문에 나름 괜찮지만, 서버의 개수가 점점 늘어나 수 백개가 된다고 가정해보세요.
과연 지금 방식 대로 수 백개의 서버를 감당할 수 있을까요?
도커를 사용하면,
위에서 든 예시의 불편함을 해결할 수 있습니다.
1. 마이크로서비스 아키텍처에서 여러 서버를 같은 환경으로 구축할 수 있습니다.
2. 서로 다른 서버 환경에서도 같은 방식으로 필요한 패키지를 설치할 수 있습니다.
3. 서버 환경을 구축하는데 드는 비용이 절약됩니다.
그래서 Docker가 뭔데요?
도커는 애플리케이션을 신속하게 구축하고, 테스트하고, 배포할 수 있는 오픈 플랫폼
프로그램을 지속적으로 개발하다보면 위의 예시처럼 서버 환경이 지속적으로 바뀌는 일이 생깁니다.
도커는 이 애플리케이션을 여러 개의 컨테이너라는 단위로 분리해 서버 환경을 간편하게 관리할 수 있도록 도와줍니다.
도커 아이콘이 마치 실제 컨테이너를 실어 수송하는 화물선 같지 않나요? 🚢
도커는 서버 환경 또는 프로그램을 컨테이너 안에 담아 도커 허브를 통해 다른 컴퓨터로 쉽게 옮길 수 있도록 도와줍니다.
(컨테이너 안에 담는 과정을 '추상화'라고 부릅니다.)
그리고 쿠버네티스는 이 도커 컨테이너를 사용해 여러 개의 서버를 쉽게 통합해서 관리할 수 있도록 도와줍니다.
더 자세한 내용은 아래 블로그와 Google Cloud Skills Boost를 참고해주세요!
처음 도커를 들어본 분도, 도커를 접해봤지만 개념이 추상적인 분들도 쉽게 이해할 수 있도록 글이 작성되어 있습니다.
본 글은 도커 그 자체보다는, 쿠버네티스를 사용하기 위한 기초 개념으로 도커 컨테이너 생성 과정을 알아보고자 합니다.
도커의 기본 명령어
도커 컨테이너를 관리하기 위한 기본적인 명령어부터 알아보겠습니다.
docker run
도커 컨테이너를 실행합니다.
- p 옵션: 현재 IP와 컨테이너 사이의 포트 포워딩을 설정합니다.
- -name 옵션: 컨테이너 이름을 설정합니다.
- d 옵션: 컨테이너를 실행할 때 사용할 이미지를 설정합니다.
docker run hello-world
docker images
도커 허브로 부터 다운로드받은 컨테이너 이미지 리스트를 확인합니다.
docker images
docker ps
실행 중인 컨테이너를 확인합니다.
- -a 옵션: 실행을 완료한 컨테이너도 포함해서 조회합니다.
docker ps
docker stop
실행 중인 컨테이너를 멈춥니다.
docker stop my-app
docker rm
컨테이너를 삭제합니다. (삭제하려는 컨테이너는 docker stop 명령어를 통해 멈춘 상태여야 합니다.)
docker rm my-app
docker logs
컨테이너 내부의 로그를 확인합니다. (컨테이너의 ID는 docker ps로 확인할 수 있습니다.)
- f 옵션: 실시간으로 로그를 확인합니다.
docker logs [container_id]
docker exec
실행 중인 컨테이너 내부의 Bash 쉘로 접속합니다.
- exit을 입력해 Bash 세션을 종료할 수 있습니다.
docker exec -it [container_id] bash
docker inspect
컨테이너의 메타데이터를 확인할 수 있습니다.
- -format 옵션: 메타데이터에서 특정 필드를 더 자세히 확인할 수 있습니다.
docker inspect [container_id]
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_id]
Dockerfile로 이미지 빌드하기
컨테이너 이미지를 사용하는 방법은 두 가지가 있습니다.
1. 도커 허브로부터 이미지를 다운로드(pull) 받아 사용한다.
2. Dockerfile로 직접 컨테이너 이미지를 만들어 사용한다.
Dockerfile이 뭔가요?
Dockerfile이란 컨테이너에 설치할 패키지, 명령어, 환경 변수 설정 등을 기록한 하나의 파일을 말합니다.
Dockerfile을 사용해서 이미지를 빌드하고 컨테이너를 실행한 다음, 기본 명령어들을 사용해보겠습니다.
1. Dockerfile을 만듭니다.
cat > Dockerfile <<EOF
FROM node:lts# 베이스로 사용할 부모 이미지를 명시합니다.
WORKDIR /app# 컨테이너의 working directory를 설정합니다.
ADD . /app# 현재 디렉터리의 파일들을 컨테이너에 추가합니다.
EXPOSE 80# 컨테이너의 80 포트를 엽니다.
CMD ["node", "app.js"]# 애플리케이션을 실행하기 위해 node 명령어를 사용합니다.
EOF
2. 컨테이너 내부에서 실행할 간단한 Node 애플리케이션을 만들어봅니다.
cat > app.js <<EOF
const http = require('http');
const hostname = '0.0.0.0';
const port = 80;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\\n');
});
server.listen(port, hostname, () => {
console.log('Server running at http://%s:%s/', hostname, port);
});
process.on('SIGINT', function() {
console.log('Caught interrupt signal and will exit');
process.exit();
});
EOF
Hello World를 출력하는 아주 기본적인 노드 애플리케이션 코드입니다.
3. 우리가 만든 Dockerfile로 노드 컨테이너 이미지를 빌드합니다.
- docker build: Dockerfile을 통해서 컨테이너 이미지를 빌드합니다.
docker build -t node-app:0.1 .
4. 우리가 만든 node-app:0.1 이미지로 컨테이너를 실행합니다.
docker run -p 4000:80 --name my-app node-app:0.1
5. 컨테이너가 잘 동작하는지 확인합니다.
curl <http://localhost:4000>
6. 컨테이너 배포 완료! 이제 실행 중인 컨테이너에 위에서 배운 기본 명령어들을 사용해 봅시다 :)
- Total
- Today
- Yesterday
- awk프로그램
- 리눅스
- 백준27219
- 백준27211
- SELECT #SELECTFROM #WHERE #ORDERBY #GROUPBY #HAVING #EXISTS #NOTEXISTS #UNION #MINUS #INTERSECTION #SQL #SQLPLUS
- cat
- linux파일
- linuxtouch
- 버추억박스오류
- virtualbox
- Baekjoon27219
- 사용자ID
- 코테
- 버추억박스에러
- linuxawk
- 쇼미더코드
- Baekjoon27211
- 백준
- E_FAIL
- OnActivityForResult
- GithubAPI
- atq
- baekjoon
- api문서
- whatis
- linuxgedit
- GitHubAPIforJava
- 리눅스cron
- Linux
- cron시스템
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |