티스토리 뷰
● Dockerfile : 필요없는 것을 빼고 작게 만들 수 있고, 최적화가 되어있다
[ 주로 Docker image 는 Dockerfile 로 만들어진다 ]
https://docs.docker.com/reference/dockerfile/
# Dockerfile 명령어 참조
◆ testtfile 만들어보기
FROM [ Base image ]
# FROM 으로 시작한다
RUN [ 리눅스 명령어 ]
# 커맨드를 쓸 때 쓰는 명령어 RUN
# Host 가 아닌 docker image 에서 실행되는 명령어
# CMD 는 컨테이너 실행할 때 사용하는 명령어 ( 이미지 만들 때 쓰는 명령어가 아니다 )
# CMD [ 명령어 ]
# 그러나 1번밖에 사용 못한다 ( 여러개 사용하면 마지막 것만 실행한다 )
# ENTRYPOINT [ 명령어 ]
# ENTRYPOINT 의 셀 형식은 셀이 처리해준다 ( 셀로 처리 한다는 의미 )
# ENTRYPOINT 도 한번만 실행 ( 여러개 일 경우 마지막 것만 실행된다 )
# ENTRYPOINT exec 형식은 단독으로 처리한다
# ENTRYPOINT /bin/sleep 180s >> /bin/sh -c 로 처리
# 셀 형식은 대괄호 없다
# EINTRYPOINT ["/bin/sleep","180s"]
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN slepp 3
▷ file 경로 + 이름 따로 / 디렉터리 경로 따로 적어서 이미지로 만든다
[vagrant@docker1 ~]$ docker build -t testimg:1.1 -f work/testfile /home/vagrant/work
[vagrant@docker1 work]$ docker build --tag testimg:1.0 -f testfile ~/work
[vagrant@docker1 work]$ docker build -t testimg:1.2 -f testfile .
[vagrant@docker1 work]$ docker image ls testimg
REPOSITORY TAG IMAGE ID CREATED SIZE
testimg 1.0 ea33c3236644 About a minute ago 204MB
▩ 실행해보는데 바로 죽었다
[vagrant@docker1 work]$ docker run -d testimg:1.0
ad6aa929f444a6b841bac2d80e35a817ec26ac5c49289e6c9938598fc1febfef
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
▷ 실행하고 그냥 바로 끝났다
[vagrant@docker1 work]$ docker logs affectionate_euler
▶CMD 를 사용하여 계속 살려둘 수 있다
[vagrant@docker1 work]$ cat testfile
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
CMD /bin/sleep 3600s
▷ 그대로 명령어를 입력하면, 이미지 덮어쓰기도 가능하다
[vagrant@docker1 work]$ docker build --tag testimg:1.0 -f testfile ~/work/
○ container 가 살아있다
[vagrant@docker1 work]$ docker run -d testimg:1.0
720f23386270151e93bc07d48383d7e3fc886afc3bd69f14569fb6ec5fe58797
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
720f23386270 testimg:1.0 "/bin/sh -c '/bin/sl…" 3 seconds ago Up 2 seconds beautiful_diffie
○ - i t 를 사용하여 살려둔다
[vagrant@docker1 work]$ cat testfile
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
[vagrant@docker1 work]$ docker run -d --name centos2 -it testimg:1.0
d32c406ded577360359c06e7c0c28076c445994f3c95eaccc03c82d4ab666364
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d32c406ded57 testimg:1.0 "/bin/bash" 2 seconds ago Up 1 second centos2
720f23386270 a4a8e86ddac2 "/bin/sh -c '/bin/sl…" 2 minutes ago Up 2 minutes beautiful_diffie
○ ENTRYPOINT 셀형식으로 사용
[vagrant@docker1 work]$ cat testfile
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
ENTRYPOINT /bin/sleep 10s
[vagrant@docker1 work]$ docker build --tag testimg:1.0 -f testfile /home/vagrant/work
▷ /bin/sh 로 실행되어 있다
○ ENTRYPOINT exec 형식
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
ENTRYPOINT /bin/sleep 180s
ENTRYPOINT ["/bin/sleep","180s"]
○ command 가 셀로 처리가 안되고 단독으로 처리된다
◇ / bin / sleep 은 실행되나 /bin/sh 로는 실행이 안된다
[vagrant@docker1 work]$ /bin/sleep 180s
^C
[vagrant@docker1 work]$ /bin/sh /bin/sleep 180s
/bin/sleep: /bin/sleep: cannot execute binary file
○ 바이너리 파일은 / bin / sh 로 처리 못하나 - c 옵션으로 처리할 수 있다
>> 리눅스의 바이너리 파일은 / bin , / sbin , / lib , / opt / bin
# c 옵션을 붙이면 whoami 로 처리해준다는 의미이다
[vagrant@docker1 work]$ /bin/sh -c whoami
vagrant
[vagrant@docker1 work]$ /bin/sh whoami
/usr/bin/whoami: /usr/bin/whoami: cannot execute binary file
[ man bash ]
-c string If the -c option is present,
then commands are read from string.
If there arearguments after the string,
they are assigned to the positional parameters,
starting with $0.
리눅스에서는 바이너리 파일이 /bin, /sbin, /lib, /opt/bin
>> 이렇게는 실행이 된다
[vagrant@docker1 work]$ /bin/sh -c 'sleep "180s"'
▷ 마지막줄 셀 형식 추가
ENTRYPOINT ps -e | grep sh
>> foreground 로 제대로 잘 작동함을 확인
[vagrant@docker1 work]$ docker run --name centos5 testimg:1.0
1 ? 00:00:00 sh
▷ exec 형식으로 바꿔본다
# 모두 따옴표로 묶어야 된다
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
#CMD /bin/sleep 3600s
#ENTRYPOINT /bin/sleep 180s
#ENTRYPOINT ["/bin/sleep","180s"]
ENTRYPOINT ["ps","-e","|","grep","sh"]
>> | 나 환경변수는 셀 형식으로 처리해야 한다
>>> 커맨드를 " " 로 묶어 줘야 한다
# ex> 메타문자 리디렉션 등은 exec 형식으로 사용할 수 없다
>>> 상황에 따라 셀 형식이나 exec 형식으로 사용해야 한다
[vagrant@docker1 work]$ docker run --name centos6 testimg:1.0
error: garbage option
Usage:
ps [options]
Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
For more details see ps(1).
▶ ENTRYPOINT 다음에 CMD 는 사용할 수 없다 [ exec 형식 ]
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal"]
CMD ["whoami"]
[vagrant@docker1 work]$ docker run --name centos7 testimg:1.0
cal: illegal year value: use 1-9999: 'whoami'
▷ cal whoami 라고 쓴 결과가 나온다
[vagrant@docker1 work]$ cal whoami
cal: illegal year value: use 1-9999: 'whoami'
▷ ENTRYPOINT 다음 오는 CMD 는 ENTRYPOINT 명령어의 인수가 CMD 에 들어가야 한다
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal"]
CMD ["03","2024"]
[vagrant@docker1 work]$ docker run --name centos8 testimg:1.0
March 2024
Su Mo Tu We Th Fr Sa
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
▩ 하지만, ENTRYPOINT 에 인수까지 다 넣은거랑 다른점
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal","03","2024"]
▷ 값은 그대로이긴하다
[vagrant@docker1 work]$ docker run --name centos9 testimg:1.0
March 2024
Su Mo Tu We Th Fr Sa
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
>> 인수 전달이 안된다
>>> cal 03 2024 05 2025 로 입력된 것이다 ( 인수가 4개가 된다 )
[vagrant@docker1 work]$ docker run testimg:1.0 05 2024
Usage:
cal [options] [[[day] month] year]
◆ 컨테이너를 올리면서 CMD 는 값을 덮어쓸 수 있다
>> ENTRYPOINT 와 CMD 가 같이 있으면, ENTRYPOINT 의 기본값이 CMD 가 된다
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT ["cal"]
CMD ["03","2024"]
[vagrant@docker1 work]$ docker run testimg:1.0 05 2025
May 2025
Su Mo Tu We Th Fr Sa
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
[vagrant@docker1 work]$ docker run testimg:1.0 05 2024
May 2024
Su Mo Tu We Th Fr Sa
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
▷ 셀 형식으로 ENTRYPOINT 와 CMD 는 인수 넣어도 무시된다
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT cal
CMD 03 2024
[vagrant@docker1 work]$ docker run testimg:1.0 05 2024
March 2024
Su Mo Tu We Th Fr Sa
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
[vagrant@docker1 work]$ docker run testimg:1.0 05 2026
March 2024
Su Mo Tu We Th Fr Sa
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
[vagrant@docker1 work]$ docker run testimg:1.0
March 2024
Su Mo Tu We Th Fr Sa
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
▷ CMD 는 exec 형식으로 쓴다
FROM centos:7
RUN cal
RUN touch /tmp/test.txt
RUN sleep 3
ENTRYPOINT cal
CMD ["03","2024"]
### ??? 무시된다 이거 그대로뜸
>>> 강사님이 하시고 인수 바꿔서 들어간다고 했는데?
[vagrant@docker1 work]$ docker run testimg:1.0
March 2024
Su Mo Tu We Th Fr Sa
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
[vagrant@docker1 work]$ docker run testimg:1.0 05 2024
March 2024
Su Mo Tu We Th Fr Sa
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
[vagrant@docker1 work]$ docker run testimg:1.0 06 2024
March 2024
Su Mo Tu We Th Fr Sa
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
'Docker 와 Container' 카테고리의 다른 글
Dockerfile - EXPOSE / WORKDIR (0) | 2024.03.05 |
---|---|
Dockerfile - ENV / LABEL (0) | 2024.03.05 |
Docker container >> image / tar 만들기 (0) | 2024.03.05 |
Docker Network (0) | 2024.03.04 |
Docker 의 기본 (0) | 2024.03.04 |