티스토리 뷰

728x170

Docker UnionFS

본 포스팅은 Docker Image 관리 가이드이다. docker를 활용하여 Cloud 환경에 적용하기 위한 이미지 생성 및 관리가이드이다. 먼저 살펴볼 내용은 Docker Image의 구조 특성인 Docker Union에 대해 알아보도록 하자.

Docker는 수많은 형태로 커스터마이징되는 이미지를 공간 효율적으로 관리하기 위해 Union File System을 적용한다. Union-File-System(UFS)은 Copy-On-Write 원칙에 따라 작동하기 때문에 저장 공간을 효율적으로 관리할 수 있는 방식이라고 할 수 있다.

"UnionFS는 Linux, FreeBSD 및 NetBSD용 파일시스템 서비스로, 다른 파일 시스템에 대한 통합 마운트를 구현한다. 이를 통해 브랜치라고 하는 개별 파일 시스템의 파일과 디렉토리를 투명하게 Overlay하여 일관된 단일 파일 시스템을 형성할 수 있다. 병합된 브랜치 내에서 동일한 경로를 가진 디렉토리의 내용은 새로운 가상 파일 시스템 내에서 병합된 단일 디렉토리에서 함께 표시된다.
분기를 마운트할 때 다른 분기보다 한 분기의 우선 순위가 지정됩니다. 따라서 두 분기에 같은 이름의 파일이 포함되어 있으면 하나가 다른 분기보다 우선합니다."
-위키피디아-

이미지를 저장하는 Registry 내 또는 배포되는 Worker Node 내에 컨테이너 간 독립적으로 작성 된 이미지 레이어는 격리되어 개별 저장되지만(Writeable) 공통 이미지 레이어는 단일 이미지의 계층 간뿐만 아니라 다른 이미지 간에도 공유(ReadOnly)된다.

예를 들어, alpine base image를 기반으로 생성한 서로 다른 어플리케이션을 Docker Container로 실행하고자 할 경우 이미지를 각각 생성하였다고 가정했을때, alpine base image 계층은 한 번만 저장되며, 각 컨테이너는 copy-on-write 로직을 사용하여 alpine 이미지를 사용하여 Container를 위한 이미지를 생성한다. 이때 Registry 또는 Worker Node 내에 Read-Only Layer와 각 컨테이너를 위한 Writeable Container Layer만 호스트의 용량을 사용한다.

위 이미지는 Doker Container와 Docker Image 간의 관계를 설명한다.

  • Runtime Container Deploy Layer : Docker Process가 기동되면, Docker Image를 기반으로 하는 Docker Container 모두 기동된다.
  • Union File System : Docker Image는 UFS가 적용되어, 효율적인 디스크 관리가 이루어진다.

일반적으로 UFS 장점으로는 두가지를 이야기한다.

  • Overlay 구조 : 중복되는 영역은 단일 파일시스템을 사용하고, 개별 어플리케이션 또는 레이어에 대해서는 개별 파일시스템을 사용한다.
  • CoW : 동일 이미지를 사용하더라도 ReadOnly 구간은 변경되지 않으며, Writeable 공간에 각 이미지 별 데이터를 저장할 수 있다.

Docker Image

이제 본격적으로 Docker Image에 대해 알아보도록 하겠습니다.
1. docker image 확인
[root@localhost eap-docker]# docker images
REPOSITORY                       TAG                           IMAGE ID            CREATED             SIZE
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-v2     3854d695b442        11 minutes ago      956 MB
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-last   43a82c6e9f90        6 hours ago         956 MB
[root@localhost eap-docker]#
- 현재 생성되어 있는 jboss-eap7.2 이미지입니다.
- 이를 기준으로 docker image에 수정사항을 반영하고 적용하는 과정을 살펴보겠습니다.

2. 수정할 docker image 내부 접속
[root@localhost eap-docker]# docker run -it nara0617.nrson.com/eap:jboss-eap7.2-khan-jdk8-v2 /bin/bash
bash-4.2$

3. 수정 반영
bash-4.2$ pwd
/opt/eap/bin
bash-4.2$ vi standalone.conf
...
#JAVA_OPTS="$JAVA_OPTS -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider"
JAVA_OPTS="$JAVA_OPTS $JAVA_OPTS_APPEND"
# enable garbage collection logging if not set in environment differently
if [ "x$GC_LOG" = "x" ]; then
   GC_LOG="true"
else
   echo "GC_LOG set in environment to $GC_LOG"
