본문 바로가기

TIL

2026.2.10 ~ 13 - DevOps(Docker)

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