Image
์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ
ํ๋ฆฟ
Summary
Docker Image๋ ์ปจํ
์ด๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ
ํ๋ฆฟ์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์
์คํ์ ํ์ํ ๋ชจ๋ ์ค์ ๊ณผ ์ข
์์ฑ์ ํฌํจํ๋ ํจํค์ง์
๋๋ค. ์ด๋ฏธ์ง๋ ๋ถ๋ณ์ฑ์ ๊ฐ์ง๋ฉฐ ๊ณ์ธตํ๋ ๊ตฌ์กฐ๋ก ๋์ด ์์ด ํจ์จ์ ์ธ ์ ์ฅ๊ณผ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ฏธ์ง๋ Docker Hub์์ Pull ํ๊ฑฐ๋ Dockerfile์ ํตํด ์ง์ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ปจํ
์ด๋๋ ์ด๋ฏธ์ง๋ฅผ ์คํํ ์ธ์คํด์ค์
๋๋ค. JDK 17๊ณผ MySQL 8 ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ ๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ฑ ์ค์ต๊ณผ Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์ Docker ์ด๋ฏธ์ง๋ก ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ค๋ฃน๋๋ค.
Index
1.
Image
์ปจํ
์ด๋๋ฅผ ์คํํ๊ธฐ ์ํ โ์ค์ ๊ณผ ํ๋ก๊ทธ๋จ์ด ๋ด๊ธด ํจํค์งโ
์ฝ๊ฒ ๋น์ ํ๋ฉด
โฆ Image = ์๋ฆฌ ๋ ์ํผ
โฆ Container = ๋ ์ํผ๋๋ก ๋ง๋ ์ค์ ์๋ฆฌ
ํฌ์ธํธ
โฆ ์ฌ๋ฌ ์ปจํ
์ด๋์์ ๋ฐ๋ณต ์ฌ์ฉ ๊ฐ๋ฅ
โฆ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ์คํ ๊ฐ๋ฅ
Docker Image๋?
Docker Image๋ ์ปจํ
์ด๋๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ค์ ๊ณผ ์ข
์์ฑ์ ํฌํจํ๋ ์คํ ๊ฐ๋ฅํ ํจํค์ง์
๋๋ค. ์ด ์ด๋ฏธ์ง๋ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์คํ ํ๊ฒฝ ์ค์ , ์์คํ
๋๊ตฌ ๋ฑ์ ํฌํจํฉ๋๋ค.
Docker Image๋ ๋ถ๋ณ(Immutable)์ด๋ฉฐ ๊ณ์ธตํ๋(Layered) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
Docker Image์ ํน์ง
โข
์ฝ๊ธฐ ์ ์ฉ: ์ด๋ฏธ์ง๋ ํ ๋ฒ ์์ฑ๋๋ฉด ๋ณ๊ฒฝํ ์ ์๋ ์ฝ๊ธฐ ์ ์ฉ ํ
ํ๋ฆฟ์
๋๋ค.
โข
๊ณ์ธต ๊ตฌ์กฐ: ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด ํจ์จ์ ์ธ ์ ์ฅ๊ณผ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
โข
์ด์์ฑ: Docker๊ฐ ์ค์น๋ ๋ชจ๋ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ์คํ๋ฉ๋๋ค.
โข
์ฌ์ฌ์ฉ์ฑ: ํ๋์ ์ด๋ฏธ์ง๋ก ์ฌ๋ฌ ์ปจํ
์ด๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Image ์์ฑ ๋ฐฉ๋ฒ
1.
Docker Pull
2.
Dockerfile
Docker Pull
Docker Hub๋ ๋ค๋ฅธ ๋ ์ง์คํธ๋ฆฌ์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์
๋๋ค.
๋ค์ ๋ช
๋ น์ด๋ก ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ต๋๋ค
docker pull [์ด๋ฏธ์ง๋ช
]:[ํ๊ทธ]
Bash
๋ณต์ฌ
โข
์์
docker pull nginx:latest
Bash
๋ณต์ฌ
docker pull ubuntu:20.04
Bash
๋ณต์ฌ
์ด ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก, ๊ณต์ ์ด๋ฏธ์ง๋ ๊ฒ์ฆ๋ ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Docker Hub์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๊ณต์ ์ด๋ฏธ์ง๋ค์ด ์์ต๋๋ค:
โข
ubuntu, centos, debian ๋ฑ์ OS ์ด๋ฏธ์ง
โข
nginx, apache ๋ฑ์ ์น ์๋ฒ ์ด๋ฏธ์ง
โข
mysql, postgresql, mongodb ๋ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฏธ์ง
โข
node, python, java ๋ฑ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฐํ์ ์ด๋ฏธ์ง
Docker Pull์ ์ฅ์
โข
์ ๋ขฐํ ์ ์๋ ๊ณต์ ์ด๋ฏธ์ง ์ฌ์ฉ ๊ฐ๋ฅ
โข
์ง์ ๊ตฌ์ฑํ ํ์ ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
โข
๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํจ (ํ๊ทธ๋ฅผ ํตํ ๋ฒ์ ์ง์ )
โข
์ปค๋ฎค๋ํฐ์์ ๊ฒ์ฆ๋ ์ด๋ฏธ์ง ํ์ฉ ๊ฐ๋ฅ
Dockerfile
์ง์ ์ด๋ฏธ์ง๋ฅผ ์ ์ํ๊ณ ๋น๋ํ๋ ๋ฐฉ์์
๋๋ค.
Dockerfile์ Docker ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ํ ์คํฌ๋ฆฝํธ ํ์ผ๋ก, ์ด๋ฏธ์ง ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ์ ์ํ๋ ์ง์๋ฌธ๋ค์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
ํ๊ฒฝ์ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ Dockerfile ๊ตฌ์กฐ
Dockerfile ์ฃผ์ ๋ช
๋ น์ด 


