코알못

[Docker] 이미지 생성/불러오기 본문

ETC

[Docker] 이미지 생성/불러오기

코린이s 2022. 11. 25. 16:48
728x90

이번 시간에는 도커 이미지 생성 및 불러오는 실습을 진행 해보자!

우선 아래 이미지를 보면서 이미지 구조부터 보자 ㅎ

Nginx 버전 v1 의 이미지를 생성한다. 이미지는 레이어 아키텍쳐로 구성 되어 있으며 변경 사항이 있을 경우 Layer로 쌓인다.

V1 은 A, B, C 레이어로 구성 되어 있으며

Nginx 버전 v1 에서 몇가지 설정을 변경한 뒤 버전 v2의 이미지를 생성하면 Layer A,B,C 가 그대로 있고 Layer D가 쌓인것을 볼 수 있다. 

Nginx 버전 v2 로 도커 컨테이너를 생성시 이미지 레이어는 Read Only로 사용하며 컨테이너 레이어는 Read/Write로 사용되는 것을 볼 수 있다.

이를 확인 해보자!

아래와 같이 명령어를 입력하여 이미지 항목을 본다.

$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED       SIZE
grafana/grafana   latest    eb4a939d5821   2 days ago    342MB
nginx             latest    88736fe82739   9 days ago    142MB
ubuntu            focal     680e5dfb52c7   4 weeks ago   72.8MB

이미지 레이어 정보의 경우 inspect 명령어를 입력하여 상세 정보를 볼 수 있다.

$ docker inspect nginx
...
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ec4a38999118b78eab6899b913a548cb0b2c9b68fd05aff846a56b628b597f38",
                "sha256:f7ed3797e2964e58da7a396e8b1a98b2aaa84a6190f5fabc57123a92fca78469",
                "sha256:f86e88a471f4cf2a042312c5c2472838b1c806c5ee83b37a2b2e436c76fcdfb7",
                "sha256:5a5bafd53f766cdebd7cf6ec4d07dda9300b5d5906a7afa0829b41899a82ea6e",
                "sha256:e2d75d87993c69701dab59a11e3c081b5d42129048df04e01b50c11bebcf0a5c",
                "sha256:6cffb086835a28fcada50f39aed18e189ae4d3c139717411d477763274412414"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }

레이어의 경우 sha256 로 암호화 되어 저장 되어 있는 것을 볼 수 있으며 6개의 레이어로 구성되어 있는 점을 알 수 있다.

이제 직접 이미지를 생성해보자!

두가지 방법으로 이미지 생성이 가능하며 아래와 같다.

1) Dockerfile 없이 기존 컨테이너 기반으로 생성

2) Dockerfile 을 통해 이미지 생성

Dockerfile 없이 기존 컨테이너 기반으로 이미지 생성하는 방법 부터 보자!

ubuntu 이미지로 컨테이너 생성 및 기동을 진행한다.

$ docker run -it --name corin-ubuntu ubuntu:focal

-it 옵션을 전달 했기에 컨테이너에 접속 되며 해당 컨테이너에서 파일을 생성한다.

$ cat > corin-file
Hello Corin
^C
$ ls
bin   corin-file  etc   lib    lib64   media  opt   root  sbin  sys  usr
boot  dev         home  lib32  libx32  mnt    proc  run   srv   tmp  var
$ cat corin-file
Hello Corin
$ exit
exit

변경한 부분이 적용된 새 이미지 생성을 한다.

// - a [커밋한 사용자] -m [커밋 메세지] [대상 이미지명] [저장할 이미지명과 태그]
$ docker commit -a corin -m "add file" corin-ubuntu corin-ubuntu:v1

sha256:9467040906341f0ddf51e9f24a5c44d205de8dda6e38142363cb8d0983b436a8
$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
corin-ubuntu      v1        946704090634   20 seconds ago   72.8MB
grafana/grafana   latest    eb4a939d5821   2 days ago       342MB
nginx             latest    88736fe82739   9 days ago       142MB
ubuntu            focal     680e5dfb52c7   4 weeks ago      72.8MB

기존 ubuntu 이미지 레이어 정보를 확인 한다.

$ docker image inspect ubuntu:focal
...
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:f4462d5b2da2985f37409c9b257afd2b9fb82356ce4e43e804ee34214242e34a"
            ]
        },

새로 생성한 이미지 레이어 정보를 확인하면 기존 레이어 'f446' 가 있고 뒤에 새 레이어가 생성된 것을 볼 수 있다.

