도커 이미지
도커 이미지는 애플리케이션 자신 뿐만아니라 실행에 필요한 모든 것들을 담고 있다. OS, DBMS, 웹서버 등 시스템 상에서 이용되는 대부분의 요소를 이미지로 생성이 가능하다.
도커 컨테이너를 실행할 때 run
명령어로 실행 하게 된다.
sudo docker container run -it --name ubuntu ubuntu:latest
이 과정에서 로컬에 ubuntu:latest
라는 이미지가 없으면 어디선가 내려받는 동작을 한다. 이 이미지는 로컬에 없을 경우 Docker Hub에서 이미지를 내려받는다. ubuntu라는 이미지의 latest 태그명을 찾아서 받는다. 아래 사진의 빨간 박스를 친 부분에 latest
태그명이 보이며, 20.04
버전을 내려받게 되는 것이다.

도커 이미지 관리 명령어
PULL
도커 이미지를 내려받을 때 명령어는 PULL
을 사용한다.
sudo docker image pull ubuntu
sudo docker image pull ubuntu:focal
sudo docker image pull ubuntu:latest
sudo docker image pull 이미지명[:태그]
위에서 확인 했듯이 태그명을 입력해주어 원하는 버전의 이미지를 내려 받을 수 있다. 첫 번째 줄에 태그가 생략되면 latest
를 내려받는다. latest
태그는 장기 지원 버전(LTS)이나 안정화(stable) 버전에 붙인다. Ubuntu의 경우 20.04 버전이 가장 최신의 장기 지원 버전이기 때문에 latest
태그가 붙어있는 것이다.
cndtjs@ubuntu-server:~$ sudo docker image pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
16ec32c2132b: Pull complete
Digest: sha256:82becede498899ec668628e7cb0ad87b6e1c371cb8a1e597d83a47fac21d6af3
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
위에 결과 처럼 태그명이 latest
인 이미지를 내려받은 것을 확인할 수 가 있다.
그리고 Digest
라는 것은 Docker hub
에서 이미지를 관리하는 식별자이고, 16ec32c2132b
는 내려받은 이미지가 우리 로컬에서 채번이 된 식별자이다.
✌ SHA256 - Secure Hash Algorithm
해싱 알고리즘 중 하나인 SHA256은 데이터를 암호화 하는 데에 사용한다. 256이라는 숫자는 총 256bit의 길이로 해시 값을 이룬다는 의미이며, 2256의 경우의 수가 존재한다.
ls
내려받은 이미지의 목록을 조회할 때는 ls
명령어를 사용한다.
cndtjs@ubuntu-server:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest bde40dcb22a7 2 weeks ago 138MB
ubuntu latest 1318b700e415 3 weeks ago 72.8MB
centos latest 300e315adb2f 8 months ago 209MB
좀전에 내려받은 ubuntu 이미지를 확인할 수가 있다. ls
에 붙는 옵션
- --all, -a : 숨겨진 중간 단계 이미지까지 모두 조회한다.
- --format : 출력 포맷을 설정한다.
- —-digests : 다이제스트를 포함하-여 이미지를 조회한다.
- —-quiet, -q : 이미지 ID만 조회한다.
inspect
inspect
명령어는 해당 이미지의 정보를 확인할 때 사용하는 명령어이다.
cndtjs@ubuntu-server:~$ sudo docker image inspect ubuntu
[
{
"Id": "sha256:1318b700e415001198d1bf66d260b07f67ca8a552b61b0da02b3832c778f221b",
"RepoTags": [
"ubuntu:latest"
],
"RepoDigests": [
"ubuntu@sha256:82becede498899ec668628e7cb0ad87b6e1c371cb8a1e597d83a47fac21d6af3"
],
"Parent": "",
"Comment": "",
"Created": "2021-07-26T21:21:40.307832875Z",
"Container": "c956fe828128e93f86f7628bff7449517519f8ed8dc87285077108eefb8d16ac",
"ContainerConfig": {
"Hostname": "c956fe828128",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
~~~
엄청 긴 이미지의 정보가 표기가 된다. ~는 생략!!
이미지의 정보를 뽑을 때 필요한 정보만을 출력할 수 도 있다. 위에 보이는 RepoTags
의 정보를 가져온다.
cndtjs@ubuntu-server:~$ sudo docker image inspect --format="{{ .RepoTags }}" ubuntu
[ubuntu:latest]
~$ sudo docker image inspect --format="{{ .GraphDriver.Data }}" ubuntu:18.04
map[MergedDir:/var/lib/docker/overlay2/ed96a305a4f922c9145aa190157bbaff6d22e5288773cfd0c47e92b593739d73/merged UpperDir:/var/lib/docker/overlay2/ed96a305a4f922c9145aa190157bbaff6d22e5288773cfd0c47e92b593739d73/diff WorkDir:/var/lib/docker/overlay2/ed96a305a4f922c9145aa190157bbaff6d22e5288773cfd0c47e92b593739d73/work]
key:value 형식으로 되어 있어 위처럼 가져올때는 map타입으로 가져오게 되는 것 같다.
tag
tag
명령어는 현재 저장되어 있는 이미지의 복사본을 만들어 새로운 이미지명과 태그를 붙여주는 명령어이다.
cndtjs@ubuntu-server:~$ sudo docker image tag ubuntu:18.04 cndtjs/ubuntuos:1.0
내려받은 ubuntu:18.04
이미지에 cndtjs/ubuntus:1.0
이라는 이름으로 태그를 달아보았다.
cndtjs@ubuntu-server:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest bde40dcb22a7 2 weeks ago 138MB
ubuntu latest 1318b700e415 3 weeks ago 72.8MB
cndtjs/ubuntuos 1.0 39a8cfeef173 3 weeks ago 63.1MB
ubuntu 18.04 39a8cfeef173 3 weeks ago 63.1MB
centos latest 300e315adb2f 8 months ago 209MB
ls
명령어로 목록을 확인해보면 이미지 id 가 39a8cfeef173
로 같은 이미지가 2개가 존재한다. 이는 이미지의 실체가 같다는 뜻인데 실체가 같은 이미지를 굳이 생성하는 이유는 Docker Hub를 비롯한 다양한 클라우드 사업자의 레지스트리에 저장할 수 있다. 하지만 각 클라우드 사업자 별로 이미지를 업로드할 때 사용되는 이미지명의 규칙이 달라 이를 맞춰주어야 하기 때문에 같은 실체의 이미지 지만 이미지명을 변경해줄 수 있다.
rm
rm
명령어는 이미지를 삭제할 때 사용한다.
sudo docker image rm cndtjs/ubuntuos:1.0
sudo docker image rm ubuntu:18.04
sudo docker image rm 이미지명[:태그]
sudo docker image rm 이미지ID
cndtjs@ubuntu-server:~$ sudo docker image rm cndtjs/ubuntuos:1.0
Untagged: cndtjs/ubuntuos:1.0
cndtjs@ubuntu-server:~$ sudo docker image rm ubuntu:18.04
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:7bd7a9ca99f868bf69c4b6212f64f2af8e243f97ba13abb3e641e03a7ceb59e8
Deleted: sha256:39a8cfeef17302cb7ce93cefe12368560fe62ef9d517808855f7bda79a1eb697
Deleted: sha256:21639b09744fc39b4e1fe31c79cdf54470afe4d7239a517c4060bd181f8e3039
위에서 생성한 이미지와 그의 태그 이미지를 각각 삭제해봤다. 원 이미지에서 태그된 이미지에 rm 명령어를 실행하면 태그 해제만 되고 실체는 삭제않는다. 만약 이 두 가지 이미지를 한꺼번에 삭제하려면 이미지 ID와 강제 삭제를 위한 -f 옵션을 사용해야 한다. 여러 곳에서 동일한 이미지를 참조하고 있는 경우 강제 옵션 없이 이미지 삭제가 불가능 하다.
container commit
container commit
명령어는 현재 실행중인 container로 부터 이미지를 생성할 때 사용한다.
cndtjs@ubuntu-server:~$ sudo docker container run -d -p 80:80 --name apache httpd
a7b279768edd7385c5be414e9d1fc5f335518f45d9f182aa370e3ed502500f65
cndtjs@ubuntu-server:~$ sudo docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7b279768edd httpd "httpd-foreground" 9 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp apache
먼저 httpd 이미지를 apache라는 이름으로 실행을 시켰다.
cndtjs@ubuntu-server:~$ sudo docker container commit -a "cndtjs" apache cndtjs/apache-web:1.0
sha256:c579310a6519dd50a4f96f77e72577af56e49d269981e3656c4c2be114dca31c
cndtjs@ubuntu-server:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
cndtjs/apache-web 1.0 c579310a6519 8 seconds ago 138MB
httpd latest bde40dcb22a7 2 weeks ago 138MB
ubuntu latest 1318b700e415 3 weeks ago 72.8MB
centos latest 300e315adb2f 8 months ago 209MB
실행중인 컨테이너 apache를 cndtjs/apache-web:1.0
으로 이미지를 생성한 것을 볼 수 있다. -a
는 작성자를 입력하는 옵션이다. 위에서 운 inspect를 사용하면 -a 옵션에 입력한 명을 볼 수 있다.
cndtjs@ubuntu-server:~$ sudo docker image inspect --format="{{ .Author }}" cndtjs/apache-web:1.0
cndtjs
-a 말고 커밋 메세지를 입력하는 -m이 있다. 그리고 이미지를 생성하는 명령어 이지만 image가 아닌 container 명령어를 사용한다는 점을 잊지말자. commit은 실행 중인 컨테이너에 수행되는 명령으로서, 컨테이너를 실행하는데에 사용했던 이미지와는 다른 이미지를 만들어낸다.
container export
container export
명령어는 실행중인 컨테이너로 부터 파일을 생성할 때 사용하는 명령어이다.
cndtjs@ubuntu-server:~$ sudo docker container export apache > apache.tar
cndtjs@ubuntu-server:~$ ls -al
total 135176
drwxr-xr-x 4 cndtjs cndtjs 4096 Aug 23 13:21 .
drwxr-xr-x 3 root root 4096 Aug 17 05:19 ..
-rw-rw-r-- 1 cndtjs cndtjs 138384896 Aug 23 13:22 apache.tar
-rw------- 1 cndtjs cndtjs 2157 Aug 17 09:18 .bash_history
-rw-r--r-- 1 cndtjs cndtjs 220 Apr 4 2018 .bash_logout
-rw-r--r-- 1 cndtjs cndtjs 3771 Apr 4 2018 .bashrc
drwx------ 2 cndtjs cndtjs 4096 Aug 17 05:22 .cache
drwx------ 3 cndtjs cndtjs 4096 Aug 17 05:22 .gnupg
-rw-r--r-- 1 cndtjs cndtjs 807 Apr 4 2018 .profile
-rw-r--r-- 1 cndtjs cndtjs 0 Aug 17 05:34 .sudo_as_admin_successful
현재 실행중이 었던 apache 컨테이너에서 apache.tar
파일을 생성한 것을 볼 수 있다.
import
import
명령어는 위에서 export
로 만들어낸 파일을 이미지로 생성할 때 사용하는 명령어이다.
cndtjs@ubuntu-server:~$ sudo docker image import apache.tar cndtjs/apache-web:1.1
sha256:f089c7ff4b343dab9459209d7dd91c5d1a35d23890b5194e7a961101ee3b82a1
cndtjs@ubuntu-server:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
cndtjs/apache-web 1.1 f089c7ff4b34 8 seconds ago 135MB
cndtjs/apache-web 1.0 c579310a6519 4 minutes ago 138MB
httpd latest bde40dcb22a7 2 weeks ago 138MB
ubuntu latest 1318b700e415 3 weeks ago 72.8MB
centos latest 300e315adb2f 8 months ago 209MB
위에서 생성한 apache.tar
파일로 cndtjs/apache-web:1.1
이름의 이미지를 생성한 것을 볼 수 있다.
지금까지 이미지 관리에 필요한 명령어들을 알아봤다. 이제 Dockerfile
에 대해서 알아보자.
Dockerfile
Dockerfile
은 새로운 이미지를 빌드하는 데에 필요한 이미지와 설정들을 작성한 파일로 어떤 이미지를 사용할지, 어떤 포트를 열어놓을지 등에 대해서 정의가 완료되면 이 내용을 Dockerfile의 양식에 맞게 작성하기만 하면 된다.
실습하기 위해 docker 폴더를 만들고 docker 에서 Dockerfile을 생성했다.
cndtjs@ubuntu-server:~$ mkdir docker
cndtjs@ubuntu-server:~$ cd docker
cndtjs@ubuntu-server:~/docker$ ll
total 8
drwxrwxr-x 2 cndtjs cndtjs 4096 Aug 23 13:41 ./
drwxr-xr-x 5 cndtjs cndtjs 4096 Aug 23 13:41 ../
cndtjs@ubuntu-server:~/docker$ touch Dockerfile
cndtjs@ubuntu-server:~/docker$ nano Dockerfile
- dockerfile
FROM ubuntu:18.04
ubuntu 에서
touch
는 파일을 생성해주고 nano는 파일을 편집할 때 사용하는 명령어이다.
cndtjs@ubuntu-server:~/docker$ sudo docker build -t myubuntu:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM ubuntu:18.04
18.04: Pulling from library/ubuntu
feac53061382: Pull complete
Digest: sha256:7bd7a9ca99f868bf69c4b6212f64f2af8e243f97ba13abb3e641e03a7ceb59e8
Status: Downloaded newer image for ubuntu:18.04
---> 39a8cfeef173
Successfully built 39a8cfeef173
Successfully tagged myubuntu:1.0
cndtjs@ubuntu-server:~/docker$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
cndtjs/apache-web 1.1 f089c7ff4b34 19 minutes ago 135MB
cndtjs/apache-web 1.0 c579310a6519 24 minutes ago 138MB
httpd latest bde40dcb22a7 2 weeks ago 138MB
ubuntu latest 1318b700e415 3 weeks ago 72.8MB
myubuntu 1.0 39a8cfeef173 3 weeks ago 63.1MB
ubuntu 18.04 39a8cfeef173 3 weeks ago 63.1MB
centos latest 300e315adb2f 8 months ago 209MB
myubunt:1.0 이라는 이름으로 빌드를 하고 .
으로 현재경로를 지정한다. 그럼 현재경로의 Dockerfile을 찾아 빌드를 하기 된다. dockerfile 에서 입력해두었던 Step 1/1 : FROM ubuntu:18.04
가 실행 된 것을 볼 수 있고 ubuntu:18.04 가 정상적으로 내려받아진 것을 확인 할 수 있다.
이제 세부적으로 어떤 명령어 들이 있는지 확인해보자
FROM
FROM
명령어는 베이스 이미지를 세팅하는 명령어로써 기본적으로 Docker Hub에서 이미지를 탐색해 빌드에 사용한다.
RUN
RUN
명령어는 이미지를 빌드할 때 실행되는 명령어로 컨테이너 실행되기 전 단계에서 실행이된다. 베이스 이미지에 추가적으로 명령을 실행해 필요한 패키지나 미들웨어를 설치하기 위해 많이 사용한다.
cndtjs@ubuntu-server:~/docker$ nano Dockerfile
FROM ubuntu:18.04
ENV DEBCONF_NOWARNINGS yes
RUN apt-get update -y
RUN apt-get upgrade -y
cndtjs@ubuntu-server:~/docker$ sudo docker build -t myubuntu:1.1 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM ubuntu:18.04
---> 39a8cfeef173
Step 2/4 : ENV DEBCONF_NOWARNINGS yes
---> Running in 7c4b90a81dac
Removing intermediate container 7c4b90a81dac
---> ca3b1e34f2fe
Step 3/4 : RUN apt-get update -y
---> Running in c6ecf60dcee6
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [26.7 kB]
Get:4 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1424 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
Get:8 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
Get:9 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
Get:10 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
Get:11 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [2199 kB]
Get:12 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [2730 kB]
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [575 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [34.4 kB]
Get:15 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [11.3 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [11.4 kB]
Get:17 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [543 kB]
Get:18 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [2294 kB]
Fetched 23.2 MB in 20s (1164 kB/s)
Reading package lists...
Removing intermediate container c6ecf60dcee6
---> 58b68f81cf3e
Step 4/4 : RUN apt-get upgrade -y
---> Running in ff6f064200eb
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages will be upgraded:
libsystemd0 libudev1
2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 263 kB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsystemd0 amd64 237-3ubuntu10.51 [207 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libudev1 amd64 237-3ubuntu10.51 [56.2 kB]
Fetched 263 kB in 2s (136 kB/s)
(Reading database ... 4051 files and directories currently installed.)
Preparing to unpack .../libsystemd0_237-3ubuntu10.51_amd64.deb ...
Unpacking libsystemd0:amd64 (237-3ubuntu10.51) over (237-3ubuntu10.50) ...
Setting up libsystemd0:amd64 (237-3ubuntu10.51) ...
(Reading database ... 4051 files and directories currently installed.)
Preparing to unpack .../libudev1_237-3ubuntu10.51_amd64.deb ...
Unpacking libudev1:amd64 (237-3ubuntu10.51) over (237-3ubuntu10.50) ...
Setting up libudev1:amd64 (237-3ubuntu10.51) ...
Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
Removing intermediate container ff6f064200eb
---> fe958fed4c4d
Successfully built fe958fed4c4d
Successfully tagged myubuntu:1.1
각 줄에 해당하는 명령어를 단계적으로 실행이 된 것을 볼 수 있다.
RUN apt-get -y update # Shell 형식
RUN ["/bin/bash", "-c", "apt-get -y update"] # Exec 형식
CMD
CMD
명령어는 이미지를 통해 생성된 컨테이너 내부에서 실행되는 명령어이다. 단 한줄만 입력되어야 하며, 여러줄이 입력되었을 때는 가장 마지막줄이 적용이 된다.
실습을 위해 ex01 폴더를 생성하고 Dockerfile을 생성했다.
cndtjs@ubuntu-server:~$ mkdir ex01
cndtjs@ubuntu-server:~$ cd ex01
cndtjs@ubuntu-server:~/ex01$ touch Dockerfile
cndtjs@ubuntu-server:~/ex01$ nano Dockerfile
- Dockerfile
FROM ubuntu:18.04
RUN apt-get update -y
RUN apt-get install apache2 -y
EXPOSE 80
CMD apachectl -D FOREGROUND
실행 결과 로그는 너무 길어서 생략한다. EXPOSE
는 HTTP 방식의 통신을 위해 '80'번 포트를 열어주는 명령어이다.
Step 5/5 : CMD apachectl -D FOREGROUND
---> Running in 462f9670d984
Removing intermediate container 462f9670d984
---> 1e8fb067ebb3
Successfully built 1e8fb067ebb3
Successfully tagged apache2:1.0
cndtjs@ubuntu-server:~/ex01$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
apache2 1.0 1e8fb067ebb3 About a minute ago 197MB
myubuntu 1.1 fe958fed4c4d 24 minutes ago 102MB
cndtjs/apache-web 1.1 f089c7ff4b34 About an hour ago 135MB
cndtjs/apache-web 1.0 c579310a6519 About an hour ago 138MB
httpd latest bde40dcb22a7 2 weeks ago 138MB
ubuntu latest 1318b700e415 3 weeks ago 72.8MB
myubuntu 1.0 39a8cfeef173 3 weeks ago 63.1MB
ubuntu 18.04 39a8cfeef173 3 weeks ago 63.1MB
centos latest 300e315adb2f 8 months ago 209M
cndtjs@ubuntu-server:~/ex01$ sudo docker container run -d -p 80:80 --name webserver2 apache2:1.1
b4e809cbf88ba4ce23d2be29716989b71b37a9c7dddc3f4b170a0cbb8103a849
cndtjs@ubuntu-server:~/ex01$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4e809cbf88b apache2:1.1 "apachectl -D FOREGR…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp webserver2
CMD의 명령어로 컨테이너가 실행 시 base 이미지인 ubuntu 에 설치한(레이어된) apache가 실행이 된 것을 확인할 수 있다. (실제 웹으로 접속해서 결과를 확인할 수 있다.)
ENTRYPOINT
ENTRYPOINT
명령어는 이미지를 통해 생성된 컨테이너 내부에서 실행되는 명령어로 RUN과 상관없이 무조건 명령을 수행한다.
cndtjs@ubuntu-server:~$ mkdir ex02
cndtjs@ubuntu-server:~$ cd ex02
cndtjs@ubuntu-server:~/ex02 $ touch Dockerfile
cndtjs@ubuntu-server:~/ex02 $ nano Dockerfile
- Dockerfile
FROM ubuntu:18.04
ENTRYPOINT ["top"]
CMD ["-d", "5"]
시스템 모니터링을 할 수 있는 top
명령어를 작성하고 CMD
에 5초의 주기를 적용했다. 이제 대화형 컨테이너를 실행하면 top 명령어가 실행되는 것을 확인할 수 있다.
cndtjs@ubuntu-server:~/ex02$ sudo docker container run -it top
top - 14:54:27 up 2:16, 0 users, load average: 0.10, 0.05, 0.03
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4015800 total, 2133292 free, 290696 used, 1591812 buff/cache
KiB Swap: 4015100 total, 4015100 free, 0 used. 3466352 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 36608 3164 2732 R 0.0 0.1 0:00.11 top
cndtjs@ubuntu-server:~/ex02$ sudo docker container run -it top -d 1
top - 14:55:39 up 2:17, 0 users, load average: 0.09, 0.05, 0.02
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.5 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4015800 total, 2131548 free, 292048 used, 1592204 buff/cache
KiB Swap: 4015100 total, 4015100 free, 0 used. 3464420 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 36608 3172 2744 R 0.0 0.1 0:00.11 top
이렇게 CMD
명령어로 작성한 주기를 1초로 변경하면 마지막에 입력된 1초가 적용이 되어 1초마다 모니터링이 갱신되는 것을 확인할 수 있다.
ONBUILD
ONBUILD
명령어는 빌드가 완료된 후에 실행되는 명령어 이다. base이미지의 Dockerfile을 하나 만들고 이 base이미지를 활용할 Dockerfile을 생성하여 실습을 한다.
cndtjs@ubuntu-server:~$ mkdir ex03
cndtjs@ubuntu-server:~$ cd ex03
cndtjs@ubuntu-server:~/ex03$ nano Dockerfile.base
- Dockerfile.base
FROM ubuntu:18.04
ONBUILD RUN echo "Hello, Docker!"
Dockerfile
의 파일이 아닌 .base
의 파일이기 때문에 -f
옵션을 붙이고 base파일 명을 적어 build를 한다.
cndtjs@ubuntu-server:~/ex03$ sudo docker build -t base -f Dockerfile.base .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:18.04
---> 39a8cfeef173
Step 2/2 : ONBUILD RUN echo "Hello, Docker!"
---> Running in 77b9a9670a1e
Removing intermediate container 77b9a9670a1e
---> f1a7e4c12da4
Successfully built f1a7e4c12da4
Successfully tagged base:latest
다음은 위의 base 이미지를 활용하여 컨테이너를 실행할 Dockerfile
을 생성해준다. FROM에 활용할 이미지를 명시해준다.
cndtjs@ubuntu-server:~/ex03$ nano Dockerfile
- Dockerfile
FROM base
cndtjs@ubuntu-server:~/ex03$ sudo docker build -t hello .
Sending build context to Docker daemon 3.072kB
Step 1/1 : FROM base
# Executing 1 build trigger
---> Running in 279e7784c2fb
Hello, Docker!
Removing intermediate container 279e7784c2fb
---> 4ea285b29b98
Successfully built 4ea285b29b98
Successfully tagged hello:latest
결과처럼 base 이미지에서 실행한 Hello, Docker!
가 출력이 된 것을 볼 수 있다.
ENV
ENV
명령어는 환경변수를 설정하는 명령어로 path를 지정해서 사용한다. 부모DIR과 자식DIR을 환경변수에 지정해준다. 그리고 이미지가 빌드되면서 작업 DIR를 옮겨주며, 없으면 새로 생성해주는 WORKDIR
명령어를 지정해준다. 마지막으로 pwd
를 실행하도록 한다.
- Dockerfile
FROM ubuntu:18.04
ENV DIRPARENT /parent
ENV DIRCHILD child
WORKDIR $DIRPARENT/$DIRCHILD
RUN ["pwd"]
cndtjs@ubuntu-server:~/ex04$ sudo docker build -t dir .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM ubuntu:18.04
---> 39a8cfeef173
Step 2/5 : ENV DIRPARENT /parent
---> Using cache
---> 161fe4d18056
Step 3/5 : ENV DIRCHILD child
---> Using cache
---> d87da41e62ab
Step 4/5 : WORKDIR $DIRPARENT/$DIRCHILD
---> Running in 6414aff06975
Removing intermediate container 6414aff06975
---> 296c3fff8bf5
Step 5/5 : RUN ["pwd"]
---> Running in ced7d0327f50
/parent/child
Removing intermediate container ced7d0327f50
---> 6dde48412962
Successfully built 6dde48412962
Successfully tagged dir:latest
Step5/5 에 pwd가 실행되면서 /parent/child
가 출력된 것을 확인했다.
LABEL / USER
LABEL
명령어는 이미지 버전 정보, 작성자 등 레이블 정보 등록해줄 때 사용한다. ARG
명령어는 String과 같은 변수 타입이라고 생각하면 될 것 같다. adduser
를 이용해 새로운 계정을 생성하고 생성 시의 설정해야하는 것들을 나오지 않게 한다. cndtjs이라는 계정을 만들고 유저를 할당하는 USER
명령어로 cndtjs 계정으로 변경해준 후 확인해본다.
- Dockerfile
FROM ubuntu:18.04
LABEL title="My Ubuntu"
ARG MESSAGE="complete"
RUN adduser --disabled-password --gecos "" cndtjs
RUN whoami
USER cndtjs
RUN whoami
RUN echo $MESSAGE
cndtjs@ubuntu-server:~/ex05$ sudo docker build -t myubuntu .
Sending build context to Docker daemon 2.048kB
Step 1/8 : FROM ubuntu:18.04
---> 39a8cfeef173
Step 2/8 : LABEL title="My Ubuntu"
---> Running in 7bdf188e625e
Removing intermediate container 7bdf188e625e
---> 4359c2674a2b
Step 3/8 : ARG MESSAGE="complete"
---> Running in defbc7f126e3
Removing intermediate container defbc7f126e3
---> 4e3e8a31bb4f
Step 4/8 : RUN adduser --disabled-password --gecos "" cndtjs
---> Running in 1c5bd8077f56
Adding user `cndtjs' ...
Adding new group `cndtjs' (1000) ...
Adding new user `cndtjs' (1000) with group `cndtjs' ...
Creating home directory `/home/cndtjs' ...
Copying files from `/etc/skel' ...
Removing intermediate container 1c5bd8077f56
---> 22c938e11cbd
Step 5/8 : RUN whoami
---> Running in 789de8980e4c
root
Removing intermediate container 789de8980e4c
---> de23f8c910ca
Step 6/8 : USER cndtjs
---> Running in ecf8355c4508
Removing intermediate container ecf8355c4508
---> eb40bad4a170
Step 7/8 : RUN whoami
---> Running in 6a53e7f59ed7
cndtjs
Removing intermediate container 6a53e7f59ed7
---> 0935d5c0b021
Step 8/8 : RUN echo $MESSAGE
---> Running in 418de8d68c8c
complete
Removing intermediate container 418de8d68c8c
---> 91178e23f462
Successfully built 91178e23f462
Successfully tagged myubuntu:latest
Step 5/8에 root 계정에서 Step 7/8에 cndtjs 계정으로 변경이 된 것을 볼 수 있고 complete까지 정상적으로 출력이 되었다.
ADD / COPY
도커 엔진이 설치된 HOST환경에서 파일을 복제하여 이미지를 만들어주는 명령어들이다. 기능상 두개의 명령어는 큰 차이가 없고 ADD
명령어는 URL을 통한 파일 복사와 로컬에서 압축파일 복사 시, 해제하여 복사할 수 있는 기능이 차이점이다.
먼저 파일을 하나 생성해준다 touch
명령어 사용
cndtjs@ubuntu-server:~/ex06$ touch index.html
- Dockerfile
FROM ubuntu:18.04
WORKDIR /html
ADD index.html .
RUN ["pwd"]
RUN ls -al
WORKDIR /inside-html
COPY index.html
RUN ["pwd"]
RUN ls -al
cndtjs@ubuntu-server:~/ex06$ sudo docker build -t addcopy .
Sending build context to Docker daemon 2.56kB
Step 1/9 : FROM ubuntu:18.04
---> 39a8cfeef173
Step 2/9 : WORKDIR /html
---> Running in a55e82b6fb4f
Removing intermediate container a55e82b6fb4f
---> 6ee5564a7ca6
Step 3/9 : ADD index.html .
---> 1d81149fb476
Step 4/9 : RUN ["pwd"]
---> Running in 6ba68117394e
/html
Removing intermediate container 6ba68117394e
---> 99aa222ce5e1
Step 5/9 : RUN ls -al
---> Running in d73975cf6f06
total 8
drwxr-xr-x 1 root root 4096 Aug 23 16:22 .
drwxr-xr-x 1 root root 4096 Aug 23 16:22 ..
-rw-rw-r-- 1 root root 0 Aug 23 16:20 index.html
Removing intermediate container d73975cf6f06
---> fab359c6e713
Step 6/9 : WORKDIR /inside-html
---> Running in 29a0d446d1a7
Removing intermediate container 29a0d446d1a7
---> b4f1f80b038a
Step 7/9 : COPY index.html .
---> a3da3d68e2c1
Step 8/9 : RUN ["pwd"]
---> Running in 32d820a7bf6e
/inside-html
Removing intermediate container 32d820a7bf6e
---> fe5e0e8ef15d
Step 9/9 : RUN ls -al
---> Running in 7944552522a7
total 8
drwxr-xr-x 1 root root 4096 Aug 23 16:22 .
drwxr-xr-x 1 root root 4096 Aug 23 16:22 ..
-rw-rw-r-- 1 root root 0 Aug 23 16:20 index.html
Removing intermediate container 7944552522a7
---> e67511806aa9
Successfully built e67511806aa9
Successfully tagged addcopy:latest