๋ช
๋ น์ด | ์ค๋ช
|
FROM | ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ง์ |
RUN | ๋ช
๋ น์ด ์คํ |
COPY | ๋ก์ปฌ ํ์ผ ๋ณต์ฌ |
ADD | ํ์ผ ๋ณต์ฌ (์์ถ ํด์ ๊ธฐ๋ฅ) |
WORKDIR | ์์
๋๋ ํ ๋ฆฌ ์ค์ |
EXPOSE | ํฌํธ ๋
ธ์ถ |
ENV | ํ๊ฒฝ๋ณ์ ์ค์ |
CMD | ์ปจํ
์ด๋ ์คํ ๋ช
๋ น์ด |
ENTRYPOINT | ์ปจํ
์ด๋ ์์์ |
Image ์ค์ต
Docker ์ด๋ฏธ์ง ์ค์ต ๊ณํ
1. ๋ชฉํ
1.
JDK 17 ์ด๋ฏธ์ง์ MySQL 8 ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ฑ
2.
Spring Boot ์น ์ฑ์ ํฌํจํ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ Docker Hub์ Push
2. ์ค์ต ์ค๋น
โข
Docker ์ค์น ์๋ฃ
โข
Docker Hub ๊ณ์ ์ค๋น
โข
๊ฐ๋จํ Spring Boot ์น ์ฑ ์ค๋น (app.jar ๋๋ Spring Boot ํ๋ก์ ํธ)
3. ๋จ๊ณ๋ณ ์ค์ต
Step 1: ๊ธฐ๋ณธ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
# JDK 17
docker pull openjdk:17
# MySQL 8
docker pull mysql:8
Bash
๋ณต์ฌ
โข
ํ์ธ
docker images
Bash
๋ณต์ฌ
Step 2: MySQL ์ปจํ ์ด๋ ์คํ
docker run -d \
--name my-mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
mysql:8
Bash
๋ณต์ฌ
โข
์ค๋ช
โฆ
d: ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
โฆ
-name: ์ปจํ
์ด๋ ์ด๋ฆ
โฆ
e: ํ๊ฒฝ๋ณ์ ์ค์
โฆ
p: ํฌํธ ๋งคํ (ํธ์คํธ:์ปจํ
์ด๋)
Step 3: JDK ๊ฐ๋ฐํ๊ฒฝ ์ปจํ ์ด๋ ์์ฑ
1.
Dockerfile ์์ฑ
# Base image
FROM openjdk:17
# ์์
๋๋ ํ ๋ฆฌ
WORKDIR /app
# Spring Boot ์ฑ ๋ณต์ฌ
COPY target/myapp.jar /app/myapp.jar
# ํฌํธ ์คํ
EXPOSE 8080
# ์ฑ ์คํ
CMD ["java", "-jar", "myapp.jar"]
Docker
๋ณต์ฌ
โข
์ด๋ฏธ์ง ๋น๋
docker build -t my-spring-app:1.0 .
Bash
๋ณต์ฌ
โข
์ปจํ
์ด๋ ์คํ
docker run -d -p 8080:8080 --name spring-app my-spring-app:1.0
Bash
๋ณต์ฌ
ํฌํธ ๋งคํ(Port Mapping) ์ค๋ช
:
Docker์ -p 8080:8080 ์ต์
์ ํฌํธ ๋งคํ์ ์ ์ํฉ๋๋ค.
[ํธ์คํธ ํฌํธ]:[์ปจํ
์ด๋ ํฌํธ]
โข
์ผ์ชฝ(8080): ํธ์คํธ ๋จธ์ (๋ด ์ปดํจํฐ)์ ํฌํธ
โข
์ค๋ฅธ์ชฝ(8080): ์ปจํ
์ด๋ ๋ด๋ถ์ ํฌํธ
์ด ์ค์ ์ ์๋ฏธ: ๋ด ์ปดํจํฐ์ 8080 ํฌํธ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ํธ๋ํฝ์ด Docker ์ปจํ
์ด๋ ๋ด๋ถ์ 8080 ํฌํธ๋ก ์ ๋ฌ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, -p 9090:8080์ผ๋ก ์ค์ ํ๋ฉด ํธ์คํธ์ 9090 ํฌํธ๋ก ์ ์ํ์ ๋ ์ปจํ
์ด๋ ๋ด๋ถ์ 8080 ํฌํธ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
โข
๋ธ๋ผ์ฐ์ ์์ http://localhost:8080 ์ ์ ํ์ธ
Step 4: Docker Hub์ Push
โข
๋ก๊ทธ์ธ
docker login
Bash
๋ณต์ฌ
โข
ํ๊ทธ ์ง์
docker tag my-spring-app:1.0 <DockerHubID>/my-spring-app:1.0
Bash
๋ณต์ฌ
โข
Push
docker push <DockerHubID>/my-spring-app:1.0
Bash
๋ณต์ฌ
Step 5: Docker Compose ์ค์ต (์ต์ )
โข
docker-compose.yml
version: '3'
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: testdb
ports:
- "3306:3306"
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
YAML
๋ณต์ฌ
โข
์คํ
docker-compose up -d
Bash
๋ณต์ฌ
โข
MySQL๊ณผ Spring Boot ์ฑ์ ๋์์ ์คํ
Tip & ํฌ์ธํธ
โข
MySQL ์ปจํ
์ด๋๋ ๊ฐ๋ฐํ๊ฒฝ์ฉ์ด๋ฏ๋ก ๋น๋ฐ๋ฒํธ ๋จ์ํ ๊ฐ๋ฅ
โข
Spring Boot ์ฑ์์ DB ์ฐ๊ฒฐ URL ์์:
spring.datasource.url=jdbc:mysql://db:3306/testdb
spring.datasource.username=root
spring.datasource.password=1234
Plain Text
๋ณต์ฌ
โข
์ด๋ ๊ฒ ํ๋ฉด Docker Compose ํ๊ฒฝ์์ ์ปจํ
์ด๋ ์ด๋ฆ(db)๋ก ์ ๊ทผ ๊ฐ๋ฅ