$ docker image inspect corin-ubuntu:v1
..
 "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:f4462d5b2da2985f37409c9b257afd2b9fb82356ce4e43e804ee34214242e34a",
                "sha256:9ce1af8688825b61cd9a767cea8dbc68419e6971d69133ced61d8251c71a0162"
            ]
        },
        "Metadata": {
            "LastTagTime": "2022-11-25T07:37:54.518158Z"
        }

Dockerfile 을 통해 이미지 생성 해보자!

Dockerfile의 경우 아래와 같이 [지시어] [인자] 형태로 생성 가능하다. 

아래 예제를 통해 참고하여 생성하며 그 외 지시어 관련된 상세한 정보는 [도커 공식 문서] 참고한다.

// ENV, ARG 동일한 키를 사용할시 ENV를 읽는다.
FROM node:16 //node js 16 버전을 사용한다.
LABEL createby:corin // 이미지 메타 데이터
ENV FOR=/bar // 환경 변수 전달 (빌드 후에도 사용 가능)
ARG FOR=/corin // 빌드 시점에만 사용
WORKDIR ${FOR} // '/bar'를 불러오며 cd로 해당 경로로 이동한다.
COPY *.json ./ // COPY [source : 호스트] [dest : 이미지 내] 이며 json인 파일을 ./(=/bar)로 이동
RUN "" > test.txt // '>' 명령어 실행
EXPOSE 8080 // docker 이미지가 8080포트를 사용함을 문서화
CMD ["node", "server.js"] // 컨테이너 실행시 어떤 명령어 호출 할지 정의 (= node server.js)

 

이미지 생성의 경우 docker build [OPTIONS] PATH 로 이미지 생성 가능하다. (추후 간단한 앱 만들어 도커 이미지 생성 실습 진행 예정)

// -t [태그명] [디렉토리]
// 해당 디렉토리에 있는 Dockerfile 이름의 파일을 읽어 빌드
$ docker build -t corin_app:v1 ./
// -f [도커 파일명 지정하여 실행]
$ docker build -t corin_app:v1 -f example/CorinDockerfile ./

빌드시 해당 경로에 있는 파일을 도커 빌드 컨텍스트에 복사 하게 되며

복사할 파일 크기가 크다면 빌드 시간도 오래 소요된다.

이를 방지하기 위해 .dockerignore 파일을 이용하여 빌드 제외 대상을 정의하여 제외 하고 빌드가 가능하다.

이제 이미지 압축 하여 저장 및 이미지 불러오는 실습을 진행해보자!

네트워크를 거치지 않고 이미지를 사용하거나

다른 사용자에게 저장소가 아닌 파일로 공유시 사용하면 된다.

이미지 항목을 확인 하며 corin-ubuntu 를 압축파일로 저장한다.

$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
corin-ubuntu      v1        946704090634   48 minutes ago   72.8MB
grafana/grafana   latest    eb4a939d5821   2 days ago       342MB
nginx             latest    88736fe82739   9 days ago       142MB
ubuntu            focal     680e5dfb52c7   4 weeks ago      72.8MB
$ docker save -o corin-ubuntu.tar corin-ubuntu:v1
$ ls
corin-ubuntu.tar

현재 로컬에 있는 이미지를 제거한다.

$ docker rmi corin-ubuntu:v1
Error response from daemon: conflict: unable to remove repository reference "corin-ubuntu:v1" (must force) - container b0d6b61f83a3 is using its referenced image 946704090634
$ docker rmi -f corin-ubuntu:v1
Untagged: corin-ubuntu:v1
Deleted: sha256:9467040906341f0ddf51e9f24a5c44d205de8dda6e38142363cb8d0983b436a8
$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED       SIZE
grafana/grafana   latest    eb4a939d5821   2 days ago    342MB
nginx             latest    88736fe82739   9 days ago    142MB
ubuntu            focal     680e5dfb52c7   4 weeks ago   72.8MB

이제 압축 이미지 파일을 로컬 저장소에 로드한다.

$ docker load -i corin-ubuntu.tar
Loaded image: corin-ubuntu:v1

확인 하면 정상적으로 이미지가 로드 된것을 볼 수 있다.

$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
corin-ubuntu      v1        946704090634   50 minutes ago   72.8MB
grafana/grafana   latest    eb4a939d5821   2 days ago       342MB
nginx             latest    88736fe82739   9 days ago       142MB
ubuntu            focal     680e5dfb52c7   4 weeks ago      72.8MB

끝!

728x90
Comments