docker 시작하기

docker 설치

설치환경은 linux ubuntu 16.04.2 LTS 환경에서 진행한다

1
2
3
$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

정상적으로 설치가 완료되었다면 이제, 버전을 확인해보자

1
$ sudo docker --version

현재시점의 docker 의 버전은 Docker version 1.12.6, build 78d1802 가 출력되는것을 확인할수있다


이미지 환경패키징

docker는 배포에 특화된 기술이라고 이전포스트 에서 언급한바 있다. 한번 만들어놓은 이미지(환경이 패키징된)는 docker가 설치된 환경이라면 쉽게 생성할수있다.
그럼 이미지파일은 어떻게 만들까 ?

1
$ vi Dockerfile

vi 편집기로 Dockerfile을 열어, 환경정보를 구성한다
이제 실제 환경정보를 기술하자

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
FROM debian
MAINTAINER jaehunpark "setyourmindpark@gmail.com"
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y locales
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
echo 'LANG="en_US.UTF-8"'>/etc/default/locale && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
# set timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN \
echo "===> add webupd8 repository..." && \
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list && \
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 && \
apt-get update
RUN echo "===> install Java" && \
echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes oracle-java8-installer oracle-java8-set-default
RUN echo "===> clean up..." && \
rm -rf /var/cache/oracle-jdk8-installer && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
ENV TOMCAT_VERSION=8.5.13
# Get Tomcat
RUN wget --quiet --no-cookies http://apache.tt.co.kr/tomcat/tomcat-8/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz -O /tmp/tomcat.tar.gz && \
tar xzvf /tmp/tomcat.tar.gz -C /opt && \
mv /opt/apache-tomcat-${TOMCAT_VERSION} /opt/tomcat && \
rm /tmp/tomcat.tar.gz
ENV CATALINA_HOME /opt/tomcat
# jenkins download
#RUN wget --quiet --no-cookies http://mirrors.jenkins.io/war-stable/latest/jenkins.war -O ${CATALINA_HOME}/webapps/jenkins.war
RUN wget --quiet --no-cookies http://mirrors.jenkins.io/war-stable/2.7.2/jenkins.war -O ${CATALINA_HOME}/webapps/jenkins.war
ENV MAVEN_VERSION=3.3.9
# Get Maven
RUN wget --quiet --no-cookies http://apache.tt.co.kr/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz -O /tmp/maven.tar.gz && \
tar xzvf /tmp/maven.tar.gz -C /opt && \
mv /opt/apache-maven-${MAVEN_VERSION} /opt/maven && \
rm /tmp/maven.tar.gz
ENV M3_HOME /opt/maven
ENV PATH=${M3_HOME}/bin:${PATH}
RUN apt-get update && \
apt-get install -y vim && \
apt-get install -y git-core && \
apt-get install -y curl && \
curl -sL https://deb.nodesource.com/setup_6.x | bash - && apt-get install -y nodejs
VOLUME /root
EXPOSE 8080
# Launch Tomcat
CMD ["/opt/tomcat/bin/catalina.sh", "run"]

jenkins 환경구성을 예로든 Dockerfile을 한번 살펴보자.
가장 상위에 FROM 이 보인다, 이부분은 상위의 이미지파일을 참조하겠다는 의미로 받아들이면 편할듯하다
필자는 얼마전까지 openjdk 를 기반으로 jenkins 환경구성을 패키징하였으나, 스프링과 같은 자바 프레임웍을 빌드하는데있어 openjdk가 좀 찝집한면이 업지않아있어 ..debian 으로 구성하였다.
물론 ubuntu와, centos등 지향하는 os를 선택해서 base로 사용할수있다.
base 이미지는 dockerhub 에서 제공하는 녀석들만 해당되므로 참고하도록하자
환경 구성에 필요한 다양한 명령어에 대한 설명은 docker document
를 참고하도록 하자 .


이미지 생성

1
2
$ sudo docker build <옵션> <Dockerfile 경로>
$ sudo docker build --tag jenkins .
  • –tag : 이미지이름

명령어를 실행하면, docker 가 열심히 이미지를 제작하는것을 확인할수있다
생성이 모두 끝났다면,

1
$ sudo docker images

REPOSITORY 부분의 jenkins 가 보일것이다.
만약 으로 표시된다면, 이미지생성에 실패했거나, 생성중 에러가 발생한것이므로, Dockerfile에 작성된 명령어를 다시한번 확인하도록 하자


이미지 삭제

1
2
$ sudo docker rmi <옵션> <REPOSITORY:TAG or IMAGE ID>
$ sudo docker rmi jenkins
  • -f : 이미지 강제삭제

이미지를 컨테이너로 실행

1
2
$ sudo docker run <옵션> <REPOSITORY:TAG or IMAGE ID>
$ sudo docker run -d -p 89:8080 --name jenkins -v /home/docker/jenkins/jenkins_data:/root jenkins
  • -d : 백그라운드로실행
  • -p : 포트포워딩 ex) -p 외부:내부
  • –name : 컨테이너 이름 (NAMES로 바인딩)
  • -v(–volume) : 호스트 디렉토리와 컨테이너 내부디렉토리 공유 ex) –volume /testData:/test (호스트 /testData디렉토리와 컨테이너 /test 디렉토리 공유, 없으면 자동생성)
  • –volumes-from : 이미호스트에 연결된 컨테이너 A를 다른 컨테이너 B,C,D와 연결
    컨테이너 A만 호스트와 연결하기위해 존재, B,C,D 는 A에 연결하여 사용 ex) volumes-from containerA
  • -e : 환경변수 세팅


실행중인 컨테이너 확인

1
2
$ sudo docker ps <옵션>
$ sudo docker ps -a
  • -a : 모든 프로세스 보기


실행중인 컨테이너 중지

1
2
$ sudo docker stop <NAMES OR CONTAINER ID>
$ sudo docker stop jenkins



컨테이너 삭제

1
2
$ sudo docker rm <옵션> <NAMES OR CONTAINER ID>
$ sudo docker rm -f jenkins
  • -f : 컨테이너 강제종료


컨테이너 접속

1
2
$ sudo docker exec <옵션> <NAMES OR CONTAINER ID> bash
$ sudo docker exec -it jenkins /bin/bash
  • -i : interactive 한 환경 구성 컨테이너와 상호작용 (input output)
  • -t : 터미널과 같은 환경 조성 (tty)
  • -u : 계정

견해

위에서 예로든 Dockerfile 은 필자가 직접 환경을 패키징을 한것이고, 기본적으로 dockerhub 에서 제공하는 이미지파일도 굉장히 많다 (물론 docker hub에서 jenkins도 제공한다)
각자가 추구하는 방향에 따라 docker를 사용한다면, 원하는 환경을 빠르게 구성할수있을것이라고 생각된다.
docker 에대한 명령어나, 자세한 정보를 알고자면 공식문서 를 참조하는것이 좋겠다.