티스토리 뷰
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$
위와 같이 업로드 된것을 확인할 수 있습니다.
지금까지 기존 이미지를 기준으로 수정사항을 반영하여 새로운 이미지를 생성하는 과정에 대해 살펴보았습니다.
'③ 클라우드 > ⓓ Docker' 카테고리의 다른 글
[Docker] 기동중인 도커 컨테이너에 파일 복사 및 스냅샷 생성 (0) | 2019.07.19 |
---|---|
[Docker] 폐쇄망에 Docker 구축하기 (3) | 2019.05.21 |
[Docker Issue] 2. Dockerfile로 Image 생성 시 오류 (add failed stat /var/lib/docker/tmp/ no such file or directory) (0) | 2018.10.15 |
[Docker Issue] 1. docker login Issue & docker repository 추가 (0) | 2018.10.15 |
[Cloud] Docker 사용 가이드 (0) | 2018.03.30 |
- Total
- Today
- Yesterday
- SWA
- 마이크로서비스
- 마이크로서비스 아키텍처
- openstack tenant
- aws
- node.js
- aa
- JEUS7
- OpenStack
- webtob
- nodejs
- API Gateway
- 쿠버네티스
- 오픈스택
- jeus
- Architecture
- MSA
- 아키텍처
- kubernetes
- SA
- git
- JBoss
- TA
- wildfly
- openstack token issue
- Docker
- Da
- k8s
- apache
- JEUS6
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |