본문 바로가기

보안 이론/클라우드 보안

Docker - 도커 파일, 도커 컴포즈

반응형

Docker File과 Docker Compose에 대한 간략한 설명과 실습을 진행해본다.


도커 파일(Docker File)

컨테이너의 환경을 구성하기 위하여 패키지, 소스코드, 명령어, 환경변수 설정 등을 기록한 파일이다.

여러가지 지시어를 제공하며 일련의 행동들을 순서대로 진행하도록 하며 쉘 스크립트와 유사하다.

환경이 구성되어 이용하는 이미지와 달리 cmd명령어 등의 유동적인 작업이 가능하다.

도커 파일명은 Dockerfile로 하는 것이 일반적이다.

 

도커 이미지와 차이

내부 구성요소에 대해 알기 어려운 도커 이미지와 달리 코드로 되어있어 이해하기가 쉽다.

간단한 지시어들을 이용하여 쉽게 도커 파일을 제작할 수 있다.

모듈이 업데이트되었을 시 일부 코드만 수정하면 되므로 유지보수가 쉽고 버전 관리가 용이하다.

알려진 이미지를 이용해 설정을 추가하기 때문에 보안적으로 믿을 수 있다.

 

도커 파일 지시어

지시어 기능
FROM [이미지] 사용할 이미지(base image)를 설정한다.
RUN ["명령어", "인자1", "인자2"] 이미지 빌드 시 커맨드 명령어를 실행한다.
ENTRYPOINT ["명령어", "인자1", "인자2"] 컨테이너 실행 시 항상 실행되야 하는 커맨드를 설정한다.
이 커맨드로 생성한 프로세스가 종료되면 컨테이너도 종료된다.
CMD ["명령어", "인자1", "인자2"] 컨테이너 실행 시 단 한번 실행될 명령어를 설정한다.
실행시 인자가 존재하면 실행되지 않는다.
EXPOSE [포트]/[프로토콜(옵션)] 서비스할 포트를 지정한다.
호스트에서 접근하기 위해서는 포트포워딩을 해야한다.
ADD [호스트 파일] [저장될 경로] 호스트의 파일을 복제한다.
COPY와 다르게 압축 파일도 복제가 가능하다.
COPY [호스트 파일] [저장될 경로] 호스트의 파일을 복제한다.
WORKDIR [경로] 명령어가 실행될 작업 디렉토리를 지정한다.
RUN, CMD, COPY, ADD, ENTRYPOINT 등의 디렉터리 기준이 된다.
ENV [키] [값] 환경 변수를 설정한다
LABEL [키]=[값] 키 값형태의 레이블을 지정한다.
보통 메타데이터를 추가하는데 사용된다.
VOLUME ["호스트경로", "컨테이너 경로"] 호스트 OS와 바인딩할 디렉토리를 설정한다.
USER [유저(UID)]:[그룹(GID)] 도커 이미지를 실행할 사용자를 설정한다. (UID, GID)
사용 시 계정이 미리 존재해야한다.
ARG [키]=[기본값] docker build 명령어 시 --build-arg 옵션으로 넘겨줄 수 있는 환경 값을 지정한다.

 

도커 파일 실습

목표

nginx 서버 도커 파일로 구현
- ubuntu 최신버전
- nginx, curl, vim 설치
- index.html 페이지 수정
- 80포트 오픈
- 데몬 실행 : nginx -g deamon off
(daemon off 는 nginx 서버를 foreground에서 실행)

도커 파일 구성

우선 디렉토리를 하나 생성한 뒤 Dockerfile이라는 파일을 생성한다.

cd ~
mkdir web
cd web
vi Dockerfile

생성한 도커 파일에는 다음과 같이 입력한다.

FROM ubuntu
LABEL maintainer "TAEJIN"
LABEL tilte "Web Appalication"
RUN apt-get update && apt-get install -y nginx curl vim
RUN echo '<h1>modified INDEX.html</h1>' > /var/www/html/index.html
EXPOSE 80
WORKDIR /var/www/html
CMD ["nginx", "-g", "daemon off;"]

작성이 완료되었으면 빌드를 진행한다.

# Dockerfile을 이용해 이미지 빌드
# -t : 생성할 이미지 이름
sudo docker build -t nginx_web .

# 생성된 이미지 확인
sudo docker images

# 이미지에 적용된 레이어 확인
sudo docker image history nginx_web

위와 같이 이미지가 생성됨과 어떤 작업을 진행했는지 확인할 수 있다.

 


 

도커 컴포즈(Docker Compose)

여러 개의 컨테이너의 실행을 한번에 관리하여 하나의 어플리케이션을 구성한다.

컨테이너가 많아질 수록 복잡해지는 도커의 문제를 컴포즈를 이용해 시스템 구성이 간결하고 깔끔해진다.

네트워크, 컨테이너 간의 관계 등 서비스 측면에서 더 세부적인 설정이 가능하다.

도커 컴포즈 파일은 암묵적으로 docker-compose.yaml 이라는 이름을 사용한다.

 

