최근 다른 운영체제에 프로그램을 실행해야하는 상황에서 Docker를 통해 image를 만들어 배포했던 경험을 정리해두고자합니다.
본 포스트에서는 우리가 배포하고자하는 프로그램이나 시스템을 image로 만들기 위해 Dockerfile 작성에 대해 정리해보겠습니다.
Docker의 기본 명령어는 아래 링크 참조 해주세요!
2021.12.16 - [OS(운영체제)/Linux] - [Linux] Docker 주로 사용하는 명령어 모음!!
공부한 내용을 바탕한 거라 잘못된 부분이나 피드백은 언제든지 환영입니다.
01. Dockerfile 이란?
Dockerfile은 Docker Image를 만들기 위한 config(설정) 명령이 담긴 파일입니다.
Dockerfile 작성에 명령어를 사용하여 작성자가 원하는 설정의 Docker Image를 얼마든지 만들 수 있습니다.
Docker File을 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있습니다!
02. Dockerfile 을 이용한 Docker image 만드는 과정
1. docker image에 올릴 프로그램 준비
2. 이에 맞는 dockerfile 작성
3. docker build 를 통해 docker 이미지 생성
docker build -t [내 이미지 이름]:[버전] [target directory]
예시) docker build -t myprogram:v1.0.1 ./
4. dockerfile을 수정 시, docker build을 다시해주어야 합니다.
03. Dockerfile 작성 관련 명령어
FROM
어떤 이미지를 기반으로 할지 설정한다. Docker 이미지는 기존에 만들어진 이미지를 기반으로 생성한다. 만약 완전히 새로운 이미지를 생성하고 싶으면(“맨 땅에서 시작한다”) FROM scratch를 쓰면 된다.
MAINTAINER
메인테이너(제작자) 정보이다.
RUN
쉘 스크립트/명령을 실행한다. docker image 를 생성할때, docker build 를 해줄 때 실행되는 명령어를 입력해야한다.
그렇기 때문에 이미지 생성 중에는 사용자 입력을 받을 수 없다. 그래서 apt-get install 명령어를 사용할 경우 -y 옵션을 붙여야 한다.
VOLUME
호스트와 공유할 디렉터리 목록이다. docker run 명령어에서 -v 옵션으로 설정할 수도 있다.
COPY
빌드시에 주어진 컨텍스트에서 첫번째 인자로 주어진 파일, 폴더를 두번째 인자로 주어진 컨테이너 경로에 추가한다.
오로지 로컬 호스트의 DIR에서 docker image로 복사해온다. (리눅스의 cp 명령어와 같다 생각하면된다!)
ADD
COPY 명령어와 동일하게 필요한 폴더를 가지고 올 수있다. 하지만 ADD는 URL(설치 서버 URL)도 docker image 빌드시 가져올 수 있으며, ".tar" 파일을 복사하면 자동으로 압축해제를 해준다.
CMD
컨테이너가 시작되었을 때 실행할 실행 파일 쉘 스크립트이다. CMD는 생성된 docker image로 container 생성시, 입력 인자를 받아 변경이 가능하다. (ENTRPYPOINT와 다른점)
ENTRYPOINT
컨테이너가 시작되었을때, 스크립트 혹은 명령어를 실행합니다.
WORKDIR
디렉토리를 이동 할 수 있다. (리눅스의 cd 명령어와 같다!)
EXPOSE
호스트와 연결할 포트 번호이다. 외부와 통신을 가능하게 노출시켜 준다. 기본적으로 컨테이너 실행시 docker run -p 옵션을 주게 되면 암묵적으로 EXPOSE가 된다.
ENV
환경변수를 설정한다.
04. Dockerfile 작성 예시
Dockerfile 작성 예시는 작성된 Dockerfile 로 이미지 생성후 배포 및 외부접속까지 하고자합니다.
그래서, Dockerfile 작성 예시에 작성될 내용은 flask를 이용한 게시판 프로젝트를 작성하고자합니다.
flask를 이용한 게시판 프로젝트는 해당 링크 참조 부탁드립니다.
(https://wikidocs.net/book/1)
flask 게시판 프로젝트를 "CentOS7" 환경을 서버로하여 구동하는 것을 예시로 했습니다.
flask image를 pull로 받아서 하실 수 있을거에요!
예시는 예시로써 참고해주세요! 제가 진행한 방법에 대한 정리입니다!
#vi Dockerfile
FROM centos:7
#set root password
RUN echo "root:panython" | chpasswd
#install systemc package
RUN yum install -y sqlite-devel openssl-devel bzip2-devel libffi-devel zlib zlib-devel sudo which
RUN yum install -y python3 python3-devel
#python and python library
## requirements.txt는 필요한 python library 설치
RUN python3.6 -m pip install --upgrade pip
COPY requirements.txt /
RUN pip3.6 install -r requirements.txt
#flask file systems
ADD /flask_board_project.tar /root/
#ENV
ENV LC_ALL=en_US.UTF-8
ENV FLASK_APP=/root/flask_board_project/pybo
ENV FLASK_ENV=development
#Start Directory
WORKDIR /root/
CMD ["/bin/bash"]
Dockerfile을 한줄씩 간략히 설명하자면 아래와 같습니다.
더보기
#vi Dockerfile
FROM centos:7 >> centos7 image를 가상 os로 만들어줘
#set root password
RUN echo "root:panython" | chpasswd >> 계정은 root로 만들고, 비밀번호는 panython으로 해
#install systemc package
RUN yum install -y sqlite-devel openssl-devel bzip2-devel libffi-devel zlib zlib-devel sudo which >> RUN을 통해 해당 명령어 수행해줘
RUN yum install -y python3 python3-devel >> RUN을 통해 해당 명령어 수행해줘
#python and python library
## requirements.txt는 필요한 python library 설치
RUN python3.6 -m pip install --upgrade pip >> RUN을 통해 해당 명령어 수행해줘
COPY requirements.txt / >> 현재 디렉토리에 있는 requirements.txt 파일을 docker image의 "/" 위치로 복사해줘
RUN pip3.6 install -r requirements.txt >> RUN을 통해 해당 명령어 수행해줘
#flask file systems
ADD /flask_board_project.tar /root/ >> 현재 디렉토리에 /flask_board_project.tar을 docker iamge의 "/root/" 위치로 복사하고 압축해제 해줘
#ENV
ENV LC_ALL=en_US.UTF-8 >> LC_ALL을 en_US.UTF-8로 환경변수 설정해줘
ENV FLASK_APP=/root/flask_board_project/pybo >> 환경변수 설정해줘
ENV FLASK_ENV=development >> 환경변수 설정해줘
#Start Directory
WORKDIR /root/ >> 생성된 docker image의 시작 디렉토리는 "/root"로 해줘
CMD ["/bin/bash"] >> docker image가 실행될땐 "/bin/bash"가 실행해줘