DevOps
- Development와 Operations를 합친 용어
- 개발과 운영이 분리되어있는 것이 아니고 전체적인 활동으로 연결되어 있는 것에 착안하여 안정적인 서비스를 제공하는 것을 목표로 고안된 방법론
- 개발자와 운영팀이 함께 일하는 것
- CI/CD
- CI(Continuous Integration) : 코드를 자주 병합하고 테스트를 수행
- CD(Continuous Deployment) : 변경사항을 자동으로 배포하거나 배포 가능 상태로 만드는 것

- 개발된 프로그램의 문제를 빠르게 인식하고 개선할 수 있음
- Git, GitActions, Jenkins, Docker, Kubernetes 등의 룰이 사용됨
Docker
- 리눅스 LXC(LinuxX Container) 기술을 기반으로 하여 발전해온 컨테이너 가상화 플랫폼
- 데이터나 프로그램을 각각 독립적인 환경에서 격리시키는 기능(가상화)을 제공하는 소프트웨어
가상화 플랫폼(Virtualization Platform)
- 물리적인 하드웨어 자원을 가상화를 통해서 여러 가상머신이나 컨테이너에서 독립적인 운영체제와 어플리케이션을 실행할 수 있는 소프트웨어
- 가상화 플랫폼은 서버 자원을 효율적으로 사용 가능(비용 절감, 유연한 자원 관리 가능)
핵심 구성 요소
HyperVisor
- 베어메탈 타입 : 직접 하드웨어 위에 설치 VM 관리(MS Hyper-V)
- 호스트형 타입 : 기존 OS 위에 설치되면 VM 관리(VirtualBox, VMWare)
VM(가상머신)
- Hypervisor에의해 실행되는 독립적인 운영체제와 애플리케이션 환경
- 물리적인 서버에 H/W 자원을 공유하면서 독립적인 시스템처럼 동작
Container
- 코드와 모든 종속성을 패키지화하는 표준 소프트웨어 단위
- 운영체제 수준에서 가상화 환경을 제공
- 애플리케이션 간에 격리된 공간에서 실행
- 가볍고 빠르게 실행됨
사용기술
chroot : 특정 디렉토리를 최상위 디렉토리(/)로 설정하는 리눅스 명령어
네임스페이스 : 프로세서의 자원관리 기능(PID를 그룹화하여 할당)
cgroup : CPU, Memory, Disk, IO, 네트워크 등의 자원 사용량을 제어하는 기능
도커 컨테이너 이미지 : 애플리케이션 실행에 필요한 모든 bin/libs를 포함한 경량의 격리된 실행 가능한 소프트웨어 패키지
구성 요소
- Docker Engin : 컨테이너 및 이미지를 제어
- Docker Hub : 컨테이너 이미지를 배포하기 위한 공공 레지스트리(공개-무료/비공개-유료)
- Docker Compose : 연관된 컨테이너 구성 정보를 YAML 코드로 관리
- Docker Swarm : 클러스터 기반의 도커 오케스트레이션 도구
설치
1. 가상화
- win + R에 winver를 입력하면 현재 window version을 알려줌
- window 11 Pro : hyper-v 기능이 비활성화 되어 있음
- home : hyper-v 기능 활성화 되어있음
- Window 기능 켜기/끄기에서 Hyper-V만 체크하고 설치해주기
- error가 뜨면 나머지 체크된 것들 확인해서 체크해주기


2. wsl 설치
- Windows PowerShell을 관리자로 실행

- wsl --install 입력 : 설치 완료
안되면 이렇게 저렇게 하다가 더 안되면 초기화하고 그래도 안되면 컴퓨터 바꿔야함
3. Docker 설치
Docker.com 에서 설치

- 설정 확인


Docker 실행
1. 이미지(Dockerfile) 생성
- 1. mkdir 디렉토리명 : 디렉토리 생성
- 2. cd 디렉토리명 : 생성된 디렉토리로 이동
- 3. sudo vi Dockerfile : Dockerfile 생성
FROM 이미지명 CMD ["명령",,,,]
- alpine 리눅스 : 5MByte 정도 조경량 리눅스 배포판(이미지 크기가 작음). 패키징 시스템에서 필요한 패키지를 설치하여, 기능의 추가 및 확장이 가능

- 4. docker build -t 이미지명 . : build, 이미지 생성(docker images로 생성된 이미지 확인 가능)



