본문 바로가기
Programming/Docker

Docker 활용기(1) - Container 만들어보기

by ★용호★ 2017. 1. 16.

docker 구성을 하면서 처음에는 아래와 같이 각 서버들을 사내에서 사용하고 있는 OS와 동일한 환경을 만들기 위해 우분투 16.04 버전 기반으로 이미지를 생성했었다. 그리고 각 서버별로 ssh 접속을 할 수 있도록 설정하고, 각각의 서비스들을 내려받아 구성하는 내용을 전부 Dockerfile에 작성했다.


 
FROM ubuntu:16.04
MAINTAINER Server Team <yongho1037@vinusent.com>
# Set locales
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
# Fix sh
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
# Install dependencies
RUN apt-get update -y && apt-get upgrade -y && \
    apt-get install -y git build-essential curl wget software-properties-common openssh-server vim iputils-ping
# ubuntu 16.04
RUN apt-get install -y mariadb-server mariadb-client
# Important! : You should change passwd. (default yongho)
RUN adduser --disabled-password --gecos "" yongho  \
    && echo 'yongho:yongho' | chpasswd \
    && mkdir /var/run/sshd
COPY conf/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf
COPY conf/my.cnf /etc/mysql/my.cnf
COPY sql/init.sql /opt/init.sql
COPY script/init.sh /opt/init.sh
EXPOSE 3306
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

이렇게 하다보니 Dockerfile 내용이 복잡해지고, 처음 이미지를 빌드할 때 굉장히 오랜 시간이 걸리는 문제가 생겼었다. 또한 Dockerfile에서는 하나의 CMD 명령만 적용이 되기 때문에 ssh를 실행시키도록 하였더니 컨테이너를 내렸다 올릴 때마다 mysql과 같은 서비스를 수동으로 시작시켜줘야 하는 불편함이 생겼다.

또한 편의상 ssh로 docker에 접근하는 것보다 docker exec 명령으로 접근하는 경우가 더 많았고, 외부에서 접근이 필요한 tomcat 서버(jenkins로 배포를 해야하기 때문에) 외에는 굳이 ssh로 붙지 않아도 각각의 클라이언트를 이용하면 되었다. (mysql, redis, mongo 등)

그 중에서도 가장 우려되었던 것은 하나의 컨테이너에서는 하나의 서비스만 동작하는 것을 지향하는 docker의 기본 철학을 무시하는 것 같기도 했고, official 버전이 아니었기 때문에 불필요한 패키지들이 설치될 뿐만 아니라 신뢰도가 떨어진다는 점이었다. 그래서 결국 모든 서비스들을 official 버전을 사용하는 방향으로 결정했다. 이렇게 구성을 하니 오히려 설정이 간단해졌고, 빌드 시간도 엄청나게 짧아졌으며, 기본 환경에 대한 의심을 갖지 않고 쓸 수 있게 되었다.

댓글