내가 필요해서 만드는 도커(Docker) 가이드

김태훈·2023년 8월 8일
0

개요

도커를 사용할 일이 많지는 않습니다.
오랜만에 사용해 기억이 가물가물질 때, 빠르게 흐름을 잡기 위해 참고하는 글입니다.

대상

해당 글은 필자의 아카이빙 목적으로 빠르게 자료를 찾기 위해 쓰여졌습니다.
지식 전달을 원하시는 분들은 아래 링크를 통해 학습하는 걸 추천합니다.
https://www.youtube.com/watch?v=hWPv9LMlme8&t=1181s

도커

컨테이너 기반의 오픈소스 가상화 플랫폼

컨테이너

소프트웨어 애플리케이션과 그 애플리케이션을 실행하는 데 필요한 모든 종속성(라이브러리, 설정, 환경 변수 등)을 포함하는 격리된 환경

컨테이너는 애플리케이션과 애플리케이션을 실행시키는 격리된 환경을 말합니다.
컨테이너를 사용하면 어떤 애플리케이션(프로세스)을 돌릴 수 있는 서버를 만들 수 있습니다.

위 사진을 보면 가상머신에 비해 중복되는 자원이 제거된 걸 확인할 수 있습니다.

Ubuntu 위에서 jar 파일을 사용해 서버를 구축해야 하는 상황이라고 가정해보겠습니다. Docker 컨테이너를 사용하면 아래와 같은 과정이 필요합니다.

1. Ubuntu 이미지를 사용해 도커 컨테이너를 띄운다.
2. 컨테이너에 접속해서 필요한 환경 구축을 한다(java 설치 등)
3. java -jar 명령어를 사용해 서버에 실행시킨다.

10개의 서버를 띄워야 한다면 위 작업을 10번 반복해야 합니다. 여전히 귀찮은 작업입니다. 하지만 도커파일을 사용해 위 반복을 줄일 수 있습니다.

도커파일

도커 이미지를 만들기 위한 파일

Docker는 이미지를 사용해 컨테이너를 띄우는 역할을 합니다.
위 예시에서는 컨테이너를 띄운 다음, 수동으로 환경 구축을 해줬다면 도커파일을 사용해 위 과정을 자동화할 수 있습니다. 도커파일을 살펴보겠습니다.

# Base 이미지를 선택합니다.
FROM ubuntu:20.04

# Java 11을 설치합니다.
RUN apt-get update && apt-get install -y openjdk-11-jdk

ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
ENV PATH $PATH:$JAVA_HOME/bin

WORKDIR /app

# 파일을 /app 경로에 복사합니다.
COPY 파일명.jar /app

# java -jar 파일명.jar 를 실행합니다.
ENTRYPOINT ["java", "-jar", "파일명.jar"]

위 Docker파일을 실행시키면 이미지가 하나 만들어집니다.
만들어진 이미지로 컨테이너를 생성하면 해당 컨테이너 안에는 jar 파일로 띄운 서버가 동작하고 있습니다.

이제 10개의 동일한 서버를 띄우기 위해, 해당 이미지를 사용해 컨테이너를 10번 띄우기만 하면 됩니다.

보안 문제

서버는 보통 DB에 의존을 갖는 경우가 많습니다. 위 예시에서도 데이터베이스를 의존한다 가정하겠습니다.

만약 파일명.jar 안에 DB의 id, 비밀번호 등이 들어있다면 보안상 문제가 될 겁니다. 이미지 파일이 탈취당하면 DB로의 접근권한을 털리는 것과 마찬가지입니다. 그런데 이미지 파일은 보통 모두가 접근할 수 있는 Docker Hub에 올려두고 사용한다는 문제가 있습니다.

핵심은, 민감정보를 이미지 안에다가 저장하는 건 좋지 못하는 이야기입니다.
그래서 환경변수를 사용합니다. 환경변수를 사용하면 이미지를 컨테이너로 만드는 시점에 민감정보를 넣어줄 수 있습니다.

따라서 이미지가 유출되더라도 DB의 권한은 털리지 않게 됩니다.

Dockerfile 문법

https://www.daleseo.com/dockerfile/
링크를 참고해주세요.

아래는 Dockerfile 예시 코드입니다.

헷갈림 주의

Dockerfile이라는 이름으로 파일을 만들어야 합니다.

RUN : 이미지를 만들 때 실행하는 명령어입니다. 여러번 가능합니다
CMD, ENTRYPOINT: 이미지를 컨테이너로 띄울 때 실행하는 명령어입니다.
CMD: 딱 한 번 가능합니다. 만약 docker run 명령시 파라미터가 들어오면 무시됩니다.

# FROM: 베이스 이미지 생성
FROM ubuntu:20.04

# RUN: 이미지를 만들 때 명령어를 실행합니다.
#      주로 특정 소프트웨어를 설치하기 위해 사용뙵니다.
RUN apt-get update && apt-get install -y openjdk-11-jdk

# ENV: 환경변수를 설정하기 위해 사용됩니다.
#      이미지 빌드 시 사용되고, 컨테이너 생성 시에도 사용됩니다.
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
ENV PATH $PATH:$JAVA_HOME/bin

# WORKDIR: cd 명령어라 생각하면 쉽습니다.
WORKDIR /app

# COPY: 파일을 해당 경로에 복사합니다.
COPY 파일명.jar /app


# ENTRYPOINT : 해당 프로세스가 죽으면 컨테이너가 죽습니다 (사실상 목적 프로세스)
ENTRYPOINT ["java", "-jar"]

# CMD: 컨테이너 만들 때 실행됩니다. 
#      아래 예시에서는 ENTRYPOINT와 함께 java -jar 디폴트파일명.jar가 실행됩니다.
#      만약 docker run 이미지명 새로운파일.jar 를 실행하면, java -jar 새로운파일.jar가 실행됩니다.
#      (CMD 명령은 묻힙니다)
CMD [디폴트파일명.jar]

Docker 명령어

https://www.yalco.kr/36_docker/
링크를 참고해주세요.

아래는 명령어 사용 예시입니다.

# 로그인한다
docker login

# 이미지를 만든다 (using Dockerfile)
docker build -t [이미지이름] [도커파일이 위치한 경로]

# 존재하는 이미지 확인
docker images

# 컨테이너 실행
docker run --name 컨테이너이름 -p [호스트 Port]:[컨테이너 내 사용할 Port] -d [이미지이름](:태그)

# 도커 컨테이너 상태 확인
docker ps
docker ps -a

# 도커 컨테이너 로그 보기
docker logs [컨테이너명]
# 사용하지 않는 전체 도커 관련 삭제
docker system prune -a

# 도커 이미지 삭제
docker rmi [이미지명]

# 도커 컨테이너 삭제
docker rm [컨테이너명]

# 도커 컨테이너 중지
docker stop [컨테이너명]

docker-compose 파일 문법

https://nirsa.tistory.com/79
링크를 참고해주세요.

파일 이름은 docker-compose.yml이어야 합니다.

예시는 아래와 같습니다.

version: '3' # 버전에 따라 아래 문법들이 달라집니다.
services:
  # web이라는 이름의 컨테이너를 띄웁니다.
  web:
    image: [이미지명]:[버전명]
    ports:
      - "80:8080"
    env_file:
      - .env

Docker Compose 명령어

현재 제 수준에서는 아래 명령어 정도면 충분했습니다.
더 학습이 진행되면 채워넣겠습니다.

docker-compose up # 실행시키기
docker-compose down # 끄기
profile
작은 지식 모아모아

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기