2. 컨테이너 실행
docker run 이미지명

이미지(프로그램을 설치할 수 있는 CD) 관련 명령어
docker images : 이미지 목록 확인
docker search 이미지명 : 이미지 검색
docker pull 이미지명 : 이미지 다운로드
docker build -t 이미지명:태그 . : 이미지 빌드
docker rmi 이미지명(혹은 ID) : 이미지 삭제(실행 중일 때는 삭제 불가)
docker ps -a : 실행 중인 이미지 확인

docker rm 이미지명(혹은 ID) : 실행 중인 이미지 멈춤
docker save -o 압축할파일명.tar 이미지명 : 이미지 tar 저장
컨테이너(이미지로부터 설치된 프로그램) 관련 명령어
docker run -d 이미지명 : 컨테이너 실행(백그라운드)
docker run -it 이미지명 : 컨테이너 실행(interactive)
docker run -d -p 외부포트:내부포트 이미지명 : 포트 매핑(컨테이너의 내부포트와 외부포트를 매핑하여 실행, 포트가 달라도 됨)
docker ps : 실행 중인 컨테이너만 확인
docker ps -a : 모든 컨테이너 확인
docker logs ID : 실행 중인 컨테이너의 로그
docker stop ID : 컨테이너 정지
docker rm ID : 컨테이너 삭제
docker rm -f ID : 컨테이너 정지 및 삭제
정지 관련 명령어
docker container prune : 중지된 컨테이너 모두 삭제
docker image prune : 사용하지 않은 이미지 모두 삭제
docker system prune -a : 전체 삭제
nginx 이미지 생성
1. 이미지 생성 : alpine 리눅스에 nginx가 설치된 이미지 사용
Dockerfile : FROM nginx:alpine
docker images build -t 이미지명 .
2. 실행 : nginx 웹서버를 사용하기 때문에 port 필요
docker run -d -p 외부포트(호스트 포트):내부포트(컨테이너 포트) --name 컨테이너명 이미지명
3. 정지
docker stop 컨테이너ID
docker container prune
spring boot app을 docker images로 생성하여 container로 실행
1. 실행할 .jar를 \\wsl.localhost\Ubuntu\home\user 에 붙여 넣어줌.
2. Dockerfile 작성
FROM 기반 이미지 설정
WORKDIR 컨테이너에서 JAR 파일 들어갈 디렉토리 설정
COPY 호스트OS파일명 컨테이너에 복사할 이름
EXPOSE 컨테이너에서 사용할 포트
CMD ["명령",,,,,,,,,]

- 만약 openjdk가 없다면 eclipse java를 가져옴
eclipse-temurin:17-jdk-jammy

3. 이미지 생성

4. 컨테이너 실행

- 컨테이너 실행하면서 내부 sh로 들어갈 수 있음

- 실행 중인 컨테이너 내부로 들어갈 수 있음

볼륨 마운트
- 실행 중인 컨테이너 내의 디렉토리와 HDD 디렉토리를 연결하는 것
- Container 내에 파일이 저장되면 볼륨 마운트된 directory에 파일이 저장됨
1. 기존의 이미지 삭제
2. 외부에 존재하는 파일을 내부로 연결함
- Dockerfile에 외부 파일을 추가해줌

- 해당 properties에 작성된 경로들은 현재 디렉토리에 맞게 설정해줌

- 연결된 외부파일에 설정된 디렉토리와 실제 디렉토리를 연결시켜줌
docker run -d -p 8080:8080 -v /home/user/webapp/application-prod.properties:/app/application-prod.properties -v /home/user/webapp/upload:/app/upload --name spring-boot myspring-app


nginx와 reverse proxy 연동
1. nginx 폴더 및 Dockerfile 생성

2. nginx 설정파일 생성
- nginx.conf에 있는 host 정보를 default.conf를 생성하여 저장
server {
listen 80;
server_name localhost;
client_max_body_size 100M;
location / {
proxy_pass http://host.docker.internal:8080;//도커 내부 통신이므로 정해진 url를 사용해야 함
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4. nginx 이미지 생성
docker build -t 이미지명 .
5. container 실행
docker run -d -p 80:80 --name 컨테이너명 이미지명
'TIL' 카테고리의 다른 글
| 2026.1.27 - Spring Interceptor (1) | 2026.01.27 |
|---|---|
| 2025.9.29 - JDBC (0) | 2025.09.29 |