LG CNS 부트캠프 학습일지 53일차
학습 내용
- Dockerfile 작성 요령
- 도커 네트워크
- 스프링부트 어플리케이션을 컨테이너로 실행하기
Dockerfile 작성요령
Dockerfile은 Domain Specific Language를 사용해서 작성한다.
1
2
3
FROM ubuntu:16.04
CMD ["/bin/bash"]
1
2
3
4
5
6
7
8
services:
my-service:
build:
context: .
dockerfile: Dockerfile
image: my-image:1.0.0
stdin_open: true
tty: true
Dockerfile에서도 명시하긴 했는데, ubuntu:16.04 자체의 이미지의 엔트리포인트도 /bin/bash 이다.
docker-compose.yml 파일에서 마지막 두 줄을 눈여겨 보아야 한다. stdin_open: true 와 tty: true 모두 각자의 역할이 있다. stdin_open: true 는 bash 쉡이 입력을 받을 수 있게 standard input을 열어두는 것이다. bash 쉘은 standard input 이 열려있지 않으면 스스로 쉘을 종료해버린다.
tty:true는 쉘 프롬프트가 보여지게 한다. 쉘 프롬프트는 예를 들어 bash 쉘을 열면 아래와 같이 보여지는데,
1
root@cb480aca232f:/#
root@cb480aca232f:/# 을 쉘 프롬프트라고 한다. tty:true 가 없었다면 컨테이너의 bash 쉘에 접근했을 때 빈 화면이 보여졌을 것이다.
도커 네트워크
가장 많이 사용하는 도커 네트워크는 세 가지가 있다.
- 브릿지 네트워크
- 호스트 네트워크
- 네트워크 없음 (None Network)
간략하게 설명하면 브릿지 네트워크는 도커 컨테이너가 내부적으로 사용하는 IP 주소를 할당받아 사용하는 것이다. 따라서 도커 컨테이너에게 할당된 IP 주소는 호스트와 완전히 다르다. 컨테이너에 접근하기 위해서는 포트 매핑을 해주어야 한다.
호스트 네트워크는 컨테이너가 마치 호스트처럼 행동하는 것이다. 따라서 포트 매핑이 필요없고, 컨테이너가 사용하는 포트와 호스트의 IP 주소를 통해 접근한다.
네트워크 없음은 사실 설명이라고 할만한게 없는데, 컨테이너가 외부 네트워크와 차단되어 있는 것을 말한다. 개인적으로도 사용해본 적은 없지만 다른 컨테이너 또는 호스트와 상호작용할 필요가 없다면 유용한 네트워크 옵션인 것 같다.
수업시간에 언급되지는 않았는데, vlan 이라는 드라이버도 있다. 예비용 Plex 서버를 만들 때 사용했었다. 이 네트워크가 유용했던 이유는 호스트가 연결된 네트워크와 같은 대역의 IP 주소를 할당받을 수 있다는 것이다. Plex는 여러가지 포트를 사용하는데, 기존에 돌아가고 있던 Plex 서버와 겹치는 부분이 많았고 차라리 새로운 IP를 할당받는 것이 필요했다.
도커 이미지 만들기
1
docker build --tag my-image:1.0.0 --file Dockerfile .
1
2
3
4
5
6
services:
my-service:
build:
context: .
dockerfile: Dockerfile
image: my-image:1.0.0
스프링부트 어플리케이션을 컨테이너로 실행하기
이제 지금까지 만들었던 스프링부트 어플리케이션을 컨네이너로 만들어서 돌리는 방법에 대해서 배웠다. Maven이나 Gradle을 사용해서 프로젝트를 빌드하면 .jar 파일이 하나 만들어진다. 그것을 사용해서 이미지를 만들고 그 이미지를 기반으로 컨테이너를 만드는 것이다.
1
2
3
4
FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY ./catalog-service-mariadb-1.0.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
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
services:
my-mariadb:
image: mariadb:latest
container_name: my-mariadb
environment:
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: "true"
MARIADB_DATABASE: mydb
ports:
- "13306:3306"
networks:
- my-network
catalog-service:
build:
context: ./my-backend
image: uniquecolor/catalog-service:mariadb-demo
container_name: catalog-service
environment:
spring.datasource.url: jdbc:mariadb://my-mariadb:3306/mydb
ports:
- "8088:8088"
depends_on:
- my-mariadb
networks:
- my-network
networks:
my-network:
driver: bridge
Comments powered by Disqus.