[인프라] 도커란? (도커왕왕기초)

2026. 5. 6. 01:38·CS/인프라

그야말로...도...커...

도커란?

애플리케이션을 배포 및 실행할 때마다 환경이 달라질 수 있다. 내가 JDK17로 개발했지만 서버를 돌리는 컴퓨터를 구해왔더니 JDK8이 깔려있을 수도 있고, 라이브러리가 안깔려있어서 죄다 다시 깔아야할 수도 있고, 때로는 OS가 달라서 호환이 안될수도있다.

 

따라서 모든 실행환경을 하나로 묶어 한 개의 단위로 패키징하는 것이 필요하다. 즉, 애플리케이션, 라이브러리, OS, 코드 등 모든 실행환경을 하나로 모아 다른 컴퓨터에서도 똑같이 동작할 것을 보장하는 것이 필요하다.

 

이 때 사용되는 것이 바로 도커(Docker)다. 도커는 모든 실행환경을 하나로 모아 컨테이너라는 단위로 관리한다. 마치 하나의 PC처럼 동작한다. 개발자는 하나의 컴퓨터로 여러 컨테이너를 운영할 수 있다는 것도 특징이다. 컨테이너는 모두 독립적이며, 여러 대의 서버를 운영하는 것과 비슷하다.

 

관련용어

이미지

도커는 프로그램을 실행시키기 위해 소스코드, 라이브러리, 의존성 등의 파일을 필요로하는데, 이 때 파일들은 가변적인 것이 아니라 특정시점의 불변적인 파일들이다. 이처럼 파일들의 특정시점에서의 스냅샷을 이미지(image)라고 칭한다. 즉, 이미지는 프로그램 실행을 위한 소스코드, 라이브러리, 의존성 등의 파일 시스템 스냅샷이다.

 

레이어

따라서 이미지는 불변이다. 다만 파일에 수정사항이 발생했을 때 매번 전체 이미지를 다시 빌드하는 것은 비효율적이므로 레이어를 사용한다.

레이어는 현재 이미지와 이전 이미지의 변경사항을 저장한다. 이를 통해 이미 빌드된 이미지를 토대로 추가적인 변경사항만 조정하여, 매번 이미지를 빌드하는게 아니라 레이어를 쌓아올려 이전 이미지와의 수정사항을 조정하는 식으로 동작한다.

 

도커 실행하기

도커는 이미지를 기반으로 동작하며, 이미지 생성 → 이미지 실행을 기본 순서로한다.

도커파일

도커 이미지를 만들기 위한 스크립트 파일, 설정 파일을 도커파일(DockerFile)이라고 칭한다. 별다른 확장자 없이 그냥 Dockerfile파일을 생성하면 된다.

 

FROM eclipse-temurin:17-jdk
WORKDIR /app
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

이미지 생성을 위한 기본적인 도커파일

설치할 파일, 소스코드, 라이브러리 등을 포함해 도커 이미지가 빌드될 때 이 도커파일을 읽으며 이미지를 생성한다.

 

위의 도커파일 예시는 Eclipse Temurin 17버전(JDK17) 기반으로, 작업 디렉토리를 /app으로, build/libs 내의 모든 jar 파일을 컨테이너 안으로 가져와 app.jar 라는 이름을 붙이고, 컨테이너가 동작하기 시작하면 java -jar app.jar 명령어가 실행된다.

 

이게 기초적인 도커파일의 예시이다. 추가로 빌드 시점에서 CLI 명령어를 RUN 옵션으로 추가할 수도 있고, 도커파일을 보다 더 정교하게 작성할 수도 있는데 이것은 차차 알아갈 예정. 글도 쓸 예정

 

빌드

docker build 도커파일경로

이제 이미지를 만들어야하고, 그 이미지를 만드는 과정이다.

도커파일경로에 (.)을 사용하면 워크스페이스 루트에서 빌드를 실행시킨다. 보통 (.)을 많이 사용하는 듯

 

docker build -t my-image:latest .

다양한 옵션을 추가할 수 있으며, 주로 -t 옵션을 사용한다.

워크스페이스 루트의 모든 하위 디렉토리를 이미지로 빌드하고, 이미지 이름은 my-image, 태그는 latest로 지정. 이 옵션을 사용하지 않으면 이름 없는 이미지가 생성된다. 물론 이름 없는 이미지가 생겨도 나중에 tag 명령어를 통해 이름과 태그 수정이 가능하다.

실행

docker run (옵션) 이미지식별자 (명령어) (인자)

