CS

태태개발일지 - Docker 총정리 (Docker 기초, 처음부터 끝까지)

태태코 2026. 1. 19. 14:26
반응형

 

회사에서 쿠버네티스를 사용하게 될 가능성이 있어서, docker를 미리 정리해보는 중이다.

 

Docker의 이미지는 아래 주소에서 다운받을 수 있다.

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Software supply chain Secure Your Supply Chain with Docker Hardened Images Use Docker's enterprise-grade base images: secure, stable, and backed by SLAs for Ubuntu, Debian, Java, and more. Regularly scanned and maintained with CVE remediation and long-term

hub.docker.com

 

Docker 프로그램은 아래 주소에서 다운받을 수 있다.

 

https://www.docker.com/get-started/

 

Get Started | Docker

Get started with Docker Desktop and join millions of developers in faster, more secure app development using containers and beyond.

www.docker.com

 

 

https://namu.wiki/w/Docker

 

DOCKER

애플리케이션과 실행 환경을 하나로 묶어 어디서든 똑같이 실행하게 해주는 컨테이너 기술이다.

 

 

Docker를 많이쓰는 이유


이식성

특정 프로그램을 다른 곳으로 쉽게 옮겨서 설치 및 실행할 수 있는 특성

 

 

*Docker 를 이해하기 위한 비유*

하나의 컴퓨터 환경 내에서 만든 개념이다 .

하나의 컴퓨터 환경 내에서 여러개의 독립적인 컴퓨터 환경을 구성해서 ,

각 환경에 프로그램을 별도로 설치할 수 있게 미니 컴퓨터 환경을 구성할 수 있는 형태이다 .

여기서 얘기하는 Docker 에서는 컨테이너 (Container) 라고 부른다 . 

like 미니컴퓨터

 

Docker의 독립공간

디스크 ( 저장 공간 ) 

각 컨테이너마다 서로 각자의 저장 공간을 가지고 있다.
일반적으로 A 컨테이너 내부에서 B 컨테이너 내부에 있는 파 일에 접근할 수 없다 .

 

 

네트워크 (IP, Port) 

각 컨테이너마다 고유의 네트워크를 가지고 있다.
컨테이너는 각자의 IP 주소를 가지고 있다 .

 

 

 

DOCKER 명령어

 

#Dockerhub에서 이미지 다운로드하는 명령어
docker pull nginx

#현재 로컬에서 다운되어있는 이미지의 목록
docker image ls

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

#Dockerhub에서 이미지(버전명시) 다운로드하는 명령어
docker pull nginx:stable-perl

#이미지를 삭제하는 명령어
docker image rm [ 이미지 ID 또는 이미지명 ]
#중지되어있는 이미지를 삭제하는 명령어
docker image rm -f [ 이미지 ID 또는 이미지명 ]

#Docker를 생성은 했지만, 중지되어있는 상태이다.
docker create nginx

#현재 실행중인 컨테이너 목록보기
docker ps -a

#실행중인 도커 컨테이너 멈추기
docker stop

#도커 실행하기
docker run -d nginx
#도커 로그보기
dokcer logs --tail

#실행중인 container안에 접속하기
docker exec -it [Nginx 가 실행되고 있는 컨테이너] bash

#볼륨을 이용하여  docker실행하기
docker run -v [ 호스트의 디렉토리 절대경로 ]:[ 컨테이너의 디렉토리 절대경로 ] [ 이미지명 ]:[ 태그명 ]

 

 

 

Docker 명령어중 알아야할 부분

  1. run과 create 차이점
  2. volum개념이란?
  3. exec가 무엇인가?

 

1.  run과 create의 차이점

docker run 명령어는 컨테이너를 생성함과 동시에 start 실행까지 해주는 명령어이다.

docker create는 컨테이너를 생성하지만 정지인 상태이다. 나중에 실행을 하려면 docker start명령어를 사용해야한다.

 

2.Volum개념이란?

docker는 보통 코드수정이나 수정이있을 때 이미지를 삭제하고 다시 실행하기때문에(효율적이라고 판단) 안에 있는 데이터가 다 휘발된다. 하지만 Volum이라는 개념을 사용하면, 기존에 저장되어있는 데이터를 기반으로 생성하거나, 데이터를 저장할 수 있다.

 

3. exec가 무엇인가?

docker exec -it [컨테이너명] bash 명령어는 실행 중인 컨테이너 내부로 접속할 때 사용하는 맞는 명령어이다.

ex) mysql을 docker container로 실행했다면 exec로 mysql에 접속해서 직접 테이블을 생성하거나 데이터를 다룰 수 있다.

 

 

 

Dockerfile

Docker 이미지는 Dockerhub 을 통해 다운받아서 사용할 수 있다.

이 Docker 이미지들도 누군가 만들어서 Dockerhub 에 올려놓은 것이다 . 

 

Docker file만드는 포멧

FROM [ 이미지명 ]

FROM [ 이미지명 ]:[ 태그명 ]

FROM openjdk:17-jdk

RUN npm install

ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]



