Docker
도커(Docker)는 애플리케이션을 구동하는 데 필요한 모든 환경(코드, 라이브러리, 설정 등)을 컨테이너(Container)라는 독립된 공간으로 패키징하여, 어느 환경에서나 빠르고 안정적으로 실행할 수 있게 해주는 오픈소스 가상화 플랫폼이다.
도커 레이어 구조

- Base Layer : 리눅스 운영체제의 최소한의 핵심 기능만 제공하는 층. 변동이 불가하며 상태값을 가질 수 없다
- Image Layer : 베이스 레이어 위로 명령어가 실행될 때마다 차곡차곡 생성되는 스냅샷들의 집합. 변동이 불가하며 상태값을 가질 수 없다.
FROM뒤에 나오는RUN,COPY,ADD같은 명령어들이 실행될 때마다 새로운 이미지 레이어가 한 층씩 빌드되어 올라갑니다 - Container Layer : 내가 컨테이너 안에서 마음대로 쓰고 지울 수 있는 개인 연습장. 변동이 가능하고 , 상태값을 가질 수 있다
DockerFile 예시

FROM openjdk:21-slim : 베이스 레이어
WORKDIR /app : app 디렉토리를 만들어줌. 있으면 그거 사용
ARG JAR_FILE=build/libs/ *. Jar : jar file 변수 만듦
COPY ${JAR_FILE} app.jar : [왼쪽: 내 컴퓨터의 파일]을 [오른쪽: 도커 컨테이너 내부]로 복사하는 명령이다.
ENTRYPOINT [ “java”, “-jar”, “app.jar” ] : 도커 이미지, 이 이미지로 컨테이너를 실행(run)할 때, 컨테이너가 켜지자마자 자동으로 실행할 메인 명령
Docker Container

1. 컨테이너의 본질: 프로세스(Process)
- 컨테이너 = 프로세스: 도커 컨테이너는 본질적으로 하나의 리눅스 프로세스이라고 볼 수가 있다.
- 프로세스의 정의: 프로그램(이미지)이 메모리에 올라가 실제로 작동하고 있는 상태를 의미한다.
- 프로세스가 끝나면 컨테이너도 종료: 컨테이너 내부에서 실행 중인 메인 프로세스(예:
bash나 자바 앱)가 종료되면, 컨테이너도 자동으로 함께 종료된다.
2. 도커 컨테이너의 상태 (State)
프로세스는 멈추거나 켜질 수 있으므로, 컨테이너도 상황에 따라 다음과 같은 상태를 가집니다.
① Created (생성됨)
- 이미지를 컨테이너로 막 격리하여 만들었지만, 아직 실행은 되지 않은 준비 상태이다.
- 아직 아무런 프로세스가 돌고 있지 않기 때문에, 실제로 사용하려면
docker start를 해주어야 시작된다.
② Running (실행 중)
docker run명령어를 쓰면, 컨테이너가Created상태를 거쳐 곧바로Running상태로 훅 바뀐다.- 프로세스가 활성화되어 열심히 일을 하고 있는 상태이다.
③ Paused (일시 정지)
- 컨테이너를 잠깐 멈춘 상태입니다. (컴퓨터의 ‘절전 모드’와 비슷합니다.)
- 프로세스에 할당된 메모리와 상태가 그대로 정지한다.
- 특징: 일시 정지된 동안 들어온 요청(큐)들은 버려지지 않고 쌓여있다가, 재개(
unpaused)하는 순간 그동안 밀린 요청들이 한 번에 와르르 실행된다.
④ Stopped (중지됨)
- 프로세스를 아예 그만두고 완전히 종료한 상태입니다. (컴퓨터의 ‘시스템 종료’와 비슷합니다.)
- 특징: 아예 서비스가 내려간 상태이기 때문에, 일시 정지와 달리 외부에서 들어오는 그 어떤 요청도 받을 수 없습니다. 다시 켜려면
start를 해야 한다.
3. 컨테이너 삭제(rm)의 철칙
내 컴퓨터의 자원을 안전하게 보호하기 위해 도커는 컨테이너 삭제에 엄격한 규칙을 두게 된다.
💡 핵심 규칙: 컨테이너는 절대로 ‘실행 중(Running)’일 때 삭제할 수 없다!
- 삭제 가능한 상태: 반드시 컨테이너가 중지(Stopped/Exited)되어 있거나, 아직 시작도 안 한 생성(Created) 상태여야만 안전하게 삭제(
docker rm)가 가능합니다.- 실행 중 삭제하려면: 만약 구동 중인 컨테이너를 지우고 싶다면 반드시 먼저 중지(
docker stop)를 시키거나, 강제 삭제 옵션(docker rm -f)을 사용해야 합니다.- pause(정지) : 일시적으로 정지를 한 상태, 재개를 하면 기다렸던 것들이 한꺼번에 들어간다.
- stop(중지) : 재개를 할 수 없다. 재개시키고 싶다면 처음부터 다시 시작해야 한다.
Docker Network

Docker0
- 자동 생성되는 가상 공유기:
docker0는 도커를 설치하면 기본으로 생성되어 컨테이너들을 바깥 세상과 연결해 주는 가상 공유기 역할을 합니다. - 독립된 네트워크 공간: 각각의 컨테이너는 자신만의 독립된 네트워크 환경을 가진 채로 태어납니다.
- 랜선을 통한 상호 연결: 이렇게 독립된 컨테이너들이
docker0라는 중심 공유기에 가상 랜선으로 하나씩 연결되어 서로 안전하게 통신합니다.
도커 네트워크의 종류
Bridge Network : 하나의 Host에서 여러 컨테이너 통신. Docker0에 연결 되는 것
Host Network : Host와 동일한 네트워크에서 컨테이너 연결. 진짜 실행되고 있는 프로그램 처럼
None Network : 네트워크 없이 컨테이너의 lo만 사용. 고립됨. 통신 불가.
Overlay Network : 분산 호스트 컨테이너 연결.
도커 컨테이너 커밋 구현으로 이미지 업데이트
만약 내가 새로운 환경에서 컨테이너를 구축하고 ubuntu를 사용할 때 기존 컨테이너에서 설치된 ubuntu 관련 프로그램들은 다 날라갈 것이다. 이러한 불상사를 방지하기 위해 docker에서 commit으로 이미지 업데이트를 하면 그 이미지에는 내가 다운받은 프로그램들이 반영된 ubuntu일 것이다.
-
docker run -it –name my-ubt-1 ubuntu:24.04 bash
기존의 my-ubt-1 컨테이너를 실행 -
docker ps
도커의 컨테이너를 확인 -
docker commit 30e7426e46a my-ubt:latest
컨테이너의 id를 보고 이것을 이미지로 업데이트 -
docker run -it –name my-udt-2 my-ubt:latest bash
업데이트를 한 이미지를 새로운 컨테이너 my-udt-2로 실행