도커(Docker)
도커는 컨테이너라는 기술을 사용해서 애플리케이션을 언제 어디서나 같은 환경에서 배포하고 실행할 수 있게 해주는 도구이다.
컨테이너 기술
한 pc에서 여러가지 프로젝트들을 실행할 때, 언어 등 환경이 다를 경우 컨테이너 기술을 사용하여 실행을 단일화 할 수 있다.
각 애플리케이션이 서로의 실행 환경에 영향을 받지 않고 독립적으로 실행할 수 있도록 하는 기술이다.
구성요소
1. 이미지
컨테이너를 어떻게 만들건지 명령하는 파일
From openjdk:17-jdk
WORKDIR /app
COPY ./app.jar /app/app.jap
CMD ["java", "-jar", "/app/app.jar"]
2. 컨테이너
3. 레지스트리
우리가 만든 이미지를 보관하는 공간
Default는 private
4. Docker Hub(네트워크)
전 세계 사람들이 만든 도커 이미지를 공유하고 내려 받을 수 있는 공식 이미지 저장소
5. Volume(볼륨)
동기화를 해놓는다.
도커의 위치
운영체제와 컨테이너들 사이에 도커환경에서 실행된다.
nginx 띄우기
도커 명령어로 nginx(웹서버)를 띄워보겠다.
docker run --name server -d -p 8080:80 nginx
새로운 컨테이너를 실행하고 컨테이너의 이름을 server로 지정했고 호스트의 8080 포트 -> 컨테이너의 80 포트에 연결했으며 nginx 이미지를 사용해서 컨테이너를 실행한다.
http://localhost:8080에 접속해보면
이런식으로 페이지가 생성된다.
서버에 직접 들어가보자
docker exec -it server /bin/bash
현재 실행중인 서버에서 명령어를 실행한다.
'-it' 터미널 형태로 사용하며
bash 셸을 이용한다.
서버 내에서 /usr/share/nginx/html 폴더에 index.html을 확인해보면 우리가 http://localhost:8080에 접속했을 때, 나왔던 html파일이 존재한다.
이런식으로 index.html 을 hello로 내용을 변경하게 되면
이렇게 변경되는걸 볼 수 있다.
그러면 서버를 삭제했다가 다시 생성해도 과연 이 파일이 유지될까?
볼륨 생성
서버를 삭제 후 다시 생성해 보았다.
index.html 이 다시 초기화 된 모습이다. 그 이유는 원래 파일을 동기화를 해놓지 않았기 때문인데 그 과정을 볼륨이라고 한다.
볼륨이란?
Docker 컨테이너가 사용하는 데이터 저장소이자, 컨테이너가 꺼져도 유지되는 외부 디스크 공간이다. Docker 컨테이너는 기본적으로 휘발성이 있기 때문에 정적 컨텐츠는 컨테이너 바깥에 따로 저장해야 된다.
이런식으로 아까 도커를 생성하는 명령어에 -v $(pwd)/index.html:/usr/share/nginx/html/index.html 을 붙이면서 현재 디렉토리에 존재하는 index.html을 nginx의 웹 루트로 마운트한다.
이런식으로 볼륨 설정 후 임의로 만든 index.html을 서버에 직접 들어가서 확인해보면 커스터마이징한 html파일을 확인할 수 있다.
mysql image
이제 mysql 서버를 띄우고 컨테이너를 직접 들어가서 Mysql에 넣은 데이터를 확인해보자
docker run --name databse -d -p 3307:3306
mysql 서버를 'database'라는 이름으로 호스트의 3307포트에 컨테이너 3306포트를 연결한다.
-e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=backend mysql:8.0
mysql 8.0 image를 도커 허브에서 내려받고 패스워드는 1234, db이름은 'backend'로 설정한다.
이렇게 하게되면 mysql에 3307포트로 backend 스키마가 생성된다.
MYSQLWorkBench에서 table을 생성하고 데이터를 삽입해봤다.
create table test(
id INT auto_increment primary key,
username varchar(50) not null,
address varchar(100) not null
);
INSERT INTO test (username, address)
VALUES ('상화', '강남');
docker exec -it database mysql -u root -p
database 컨테이너로 접속하여 pw를 입력하면 mysql로 접속할 수 있고 그 안에 스키마와 테이블을 확인할 수 있다.
데이터도 잘 삽입된 것을 볼 수 있다.
도커파일로 이미지 만들기
Spring Boot 애플리케이션을 Docker 컨테이너로 띄우면서, 외부에서 환경 변수(`PROJECT_NAME`)를 주입해 엔드포인트 응답을 동적으로 바꾸는 실습을 진행했다.
@RestController
@RequestMapping("/api")
public class UserController {
@Value("${PROJECT_NAME:web Server}")
private String instansName;
@GetMapping()
public String test() {
return instansName;
}
}
PROJECT_NAME이라는 환경 변수가 있으면 읽고, 없으면 기본값 "web Server" 사용
스프링부트 프로젝트에 도커파일을 생성한다.
FROM openjdk:17-jdk
WORKDIR /app
COPY build/libs/backendProject-0.0.1-SNAPSHOT.jar /app/backendProject.jar
CMD ["java", "-jar", "/app/backendProject.jar"]
FROM openjdk:17-jdk
자바 버전 17을 사용한다.
WORKDIR /app
컨테이너 내 작업 환경을 /app으로 지정한다.
COPY build/libs/backendProject-0.0.1-SNAPSHOT.jar /app/backendProject.jar
로컬에 있는 .jar 파일을 컨테이너 안의 /app/ 디렉토리로 복사합니다.
CMD ["java", "-jar", "/app/backendProject.jar"]
컨테이너가 실행될 때, java로 파일을 실행한다.
docker build -t backend .
만들어진 docker 파일을 'backend'라는 이미지로 만든다.
그럼 'backend' 이미지가 생성되고
docker run --name backend -d -p 8050:8080 backend
backend이미지를 기반으로 'backend'라는 컨테이너를 생성하고 실행한다.
그럼 스프링부트서버가 실행되면서 localhost:8050/api 를 띄워보면 controller가 잘 작동하는걸 알 수 있다.
'멋사 부트캠프' 카테고리의 다른 글
[멋사 부트캠프] Day10 - ThreadLocal (0) | 2025.06.30 |
---|---|
[멋사 부트캠프] Day09 - 예외처리 및 로그분석(ELK) (0) | 2025.06.28 |
[멋사 부트캠프] Day08 - OAuth2 소셜 로그인 (0) | 2025.06.27 |
[멋사 부트캠프] Day04 - Gpt API (0) | 2025.06.20 |
[멋사 부트캠프] Day03 - WebSocket, redis (0) | 2025.06.20 |