COPY 

호스트 컴퓨터에 있는 파일을 복사해서 사용법 컨테이너로 전달한다 .

 

 

COPY [호스트 컴퓨터에 있는 복사할 파일의 경로 ] [ 컨테이너에서 파일이 위치할 경로 ] 

COPY app.txt /app.tx



.dockerignore

이 파일을 통해서 copy시에 복사가 안되게 할 수 있다.

 




RUN vs ENTRYPOINT

RUN 명령어와 ENTRYPOINT의 공통점은 둘 다 같이 명령어를 실행시키는 것이다. 하지만 엄연히 둘의 사용 용도는 다르다 . RUN 은 ‘ 이미지 생성 과정 ʼ 에서 필요한 명령어를 실행시킬 때 사용하고 , 명령어를 실행시킬 때 사용한다 .

 

 

구분 RUN ENTRYPOINT
실행시점 이미지 빌드 시 (docker build) 컨테이너 시작시(docker run)
주된 목적 라이브러리/패키지 설치, 파일 생성 서버 구동, 메인프로그램 실행
결과 이미지의 새로운 레이어가 된다. 컨테이너의 메인 프로세스가 된다.
사용 횟수 한  DockerFile에 여러 번 사용가능 한 DOckerFile에 딱한번 권장

 

 

 

WORKDIR

WORKDIR 으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN , CMD , ENTRYPOINT , COPY , ADD 명령문은 해당 디렉터리를 기준으로 실행된다 . 작업 디렉터리를 굳이 지정해주는 이유는 컨테이너 내부의 폴더를 깔끔하게 관리하기 위해서이다.

컨테이너도 미니 컴퓨터와 같기 때문에 Dockerfile 을 통해 생성되는 파일들을 특정 폴더에 정리해두는 것이 추후에 관리가 쉽다 . 만약 WORKDIR 을 쓰지 않으면 컨테이너 내부에 존재하는 기존 파일들과 뒤섞여버린다 .

 

WORKDIR [작업 디렉토리로 사용할 절대 경로 ]

WORKDIR /usr/src/app

 

 

DockerFile or DockerCompose

 

1. Dockerfile만 사용하는 경우 (택 1: 단일 서비스) 

상황: 오직 한 종류의 애플리케이션(예: 오직 Spring 서버만) 이미지를 만들어서 배포하고 싶을 때.​ 

특징: 결과물로 '이미지'가 남습니다. docker build 후 docker run으로 한 개의 컨테이너만 띄우면 끝날 때 사용한다.

 

 2. Docker Compose를 사용하는 경우 (2가지 이상: 다중 서비스) 

상황: Spring 서버 + React 프런트 + MySQL DB처럼 서로 연결되어야 하는 서비스가 2개 이상일 때.​ 

특징: "여러 개의 Dockerfile"을 모아서 관리합니다. 각 서비스의 Dockerfile을 빌드하고, 이들을 어떤 포트와 네트워크로 묶을지 docker-compose.yml 한 곳에 적어서 동시에 띄울 때 사용한다.

Docker Copmose

여러 개의 Docker 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴이다 .

 

 Docker Compose 를 사용하는 이유

여러 개의 컨테이너를 관리하는 데 용이 여러 개의 컨테이너로 이루어진 복잡한 애플리케이션을 한 번에 관리할 수 있게 해준다 . 여러 컨테이너를 하나의 환경에서 실행하고 관리 하는 데 도움이 된다 .

 

 

services:
    websever: container_name: webserver
        image: nginx
        ports:  80:80



docker compose up # 포그라운드에서 실행
docker compose up -d # 백그라운드에서 실행

 

 

여러개의 Image Docker Compose로 생성

 

version: '3.8'

services:
  my-server:
    build: .
    ports:
      - "8080:8080"

  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
      MYSQL_DATABASE: mydb
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"

 

 

Docker Compose 사용시 유의해야할 점

 

위와같은 방식으로 docker compose를 구성할 시 두 프로그램동시에 실행은 되지만, spring boot에서 에러가 나게 된다.

 

이유

각 container는 독립적인 부분으로, connect없이는 그냥 연결할 수 는 없다.

 

 

 

해결방안

version: '3.8'

services:
  my-server:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      my-db:
        condition: service_healthy

  my-db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: pwd1234
      MYSQL_DATABASE: mydb
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 5s
      retries: 10

 

depends_on과 healthcheck를 통해서, mysql이 먼저 떠있는 것을 확인하고, spring boot를 실행하게 의존관계를 걸어주면 되고,

 

spring에 있는 application.yaml파일은, 3306:3306이 아닌 my-db:3306으로 연결해주면, docker container가 연결이 된다.

 

 

반응형

'CS' 카테고리의 다른 글

태태개발일지 - Docker  (0) 2025.04.16
태태개발일지(소켓 통신)  (0) 2023.10.11
태태개발일지(CS지식)  (0) 2023.09.21
태태개발일지(운영체제)  (0) 2023.09.06
태태개발일지(운영체제)  (0) 2023.09.05