Cloud Engineering/Docker ๐Ÿณ

[Docker] ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ - Dockerfile / Commit / import /export / tag

minjiwoo 2023. 2. 3. 17:42
728x90

1. commit  ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ 

$ docker container commit [OPTION] CONTAINER NEW_IMAGE_REPO:TAG

$ docker commit [OPTION] CONTAINER NEW_IMAGE_REPO:TAG

[์˜ˆ์‹œ]

centos-test1์ด๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ mycentos:first ์ด๋ฏธ์ง€๋กœ ์ƒ์„ฑํ•œ๋‹ค.  

[user@localhost ~]$ docker container commit centos-test1 mycentos:first
sha256:d10bbb77df85ae628a43a2e83135de2c2501dc81f9799fdd4c368e9971c776bc

mycentos:first ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

[user@localhost ~]$ docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
mycentos           first     d10bbb77df85   20 seconds ago   403MB

commit ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด๋ฏธ์ง€์˜ ๋ ˆ์ด์–ด๊ฐ€ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€๋œ๋‹ค. 

$ docker image inspect mycentos 

"RootFS": {
"Type": "layers",
"Layers": [
"sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02",
"sha256:b5a26371ec7bbf3a61dd83ef53c914d85da5631853f1fa3a9012ec6d4763be06"
]
}

 

2. Export / Import 

Docker Container ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ์„ tar ์•„์นด์ด๋ธŒ๋กœ ์ €์žฅ 

export ๋ช…๋ น์–ด๋Š” -o ์˜ต์…˜์„ ๊ฐ™์ด ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค ! 

$ docker container export -o TAR_FILE CONTAINER
$ docker export -o TAR_FILE CONTAINER

docker image save -o TAR_FILE IMAGE_REPO:TAG ์™€ ๋‹ค๋ฅธ ์ ์€ 

export -o ๋ช…๋ น์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์•„์นด์ด๋ธŒํ•˜๋Š” ๋ฐ˜๋ฉด save -o ๋Š” ์ด๋ฏธ์ง€๋ฅผ tar ํŒŒ์ผ๋กœ ์•„์นด์ด๋ธŒ ํ•œ๋‹ค. ๋˜ํ•œ save -o ๋ช…๋ น์–ด์˜ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋‘ ์œ ์ง€๊ฐ€ ๋œ๋‹ค. 

export๋กœ ์ถ”์ถœ๋œ ์•„์นด์ด๋ธŒ ํŒŒ์ผ์„ ์ด๋ฏธ์ง€ํ™”ํ•˜๊ธฐ

$ docker image import TAR_FILE [IMAGE_REPO:TAG]
$ docker import TAR_FILE [IMAGE_REPO:TAG]

์˜ˆ์‹œ

my_newcentos ์ปจํ…Œ์ด๋„ˆ๋ฅผ my.tar ํŒŒ์ผ๋กœ exportํ•œ๋‹ค. 

[root@localhost ~]# docker export -o my.tar new_mycentos
[root@localhost ~]# ls
anaconda-ks.cfg  Documents  file1  httpd_latest.tar      Music   Pictures  Templates
Desktop          Downloads  file2  initial-setup-ks.cfg  my.tar  Public    Videos

my.tar ํŒŒ์ผ์„ my:0.1 ๋ผ๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ import ํ•œ๋‹ค. 

[root@localhost ~]# docker import my.tar my:0.1
sha256:0b40cc8dbe6b20dc2cc8b4b1efa436e68bdf7f61f40e9c7bdd3ae055079f5ec6

[root@localhost ~]# docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
my                 0.1       0b40cc8dbe6b   26 seconds ago   378MB

 

3. Dockerfile ์„ ์ด์šฉํ•œ ๋นŒ๋“œ 

$ docker image build -t IMAGE_REPO:TAG BUILD_PATH
$ docker build -t IMAGE_REPO:TAG BUILD_PATH

๋„์ปค๋Š” Dockerfile์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. Dockerfile์€ ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋˜์–ด ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ธฐ ํŽธํ•˜๊ณ  ์ด๋ฏธ์ง€์˜ ๊ธฐ๋Šฅ์„ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

Dockerfile ์ง€์‹œ์–ด 