도커 파일과 도커 컴포즈 차이
Dockerfile : 베이스 이미지 + 커스텀 = 최종 이미지를 만드는 목적
docker-compose : 여러 베이스이미지 → 다중 컨테이너를 관리 = 하나의 프로젝트를 구성/배포 목적

 

JSON, XML, YAML

데이터를 표현하는 형식으로 문법이 조금씩 다르지만 각자 상황에 맞는 형식을 이용한다.

도커 컴포즈에서는 YAML 방식을 사용한다.

 

JSON : 자바스크립트 객체 형식으로 표현하며 텍스트를 객체로 표현하기 용이하다.

{
	"version": "3.3",
	"services": {
		"webapp": {
			"image": "nginx",
			"ports": [
				"8001:80"
			]
		}
	}
}

 

XML : HTML과 흡사한 구조로 태그를 이용하여 표현한다.

<version>3.3</version>
<services>
    <webapp>
        <image>nginx</image>
        <ports>8001:80</ports>
    </webapp>
</services>

 

YAML : 사람이 읽기 쉬운 형태의 데이터 표현 방식으로 공백을 이용해 데이터를 구분해 한줄로 작성할 수 없다.

version: '3.3'
services:
  webapp:
    build: web01
    ports:
      - "8001:80"

 

도커 컴포즈 실습

도커 컴포즈 설치

도커 컴포즈는 도커와 독립적인 모듈이라서 따로 설치를 진행해야한다.

sudo apt install -y docker-compose

 

도커 컴포즈 작성

도커 컴포즈를 이용하여 mariadb와 wordpress 서버를 동시에 구성해본다.

먼저 도커 컴포즈를 구성할 폴더를 생성하고 해당 폴더에서 구성 파일을 관리한다.

mkdir ~/wpweb
cd ~/wpweb

# docker-compose.yaml 파일 생성 후 작성
vi docker-compose.yaml

 

docker-compse.yaml 파일을 다음과 같이 작성한다.

version: '3.3'
services:
   db:
     image: mariadb:10.4.6
     volumes:
       - /home/kali/wpweb/db-data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
     networks:
       - wp_net

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8080:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
     volumes:
       - /home/kali/wpweb/web-html:/var/www/html
     networks:
       - wp_net
networks: 
   wp_net:
     driver: bridge
     ipam:
       config:
         - subnet : 172.100.0.0/16
           gateway : 172.100.0.1

version : 도커 컴포즈의 버전을 기입한다.

services : 도커 컴포즈를 이용해 생성할 컨테이너 이름을 정의하고 하위에 옵션들을 나타낸다.

  • image : 서비스 컨테이너 생성에 쓰일 이미지를 설정한다.
  • bulid : 도커 파일을 이용하여 이미지를 빌드해 사용한다.
  • environment : 컨테이너 내부에서 사용할 환경 변수를 지정한다.
  • restart : 컨테이너가 중지되었을 경우 다시 시작할지 여부를 결정한다.
  • volumes : 컨테이너 내부 데이터를 호스트 디렉토리에 바인딩할 경로를 지정한다.
  • networks : 사용할 네트워크를 지정한다.
  • ports : 호스트와 포트포워딩할 포트를 지정한다. (내부적으로 통신할 경우 지정해줄 필요 없음)
  • depends_on : 컨테이너간의 의존관계를 나타낸다. 명시된 컨테이너가 모두 실행된 뒤 자신을 실행한다.

networks : 도커 컴포즈를 이용해 생성할 네트워크 이름을 정의하고 하위에 옵션들을 나타낸다.

  • driver : 네트워크 타입을 설정한다.
  • ipam : IP Address Manager를 사용하여 subnet과 ip 범위 등을 설정한다.

 

도커 컴포즈 실행

컴포즈 파일을 실행하기 위해서는 반드시 docker-compose.yaml 파일이 있는 위치에서 진행해야 한다.

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

# 도커 컴포즈 프로세스 확인
sudo docker-compose ps

# 도커 컴포즈 종료
sudo docker-compose down

두 개의 이미지가 동시에 실행되는 것을 볼 수 있다.

실행 후 호스트IP:8080으로 접근하면 바로 워드 프레스를 사용할 수 있다.

이처럼 도커 컴포즈를 이용하면 여러 서비스로 구성된 하나의 어플리케이션을 쉽게 배포하고 구동할 수 있다.

 


도커를 더 편리하게 사용하는 방법에는 dockerfiledocker-compose가 있다.

dockerfile코드 형식으로 되어있어 구조를 이해하기 쉽고 지시어를 통한 세밀한 작업 및 유지보수가 편리하다.

docker-compose하나의 파일을 실행함으로 여러 이미지로 이루어진 하나의 어플리케이션구동 및 배포가 가능하다.

반응형

'보안 이론 > 클라우드 보안' 카테고리의 다른 글

AWS - WAF  (1) 2022.11.20
Docker - 도커 기반 워드프레스 자동화 취약점 분석  (0) 2022.11.15
Docker - Volume, Network  (0) 2022.11.06
Docker - 이론 및 기본 사용법  (0) 2022.11.04
AWS - Auto Scaling  (0) 2022.11.03


Calendar
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Visits
Today
Yesterday