🖥️ 컴퓨터 공부/인프라

🐳 도커(Docker) 정리

le2donguk 2025. 8. 25. 12:36

🐳 도커(Docker) 정리: 왜 쓰고, 어떻게 쓰는가?

도커를 쓰는 이유 → 이식성!

  • 명령어 한 줄로 어떤 컴퓨터든 MySQL 실행 가능 (버전 충돌 걱정 없음)
  • 항상 일관된 환경에서 프로그램을 실행할 수 있음
  • 각 프로그램이 독립적인 컨테이너 환경에서 돌아가기 때문에 충돌 x

Docker, Container, Image란?

  • Docker
    → 컨테이너를 실행·관리해 주는 툴
  • 컨테이너(Container)
    → 하나의 컴퓨터 안에 여러 개의 "가상 미니 컴퓨터"를 만드는 것
    → 각각 저장 공간·네트워크(IP/PORT) 를 분리해서 독립 실행된다
  • 이미지(Image)
    → 닌텐도의 게임 칩 🎮 같은 개념
    → 예: MySQL 이미지를 실행시키면, MySQL 서버가 컨테이너에서 실행됨
    → 설치 과정, 버전 정보, 설정이 전부 포함돼 있다

Docker 기본 흐름

1. 이미지 다운로드

docker pull 이미지명
docker image ls # 이미지 확인
2. 컨테이너 생성
 
docker create 이미지명 
docker ps -a # 컨테이너 확인
3. 컨테이너 실행
 
docker start 컨테이너ID
 

4. 중단 & 삭제

 
docker stop 컨테이너ID 
docker rm 컨테이너ID docker image rm 이미지ID
 

👉 현업에서는 보통 docker run을 많이 씀 (생성과 실행을 한 번에 처리)

docker run --name webserver -d -p 80:80 nginx

 


자주 쓰는 명령어

# 실행 중인 컨테이너 보기 
docker ps

# 전체 컨테이너 보기 (중단 포함) 
docker ps -a 

# 컨테이너 실행/중단/삭제 
docker start 컨테이너ID 
docker stop 컨테이너ID 
docker rm 컨테이너ID 

# 이미지 삭제 
docker image rm 이미지ID 

# 실행 중 컨테이너 접속 
docker exec -it 컨테이너ID bash 

# 로그 확인 
docker logs -f 컨테이너ID

##이전 로그는 안보고 지금 부터 들어오는 로그만 보기
docker logs -f --tail 0컨테이너ID

Docker Volume (데이터 보존)

컨테이너는 교체되면 내부 데이터도 같이 날아간다..
이를 해결하기 위해 Volume 기능을 사용 → 데이터를 호스트(내 PC)에 보존해야 하는데... 이 기능을 도커에선 Volume으로 

지원하고 있다! (-v)

docker run -e MYSQL_ROOT_PASSWORD=123 
-d -p 3306:3306
-v C:\docker-test\docker-mysql\mysql_data:/var/lib/mysql
 

👉- MySQL 데이터를 컨테이너가 아닌 : 앞에 쓴  내 로컬 C:\docker-test\docker-mysql\mysql_data 폴더에 저장한다는 의미!!


Dockerfile이란?

이미지를 직접 만들고 싶을 때 사용하는 "설계도".
예: JDK 17이 포함된 나만의 서버 이미지 만들기

FROM openjdk:17
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
빌드 & 실행
docker build -t my-jdk17-server .
docker run -d --name myserver my-jdk17-server

Docker Compose

도커를 쓸 때 그냥 일반 도커를 위에처럼 써도 되지만 너무 번거롭다

그리고 여러 개의 컨테이너를 한 번에 띄우고도 싶고.. 또 중단시키고 삭제하고 빌드하고 start 하고 너무 번거롭다

그래서 나온 게 DockerCompoese다

가장 큰 장점은 여러 개의 컨테이너를 하나의 서비스 묶음으로 관리한다는 것이다!!

 

services:
  my-web-server:
    container_name: webserver
    image: nginx
    ports:
      - 80:80
 

주요 명령어

docker compose up -d     # 실행
docker compose down      # 종료
docker compose ps -a     # 상태 확인
docker compose logs      # 로그 확인

MySQL + Spring Boot 함께 띄우기

 
services:
  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_DATABASE: mydb
    ports:
      - 3306:3306

  my-server:
    build: .
    ports:
      - 8080:8080
    depends_on:
      - my-db
 

👉 주의!!!!! Spring Boot에서 DB 연결 시 localhost가 아닌 서비스명(my-db)으로 접근해야 함.

spring.datasource.url=jdbc:mysql://my-db:3306/mydb
 

그 이유는 localhost로 하게 되면 SpringBoot 가 돌아가고 있는 컨테이너 내부의 3306번 포트로 찾게 된다..

실제로는 다른 컨테이너의 3306번 포트에서 mysql 이 돌아가고 있기 때문에... 서비스명으로 꼭 꼭 접근해야 한다!!!!

 


정리: 내가 만든 이미지를 배포하기

사실 우리가 이미지를 다운로드할 때는 깃 허브처럼 도커 허브에서 다른 사람들이 올린 이미지를 다운로드하는 것이다

말 그대로 도커허브는 도커들의 이미지를 모아둔 곳이다!! 

https://www.docker.com/products/docker-hub/

 

The World’s Largest Container Registry | Docker

Docker Hub is a container registry built for developers and open source contributors to find, use, and share their container images and access verified content.

www.docker.com

 

이곳에 내가 만든 이미지를 올릴 수도 있고 다른 사람이 만든 이미지를 가져올 수도 있다 

 

1. 내 Docker 이미지를 Docker Hub에 업로드

 
docker build -t myid/myimage:latest .
docker push myid/myimage:latest
2. EC2에서 Docker 설치 후 내 이미지 가져오기
 
docker pull myid/myimage:latest
docker run -d -p 8080:8080 myid/myimage:latest

 


정리

  • Docker = 어디서나 똑같이 실행되는 개발·배포 도구
  • Image = 실행 파일, Container = 실행 환경
  • Volume = 데이터 보존
  • Compose = 여러 컨테이너를 하나로 묶어서 관리
  • Docker Hub & EC2 = 내가 만든 이미지를 클라우드에서 실행

마무리

도커는 처음에는 복잡해 보이지만, 원리를 이해하고 나면 “어디서나 똑같이 실행된다”라는 점에서 진가를 발휘한다는 큰 장점이 있다. 특히 EC2 같은 서버와 결합하면 내가 만든 이미지를 올려두고 언제든 내려받아 실행할 수 있기 때문에, 배포가 훨씬 간단해진다.

도커를 공부하면서 “컨테이너 = 작은 컴퓨터”, “이미지 = 게임 칩”처럼 비유해서 이해하니까 훨씬 쉽게 다가왔다..!!