Docker 정리

Docker 정리


슬랙슨에 처음 입사하여 처음으로 Docker 를 알게되었다.
가상머신을 통한 서버 운용은 여러 대기업을 다니며 설정을 많이 접해왔고 또한 해당 시스템은 직관적이기에
무리없이 운용하였으나 Docker 를 통한 Linux Container 를 처음 접하고 사실 많이 새롭고 놀라운 경험을 했기에
정리차원에서 해당 블로그를 정리한다.

Docker 는 다음의 이미지로 설명이 되는 구조이다.

Traditional Linux containers VS Docker

상위 이미지에서 볼수 있듯이 Docker 엔진 상위에 Docker 컨테이너가 위로 올라가는 구조이며
해당 구조는 많은 이점이 있으며, 대표적으로 가상 컨테이너 개념의 격리된 공간에서 프로세스가 동작하는 기술에 대한 이점이 있다.

특징

  1. Docker Image
    도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image 라 한다. 컨테이너를 생성하고 실행하기 위한 모든 설정값을 지닌것으로 더 이상의 의존성 파일을 컴파일 하거나 이것저것 설치 할 필요가 없는 상태의 파일을 의마한다. 따라서 Docker Image는 특정 설정에 독립적이다.
  1. Docker Container
    이미지를 실행한 상태로, 응용 프로그램의 종속성과 함께 응용프로그램 자체를 독립적으로 패키지로 묶어 소프트웨어 서비스 구동을 위한 격리 환경을 처리한다.
  1. Dockerfile
    Dockerfile 은 DockerImage를 생성하기 위한 스크립트(설정파일)이다.
    여러기자 명령어를 토대로 Dockerfile을 작성한 이후 빌드하면 Docker 는 Dockerfile 에 나열된 명령문을 차례대로 수행하며 생성해준다.

Example) Dockerfile 로 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 기본 이미지를 python3.7.9 로 설정
FROM python:3.7.9
ENV PYTHONUNBUFFERED 1
RUN apt-get update -y
# docker 내에서 /bandi 라는 이름의 폴더 생성
RUN mkdir /bandi

# docker 내에서 코드를 실행할 폴더 위치를 /bandi 로 지정
WORKDIR /bandi

ADD requirements.txt /bandi/

RUN pip install --upgrade pip

# 로컬 내 현재 위치에 있는 모든 파일 및 폴더를 docker 의 /bandi/ 폴더
ADD . /bandi/
  1. Docker-compose
    도커 컨테이너로 시스템을 구축하면 하나 이상의 컨테이너가 서로 통신하며, 그 사이에 의존관계가 생긴다.
    이런 방식으로 시스템을 구축하다 보면 단일 컨테이너를 다룰 때는 문제가 되지 않던 부분에도 주의가 필요하게 된다.
    이때 필요한 것이 Docker compose 이다.

Example) docker-compose.yml 생성

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
version: '3'
services:
nginx:
build:
context: ./nginx/ -- nginx 의 도커 실행
dockerfile: Dockerfile
ports:
- '8001:80'
volumes:
- .:/bandi
- ./nginx:/etc/nginx/nginx.d
- ./static:/static
- ./nginx/logs:/var/log/nginx
depends_on:
- web
web:
build:
context: .
dockerfile: Dockerfile
command: bash -c 'pip install -r requirements.txt &&
python manage.py makemigrations &&
python manage.py migrate &&
python manage.py collectstatic --noinput &&
gunicorn bandi_healthcare_server.wsgi:application --bind 0.0.0.0:8002'
volumes:
- .:/bandi
- ./static:/static
- ./logs:/bandi/logs
expose:
- '8002'
Share