이미지가 생성되었다면 이 이미지를 실행시킬 수 있다. 빌드된 이미지를 실행시킨다.

도커 이미지 버전관리

도커도 깃허브와 같이 여러 사람이 다양한 버전을 push/pull 할 수 있다. 이 때 이미지 저장소에 이미지를 push/pull할 수 있으며, 이미지 저장소는 도커허브 또는 도커 레포지토리가 있다. AWS를 사용하면 ECR이 이 기능을 수행한다. 실무환경이나 AWS EC2를 사용한다면 ECR을 사용하는게 좋다고한다

docker pull 이미지:태그

pull 명령어를 통해 특정 이미지를 가져올 수 있다.

docker push 이미지:태그

push 명령어를 통해 이미지를 업로드할 수 있다.

 

그래서 일반적으로 도커는 build → (tag) → push → pull → run 순으로 동작한다.

 

docker ps

그리고 ps 명령어를 통해 현재 실행 중인 도커이미지를 확인할 수 있다.

 

도커컴포즈

도커를 사용해 서비스를 제공한다고할 때, 스프링 애플리케이션 뿐 아니라 MySQL이나 레디스, nginx 등도 도커 컨테이너에 올릴 때가 있다.

이처럼 여러 개의 컨테이너를 한 번에 동작시키거나, 상태를 관리하기 위한 것이 도커 컴포즈다.

 

version: '3'

services:
  redis:
    image: redis
    container_name: redis
    ports:
      - 6379:6379
      
  mysql:
    container_name: mysql3308
    image: mysql:8.0.13
    environment:
      MYSQL_DATABASE: demoProject
      MYSQL_ROOT_PASSWORD: test123
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3308:3306"
    restart: always

  app:
    restart: always
    build: ""
    working_dir: /demo
    volumes:
      - ./demo:/demo
      - ~/.m2:/root/.m2
    ports:
      - "8080:8080"
    expose:
      - "8080"
    depends_on:
      - redis
      - mysql
    command: mvn clean spring-boot:run

(yaml 파일의 경우 https://jane096.github.io/project/docker-compose/ 를 참고했습니다. 문제 시 수정예정입니다)

도커컴포즈를 사용하면 여러 컨테이너를 하나의 명령어도 실행시킬 수 있다. 위와같이 도커컴포즈를 작성하면 하나의 도커컴포즈를 실행시킬 때 여러 개의 컨테이너가 실행되는 셈이다.

 

속성으로는

images: 사용할 서비스 컨테이너의 이름

container_name: 컨테이너의 이름

environment: 컨테이너 내부에서 사용할 환경변수의 이름

ports: 포트번호

 

등이 있다.


이렇게 간단한 도커의 기초에 대해서 알아봤는데, 도커는 이보다 더 심화된 내용도 많고, 나중에 CI/CD와 겹치면 또 많은 것을 배워야할 것이다. 이는 그 때 배우는 걸로. 오늘은 도커의 기초에 대해서 배우는 것으로 끝내도록한다.

'CS > 인프라' 카테고리의 다른 글

[인프라] 도전! 실전 깃허브 액션  (0) 2026.05.12
[인프라] CI/CD 깃허브 액션에 도커컴포즈 적용하기  (0) 2026.05.07
[인프라] CI/CD와 깃허브 액션  (0) 2026.05.07
[인프라] AWS란? (AWS 왕왕기초) + 수동배포  (0) 2026.05.06
'CS/인프라' 카테고리의 다른 글
  • [인프라] 도전! 실전 깃허브 액션
  • [인프라] CI/CD 깃허브 액션에 도커컴포즈 적용하기
  • [인프라] CI/CD와 깃허브 액션
  • [인프라] AWS란? (AWS 왕왕기초) + 수동배포
컬러잇
컬러잇
탄천러너지망생
  • 컬러잇
    Color it
    컬러잇
  • 전체
    오늘
    어제
    • 분류 전체보기 (235)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (72)
        • JVM (12)
        • 인프라 (5)
        • 백엔드 (22)
        • 논리회로 (5)
        • 언어구현 (1)
        • 인공지능 (1)
        • 코드설계 (3)
        • 컴퓨터구조 (9)
        • 데이터베이스 (4)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (65)
        • Java | Kotlin (49)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (4)
      • 고찰 (35)
        • CEOS 23기 회고록 (9)
  • 링크

    • 교양있는컬러잇
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.5
컬러잇
[인프라] 도커란? (도커왕왕기초)
상단으로

티스토리툴바