Trying Docker

3 minute read

Published:

도커(Docker)를 올해 처음 써봤습니다. 정확하게는 지난 학기에 과제를 하면서 시뮬레이터를 로컬에 돌리기 어려웠을 때, 다행히도 해당 시뮬레이터가 도커 이미지를 제공해줘서 그 이미지를 기반으로 과제를 했었습니다. 써보니까 너무 가볍고 간편해서 왜 지금까지 이걸 몰랐지, 그리고 앞으로 자주 써야겠다, 라는 생각을 했습니다.

그리고 지금 연구실 프로젝트를 진행하는데, 환경을 도커로 설정하는 것이 환경을 더 쉽게 세팅할 수 있고 배포를 할 때도 더 간편하게 할 수 있겠다는 생각이 들었습니다. 당장은 글을 쓸 시간이 부족해 도커나 플링크(Apache Flink)에 대한 자세한 설명보다는 제가 도커를 어떻게 설정하고 실행시켰는지 기록하는 데에 방점을 두고자 합니다.

Dockerfile

도커 이미지를 빌드하기 위해서는 Dockerfile이 필요합니다. 현재 작업 디렉토리에 Dockerfile을 하나 만들었습니다. Dockerfile을 만드는 것은 다음 링크를 많이 참조했습니다. 기본적으로 FROM절에는 빌드의 기본이 되는 베이스 이미지를 설정합니다(출처). 앞서 밝혔듯, 배포를 할 때 조금이라도 용량을 줄이기 위해서 우분투보다는 CentOS를 베이스 이미지로 사용했습니다. 이미지를 빌드한 뒤 용량을 살펴보니 약 300MB정도 차이가 났습니다.

FROM centos:latest

우분투만 사용하다 보니 익숙해진 apt-get 명령어를 쓰지 못해 조금 당황스러웠습니다. 대신 기본적으로 설치되어 있는 패키지 관리 프로그램인 yum을 사용해 세팅을 했습니다. 먼저 apt-get update를 하듯이 다음과 같이 yum을 업데이트 해야 합니다.

RUN yum update -y

참고로, 코드에 -y라는 플래그는 업데이트를 하거나 설치를 할 때 나오는 프롬프트에 모두 yes 처리를 하라는 의미입니다.

이렇게 쉽게 업데이트가 되면 문제가 참 쉬웠겠지만, 바로 이런 오류가 발생합니다.

Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

다행히 구글링을 하니까 바로 답이 나왔습니다. 다음 링크에 가시면 찾아보실 수 있습니다. 시간이 없어서 무슨 오류인지는 정확히 읽어보지 못했지만, 대략 CentOS 8이 End of Life(EOL)에 도달해서 공식 CentOS 프로젝트에서부터 업데이트를 받지 않기 때문이라고 합니다. 아마 미러나 레포지토리 정보를 받아오는 주소를 바꾸는 것으로 보입니다.

RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN cd ~/..

RUN yum update -y

yum을 업데이트 하고 난 뒤, 바로 자바와 파이썬을 설치해줍니다.

RUN yum install -y java-11-openjdk-devel.x86_64
RUN yum install -y python3

사실 이렇게 설치를 하면 최신 파이썬이 아닌 3.6.8버전이 설치됩니다. 하지만 PyFlink 튜토리얼에서 3.6, 3.7, 아니면 3.8을 쓰라고 했으니 이대로 둬도 괜찮을 것 같습니다. 다음으로 플링크를 설치할 수 있습니다만…

RUN python3 -m pip install apache-flink

바로 이런 오류가 뜹니다.

Command "python setup.py egg_info" failed with error code 1

링크에 가니 바로 해결책이 나옵니다. 바로 따라해 줍시다.

RUN pip3 install --upgrade --ignore-installed pip setuptools
RUN python3 -m pip install apache-flink

그리고 마지막으로 paho-mqtt를 설치해 줍니다. 참고로, paho-mqtt는 IoT 등에 사용되는 MQTT 프로토콜을 지원하는 오픈소스 라이브러리입니다.

RUN pip3 install paho-mqtt

마지막으로 로컬에 위치한 파일을 마운트 할 수 있게 test 디렉토리를 하나 만들어 줍니다.

RUN mkdir test

Summary

당장 필요한 Dockerfile은 이제 끝입니다! 컨테이너가 시작될 때 실행될 명령어를 지정하는 CMD는 사용하지 않아도 될 것 같아 사용하지 않았습니다. 위 내용을 모두 정리해 봅시다.

Final Dockerfile

FROM centos:latest

RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN cd ~/..

RUN yum update -y

RUN yum install -y java-11-openjdk-devel.x86_64
RUN yum install -y python3
RUN pip3 install --upgrade --ignore-installed pip setuptools
RUN python3 -m pip install apache-flink

RUN pip3 install paho-mqtt

RUN mkdir test

조금 지저분하지만 일단 마무리되긴 했습니다! 정리하자면, CentOS를 베이스 이미지로 하고, 그 위에 java 11python 3.6.8을 설치하였으며, 그 위에는 Apache Flinkpaho-mqtt를 설치했습니다.

Building the Dockerfile

이 Dockerfile을 빌드하는 것은 다음과 같이 하면 됩니다.

$ docker build [OPTIONS] PATH | URL | -

저는 이미지의 name과 tag을 지정할 것이고, 현재 Dockerfile이 위치한 곳에서 빌드할 것이기 때문에 다음과 같은 명령어를 실행하면 됩니다.

$ docker build -t test:3.2 .

이렇게 저는 현재 디렉토리에 위치한 Dockerfile을 빌드하였고, test라는 이름과 3.2라는 태그를 가진 이미지를 만들었습니다. 가능하면 다음 포스팅에는 플링크를 사용해 실제로 애플리케이션을 실행하는 방법을 담아 보겠습니다.