fi
...
bash-4.2$ 
- 주석 제거후 기동한 Container에서 빠져나옵니다.
- 이때 ctrl + p +q를 누르면 기동 상태를 종료하지 않고 빠져나올 수 있습니다.

4. 기동 Container 확인
[root@localhost eap-docker]# docker ps -l
CONTAINER ID        IMAGE                                                      COMMAND             CREATED             STATUS              PORTS               NAMES
b0e362a7ea7c        nara0617.nrson.com/eap:jboss-eap7.2-khan-jdk8-v2   "/bin/bash"         4 minutes ago       Up 4 minutes                            heuristic_hypatia
[root@localhost eap-docker]#

5. 기동한 Container 프로세스를 기반으로 Image 생성
[root@localhost eap-docker]# docker export b0e362a7ea7c | sudo docker import --change 'USER oss' --change 'ENV JBOSS_HOME /opt/eap' --change 'CMD ["/opt/eap/bin/startup.sh"]' - nara0617.nrson.com/eap:jboss-eap7.2-khan-jdk8-v3
sha256:e51e39961616292c86dbcf17963f8bc7b6d8a3664e1b7391d4d90efba698d377
[root@localhost eap-docker]#
- docker export [Container ID] | sudo docker import --change 'USER oss' --change 'ENV JBOSSHOME /opt/eap' --change 'CMD ["/opt/eap/bin/startup.sh"]' - nara0617.nrson.com/eap:jboss-eap7.2-khan-jdk8-v3
- docker container를 기반으로 수정사항을 반영하여 jboss-eap7.2-khan-jdk8-v3 tag를 생성하는 구문입니다.
[root@localhost eap-docker]# docker images
REPOSITORY                       TAG                           IMAGE ID            CREATED              SIZE
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-v3     e51e39961616        About a minute ago   956 MB
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-v2     3854d695b442        19 minutes ago       956 MB
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-last   43a82c6e9f90        7 hours ago          956 MB
[root@localhost eap-docker]#
- 위와 같이 docker image v3가 생성된 것을 볼 수 있습니다.

6. 수정한 docker container에 접속하여 변경사항이 정상적으로 반영되었는지 확인
[root@localhost eap-docker]# docker run -it nara0617.nrson.com/eap:jboss-eap7.2-khan-jdk8-v3 /bin/bash
or
[root@localhost eap-docker]# docker run -it -m 1024m -c 2048 nara0617.nrson.com/eap:jboss-eap7.2-khan-jdk8-v3 /bin/bash
bash-4.2$ cd /opt/eap/bin
bash-4.2$ vi standalone.conf
...
#JAVA_OPTS="$JAVA_OPTS -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider"
JAVA_OPTS="$JAVA_OPTS $JAVA_OPTS_APPEND"
...
bash-4.2$ 
- 위와 같이 주석이 제거되어 있는 상태로 반영되어 있습니다.
[root@localhost eap-docker]# docker ps -a
CONTAINER ID        IMAGE                                                      COMMAND             CREATED              STATUS              PORTS               NAMES
e0c4d6266d65        nara0617.nrson.com/eap:jboss-eap7.2-khan-jdk8-v3   "/bin/bash"         About a minute ago   Up About a minute                       youthful_rosalind
[root@localhost eap-docker]# docker images
REPOSITORY                       TAG                           IMAGE ID            CREATED             SIZE
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-v3     e51e39961616        5 minutes ago       956 MB
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-v2     3854d695b442        24 minutes ago      956 MB
nara0617.nrson.com/eap   jboss-eap7.2-khan-jdk8-last   43a82c6e9f90        7 hours ago         956 MB
[root@localhost eap-docker]#

7. Container 재접속
[root@localhost eap-docker]# docker exec -it youthful_rosalind /bin/bash
bash-4.2$

8. docker 호스트에서 docker container로 파일 복사
[root@localhost eap-docker]# docker cp wildfly-common-1.4.0.Final.jar youthful_rosalind:wildfly-common-1.4.0.Final.jar
[root@localhost eap-docker]#
확인해보면
bash-4.2$ ls
bin  boot  deployments  dev  etc  home  jboss-logs  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  wildfly-common-1.4.0.Final.jar
bash-4.2$
위와 같이 업로드 된것을 확인할 수 있습니다.
지금까지 기존 이미지를 기준으로 수정사항을 반영하여 새로운 이미지를 생성하는 과정에 대해 살펴보았습니다.

그리드형
댓글
댓글쓰기 폼