본문 바로가기

두두의 IT

도커 파일(Dockerfile) 개념/작성/실행/배포

728x90

개념

  • 나만의 이미지를 만들기 위한 설계도
  • 각 프로젝트 폴더(frontend, backend 등)마다 가지고 있어야 하는 파일
  • 레시피
  • FROM, WORKDIR, ENV, RUN, COPY, CMD


[실습 1]

1. Frontend(node.js)

프로젝트 폴더 내 Dockerfile
FROM node:12.18.4

# 이미지 생성 과정에서 실행할 명령어
# node.js니까 npm 명령어 사용
RUN npm install -g http-server 

# 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
# 아래 명령어가 해당 디렉토리에서 실행됨
WORKDIR /home/node/app

# 컨테이너 실행시 실행할 명령어
CMD ["http-server", "-p", "8080", "./public"]


- RUN과 CMD 차이점 구분하기

> docker build -t node .
> docker run --name frontend-img -v %cd%:/home/node/app -p 8080:8080 node
  • Dockerfile과 같은 디렉토리에서 명령어 실행
  • build -t : 이미지 생성 명령어
  • . : Dockerfile 이름이 Dockerfile일 경우 따로 명시 안 함

 

2. Database(mysql)

Dockerfile
FROM mysql:5.7

# 이미지 환경변수들 세팅
# 실전에서는 비밀번호 등을 이곳에 입력하지 말 것!
# 서버의 환경변수 등을 활용하세요.
ENV MYSQL_USER mysql_user
ENV MYSQL_PASSWORD mysql_password
ENV MYSQL_ROOT_PASSWORD mysql_root_password
ENV MYSQL_DATABASE visitlog

# 도커환경에서 컨테이너 생성시 스크립트를 실행하는 폴더로 미리 작성된 스크립트들을 이동
# mysql은 아래 폴더 안의 SQL 파일들에 적힌 쿼리 명령들을 실행하도록 설계되어 있음
# Volume과 차이점 주의
COPY ./scripts/ /docker-entrypoint-initdb.d/
> docker build -t {이미지명} .

> docker run --name {컨테이너명} -it -p 3307:3307 {이미지명}
또는
> docker run --name {컨테이너명} -d -p 3307:3307 {이미지명}
  • -d : demon. 안 보이는 곳에서 알아서 컨테이너 깔고 돌려라.

 

3. Backend(python)

Dockerfile
FROM python:3.8.5

# 이미지 생성 과정에서 실행할 명령어
RUN pip3 install flask flask-cors flask-mysql

# 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
WORKDIR /usr/src/app

# 컨테이너 실행시 실행할 명령어
# backend.py로 서버를 실행함
CMD ["python3", "backend.py"]
> docker build -t {이미지명} .
> docker run --name {컨테이너명} -v $(pwd):/usr/src/app -p 5000:5000 {이미지명}

[실습 2]

1. Backend(python)

Dockerfile
# pull official base image
# 알파인 리눅스를 기본으로 python:3.8을 받아라
FROM python:3.8.0-alpine

# set work directory
# 우리가 작업할 공간
WORKDIR /usr/src/app

# set environment variables
# 파이썬의 바이트 코드 환경변수 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# apk : 알파인 리눅스에서 패키지를 다운받는 명령어
RUN apk update
# 설치 파일들 설치해라
RUN apk add postgresql-dev mariadb-dev gcc python3-dev musl-dev zlib-dev jpeg-dev  #--(5.2)

# 현재 파일을 /usr/src/app에 복사해
COPY . /usr/src/app/
# install dependencies

# pip 설치해
RUN pip install --upgrade pip
# rquirements.txt 설치해
# 현재 파일을 복사하므로 requiremets.txt 파일 준비
RUN pip install -r requirements.txt​
> docker build -t {이미지명}:{태그명} ./
> docker run -it encore:0.1

 

2. Web Server(apache)

Dockerfile
FROM ubuntu:14.04
MAINTAINER encore
LABEL "purpose"="practice"
RUN apt-get update
#apache 설치
RUN apt-get install apache2 -y
#test.html을 /var/www/html에 복사'
#현재 디렉터리에 test.html있어야 함
ADD test.html /var/www/html
#작업디렉터리
WORKDIR /var/www/html
#명령어 실행
RUN ["/bin/bash", "-c", "echo hello >> test2.html"]
#외부포트 80
EXPOSE 80
#백그라운드 실행
CMD apachectl -DFOREGROUND​​
> docker run -d -P --name {컨테이너명} {이미지명}
  • -P : 컨테이너의 현재포트를 80과 연결

배포

> docker run -it --name {컨테이너명} {이미지명}:{태그명}
> docker commit -a '{이름}' -m '{dev_env}' share_test {이미지명}:{태그명}
> docker save -o {파일이름(dev.tar)} {이미지명}:{태그명}
> docker load -i ./{파일이름(dev.tar)}
  • save -o : dev:first 이미지를 dev.tar 파일로 만들어라
  • load -i : tar 파일을 읽어줘