์ง€์‹œ์–ด  ์„ค๋ช…
FROM ์ด๋ฏธ์ง€[:ํƒœ๊ทธ] Base Image ์ง€์ •
RUN ๋ช…๋ น์–ด Image๋ฅผ ๋นŒ๋“œํ•˜๋ฉด์„œ ์‹คํ–‰ํ•  ๋ช…๋ น ์ง€์ • ex) ํŒจํ‚ค์ง€, ์„œ๋น„์Šค ์„ค์น˜
CMD ๋ช…๋ น์–ด Container ์‹คํ–‰์‹œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด / ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง€์ •
LABEL key=value ๋ ˆ์ด๋ธ” ์ง€์ •
EXPOSE ํฌํŠธ๋ฒˆํ˜ธ ์ปจํ…Œ์ด๋„ˆ์˜ ์–ด๋–ค ํฌํŠธ๋ฅผ ํ˜ธ์ŠคํŠธ์—๊ฒŒ ๊ณต๊ฐœํ• ์ง€ ์ •์˜ํ•˜์—ฌ Docker Daemon์—๊ฒŒ ํ†ต์ง€ํ•˜๋Š” ๋ช…๋ น์–ด
ENV key=value Container์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง€์ •
ADD ๋„์ปคํ˜ธ์ŠคํŠธ_๊ฒฝ๋กœ ์ด๋ฏธ์ง€_๊ฒฝ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ ์ถ”๊ฐ€ 
COPY ๋„์ปคํ˜ธ์ŠคํŠธ_๊ฒฝ๋กœ ์ด๋ฏธ์ง€_๊ฒฝ๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ ๋„์ปคํ˜ธ์ŠคํŠธ์— ์žˆ๋Š” ํŒŒ์ผ ๋ณต์‚ฌ 
ENTRYPOINT ๋ช…๋ น์–ด ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ๊ธฐ๋ณธ ์‹คํ–‰ ๋ช…๋ น์–ด 
VOLUME ์ปจํ…Œ์ด๋„ˆ_๋‚ด๋ถ€๊ฒฝ๋กœ ๋ณผ๋ฅจ ์—ฐ๊ฒฐ
USER ์‚ฌ์šฉ์ž ์‚ฌ์šฉ์ž ์ง€์ • (์ปจํ…Œ์ด๋„ˆ์—์„œ ํŠน์ • ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ง€์ •)
STOPSIGNAL ์‹œ๊ทธ๋„ ์ข…๋ฃŒ ์‹œ๊ทธ๋„ ์ง€์ • (์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ/์ด๋ฆ„)
WORKDIR ๋””๋ ‰ํ† ๋ฆฌ ์ž‘์—…๋””๋ ‰ํ† ๋ฆฌ
ONBUILD ๋ช…๋ น์–ด ๋นŒ๋“œ ์™„๋ฃŒ์‹œ ์‹คํ–‰ํ•  ์ž‘์—… 
HEALTHCHECK [์˜ต์…˜] CMD ๋ช…๋ น์–ด ์ปจํ…Œ์ด๋„ˆ ํ—ฌ์Šค ์ฒดํฌ 
SHELL ["์‰˜_๊ฒฝ๋กœ", "ํŒŒ๋ผ๋ฏธํ„ฐ"] ๊ธฐ๋ณธ ์‰˜ ์ง€์ •

 

Dockerfile RUN, CMD, ENTRYPOINT ์ง€์‹œ์–ด ๋ช…๋ น์–ด ๋ถ€๋ถ„ ์ž‘์„ฑ ๋ฐฉ์‹ 

exec ํ˜•์‹๊ณผ shellํ˜•์‹ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. exec ๋ฐฉ์‹์€ ๋ช…๋ น์„ ์‰˜์„ ํ†ตํ•ด ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ํ”„๋กœ์„ธ์Šค ํ•œ๊ฐœ๋งŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์„œ docker์—์„œ ๊ถŒ์žฅ๋œ๋‹ค. shell ๋ฐฉ์‹์€ /bin/sh์™€ ๊ฐ™์€ ์‰˜์„ ํ†ตํ•ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‘ ๊ฐœ ํ•„์š”ํ•˜๋‹ค. exec ํ˜•์‹๊ณผ shellํ˜•์‹ ๋‘˜๋‹ค ํ˜•์‹๋งŒ ๋‹ค๋ฅผ ๋ฟ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜๋‹ค. 

exec ํ˜•์‹ ["yum" ,"-y","install","httpd"]
shell ํ˜•์‹ yum -y install httpd

exec ํ˜•์‹์—์„œ๋Š” ๋ฐฐ์—ด๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

Dockerfile ์ž‘์„ฑ ๋ฐ ๋นŒ๋“œ ์˜ˆ์‹œ   

Dockerfile์„ ๋งŒ๋“ค ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. /work/test1 ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— Dockerfile ์„ ์ƒ์„ฑํ•œ๋‹ค. 

[user@localhost ~]$ mkdir work
[user@localhost ~]$ mkdir work/test1
[user@localhost ~]$ cd work/test1
[user@localhost test1]$ vim Dockerfile

Dockerfile์„ vi ํŽธ์ง‘๊ธฐ๋กœ ์ž‘์„ฑํ•œ๋‹ค. 

FROM centos:7
MAINTAINER Minjee Woo
RUN yum -y install httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
ENV WEBPORT 80
EXPOSE ${WEBPORT}
EXPOSE 443
VOLUME /var/www/html
COPY index.html /var/www/html/index.html

๋นŒ๋“œํ•˜๊ธฐ ์ด์ „์— Dockerfile์ด ํ•„์š”๋กœ ํ•˜๋Š” index.html ํŒŒ์ผ์„ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑํ•ด์ค€๋‹ค. 

[user@localhost test1]$ echo "web index page" > index.html
[user@localhost test1]$ ls
Dockerfile  index.html

$ docker image build -t IMAGE_REPO:TAG ๋„์ปคํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ(=๋นŒ๋“œ๊ฒฝ๋กœ) ๋ช…๋ น์–ด๋กœ Dockerfile์— ๋Œ€ํ•ด ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. Dockerfile์„ ๋นŒ๋“œํ•  ๊ฒฝ๋กœ๋ฅผ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ (.)๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค. 

$ docker build -t mjwoo0/docker:centosweb .

๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์›Œ๋ณธ๋‹ค. ํฌํŠธํฌ์›Œ๋”ฉ์„ -p ์˜ต์…˜์„ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ์˜ ํฌํŠธ 8000๋ฒˆ -> ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค. 

[user@localhost test1]$ docker run -d -p 8000:80 -v testweb:/var/www/html --name myweb mjwoo0/docker:centosweb

docker host์—์„œ ์ ‘์†ํ•ด๋ณธ๋‹ค.  

[user@localhost test1]$ curl http://172.17.0.5
web index page

docker host ์™ธ๋ถ€์—์„œ 8000๋ฒˆ ํฌํŠธ๋กœ ์ ‘์†ํ•ด๋ณธ๋‹ค. ํฌํŠธํฌ์›Œ๋”ฉ์ด ๋˜์–ด ๋™์ผํ•œ index.html ํŽ˜์ด์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

user@user-Aspire-E5-576:~$ curl http://192.168.56.110:8000
web index page

 

4. Docker Image tag 

๋„์ปค์—๋Š” ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„์„ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋”ฐ๋กœ ์—†์œผ๋ฉฐ, ํƒœ๊ทธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ์ƒˆ๋กœ์šด Image๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

$ docker image tag IMAGE_REPO:TAG_NEW_REPO:TAG 
$ docker tag IMAGE_REPO:TAG NEW_IMAGE_REPO:TAG

[์˜ˆ์‹œ]

tag ๋ช…๋ น์–ด๋กœ busybox:latest ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ mytoolbox:0.1 ๋ผ๋Š” ์ƒˆ๋กœ์šด ์ด๋ฆ„๊ณผ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

$ docker tag busybox:latest mytoolbox:0.1

mytoolbox:0.1 ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์˜ ์ด๋ฏธ์ง€์™€ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๊ฐ€ IMAGE_ID๊ฐ€ ๋™์ผํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, tag๋Š” ๋ฆฌ๋ˆ…์Šค์˜ ํ•˜๋“œ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋“œ๋งํฌ๋Š” ๋””์Šคํฌ์— ์‹ค์ œ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” inode๋ฅผ ๋งํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ํ•˜๋“œ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ด ๋ฌผ๋ฆฌ์ ์ธ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•˜๋“œ๋งํฌ๊ฐ€ ํ•˜๋‚˜ ๋” ๋Š˜์–ด๋‚œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. 

$ docker image ls 

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      latest    66ba00ad3de8   4 weeks ago     4.87MB
mytoolbox    0.1       66ba00ad3de8   4 weeks ago     4.87MB
728x90