목차
- Dockerfile 명령어, FROM, RUN, EXPOSE, CMD
- ENTRYPOINT
- ONBUILD, HEALTHCHECK
- ENV, WORKDIR, USER, LABEL, EXPOSE, ARG, SHELL
- ADD, COPY, VOLUME
FROM, RUN, EXPOSE, CMD, ENTRYPOINT, ONBUILD, HEALTHCHECK
RUN ..
이미지를 빌드할 때 실행되는 명령
컨테이너가 실행되기 전 단계!
CMD ..
이미지를 통해 생성된 컨테이너 내부에서 실행되는 명령
하나의 Dockerfile 에는 단 한 줄의 CMD 명령!
만약에 여러 개라면 마지막 명령만 유효!
1. Exec 형식
2. Shell 형식
ENTRYPOINT ..
이미지를 통해 생성된 컨테이너 내부에서 실행되는 명령
???
CMD와 ENTRYPOINT의 차이점
$ sudo docker container run ...
컨테이너를 실행할 시점에서 동작하는 방식의 차이
CMD는
Dockerfile에서 정의했더라도 run 하는 시점에
기존의 설정을 덮어쓰기 할 수 있음
다만, ENTRYPOINT는
run과 상관없이 무조건 명령을 수행함
두 명령은 상황에 맞게 혼용할 수 있음
HEALTHCHECK ..
컨테이너의 작동상태 체크
실습
새롭게 Dockerfile을 만들어줍니다.
베이스 이미지를 가져옵니다
FROM ubuntu:18.04
이미지가 빌드될 때 실행되는 명령어 RUN입니다.
RUN 명령어는 이미지의 형태로 빌드할 때 실행되는 명령어입니다.
컨테이너와 관련 없습니다.
apt -> package manager입니다.
미들웨어를 잘 사용하기 때문에
apt-get를 업데이트해줍니다.
-y는 자동적으로 yes를 넘겨주기 위해서 y로 작성했습니다.
RUN apt-get update -y
RUN apt-get install apache2 -y
http 80 포트로 통신하기 위해서 아래 명령어를 작성해줍니다.
EXPOSE 80
컨테이너가 실행이 되면서 자동으로 수행하는 명령어입니다.
CMD apachetl -D FOREGROUND
웹 서버 자체가 구동한 컨테이너에 올라가게 됩니다.
이제 빌드를 해줍니다.
sudo docker build -t [이미지명]:[버전명] <디렉터리>
sudo docker build -t apache2:1.0 .
위와 같이 E: Unable to locate package apache2 오류가 발생하면 아래 명령어를 입력해줍니다.
RUN apt-get update -y 명령어를 새롭게 수행하지 않고
캐시된 이미지를 사용하기 때문에 아래의 명령어를 작성해주는 것입니다.
sudo docker image build --no-cache -t apache2:1.1 .
이제 컨테이너를 구동해봅시다.
sudo docker container run -d -p 80:80 --name webserver apache2:1.1
sudo docker container ls -al
ifconfig로 확인 후 해당 ip주소로 접근해보면
정상적으로 구동되는 것을 확인할 수 있습니다!
nano Dockerfile로 다시 확인해보면,
아래처럼
CMD 형태로 쓰는 방식을 shell 형식이라고 합니다.
Exact 형식으로 써야 하는 경우, 다른 shell에 할당해야 하는 경우, 다른 인자를 넘겨줘야 할 때
각각의 영역을 나눠서 작성해줍니다.
도커 파일에서 #을 붙이게 되면 주석 처리됩니다.
nano Dockerfile
sudo docker build -t apache2:1.1 .
build를 해주면 아래와 같이 caching 되어 있는 데이터를 가지고 옵니다.
이미 사용을 했던 명령이기 때문에, caching 되어 있어 곧바로 처리합니다.
sudo docker container stop webserver
기존의 포트를 사용했던 컨테이너를 종료시킵니다.
새롭게 실행시킵니다.
sudo docker run -d -p 80:80 --name webserver2 apache2:1.1
80 포트를 이미 사용 중이라고 하네요,
80 포트를 사용하는 것을 찾아서 kill 해줍니다.
netstat -tulpn | grep LISTEN
sudo netstat -p tcp -ano
확인해 보니
4401/apache2가 80 포트를 사용하고 있었네요! 지워줍시다.
sudo kill -9 apache2
그래도 안되네요.
아래의 방법을 써봅시다
https://rfriend.tistory.com/396
80 포트를 사용하는 것을 확인하고 지워줍니다
sudo lsof -i :80
sudo kill -15 <PID>
ENTRYPOINT
이미지를 통해 생성된 컨테이너 내부에서 실행되는 명령
ENTRYPOINT ["<우분투 환경에서 실행할 명령어>"]
ENTRYPOINT ["top"]
"top" 명령어는 시스템 모니터링을 해주는 기능입니다.
시스템 사용량 메모리 등을 확인할 수 있습니다.
CMD <옵션>, <주기>
CMD ["-d", "5"]
build 해줍니다
sudo docker build -t top .
빌드 후 run 합니다.
sudo docker container run -it top
5초마다 숫자가 봐 뀌는 것을 확인할 수 있습니다.
sudo docker container run -it top -d 1
Dockerfile에서 적용한 것 위에 덮여 써져 run이 됩니다.
Dockerfile에서는 주기가 5였지만 위처럼 다시 작성해서 주기를 1로 바꿔줬습니다.
ONBUILD
이미지 빌드가 완료된 후에 실행되는 명령
내가 빌드한 이미지를 베이스 삼아 새로운 이미지를 만들 때!
base Dockerfile을 만들고
base Dockerfile을 Dockerfile에서 FROM으로 불러와 봅니다
nano Dockerfile.base
FROM ubuntu:18.04
ONBUILD RUN echo "Hello, Docker!"
sudo docker build -t base -f Dockerfile.base .
Dockerfile.base를 가져와서 base로 build 합니다.
새롭게 Dockerfile을 만들어 줍니다.
정말 신기하게도 새롭게 빌드를 hello라는 곳에 해주니 새롭게 됩니다.
ENV, WORKDIR, USER, LABEL, EXPOSE, ARG, SHELL
ENV ..
환경변수 설정
WORKDIR ..
작업 디렉터리 할당
USER ..
유저 할당
LABEL ..
이미지 버전 정보, 작성자 등의 레이블 지정
EXPOSE ..
포트 할당
ARG ..
Dockerfile 내부의 변수 할당
SHELL ..
기본 쉘 할당
베이스 이미지를 가져옵니다.
FROM ubuntu:18.04
환경변수를 설정해줍니다.
ENV DIRPARENT /parent
ENV DIRCHILD child
작업 경로를 아래처럼 $을 사용하여
위의 환경변수를 가져다 사용할 수 있습니다.
WORKDIR $DIRPARENT/$DIRCHILD
현재 위치를 보여주는 명령어 "pwd"를 빌드할 때 보여주게 합니다.
RUN ["pwd"]
빌드가 성공적인 모습!
베이스 이미지를 가져옵니다.
FROM ubuntu:18.04
title이라는 메타 정보를 입력합니다.
LABEL title="My Ubuntu"
ARG는 dockerfile에서 변수 할당에 필요한 것입니다.
(int, string 같은 것)
ARG MESSAGE="complete"
user를 추가할 때 여러 가지 옵션을 필요로 하는데 제거해줍니다.
RUN adduser --disabled-password --gecos "" heansum
사용자를 보여주는 명령어 whoami를 사용합니다.
RUN whoami
유저를 스위칭합니다.
USER heansum
정상적으로 스위칭되었는지 확인합니다.
RUN whoami
변수를 불러와서 정상적으로 할당되었는지 확인합니다.
RUN echo $MESSAGE
빌드되면서, root user에서 heansum user로 변화되어있는 것을 확인할 수 있습니다.
그리고 할당된 변수가 잘 출력되는 것을 확인할 수 있습니다.
ADD, COPY, VOLUME
ADD ..
파일 및 디렉터리 추가
COPY ..
파일 복사
VOLUME ..
볼륨 할당
베이스 이미지를 가져옵니다.
FROM ubuntu:18.04
리눅스에서 dir를 바꿔주는 명령어이며, default경로에서 /html로 옮깁니다.
(경로가 없으면 생성해줍니다)
WORKDIR /html
옮겨질 위치(현재 위치)에 추가를 해줄 html입니다.
ADD index.html .
경로가 옮겨졌는지 확인해줍니다.
RUN ["pwd"]
정상적으로 파일이 있는지 확인해줍니다.
RUN ls -al
COPY도 동일하게 실행되어있는지 확인하기 위해 폴더를 하나 더 만들어줍니다.
WORKDIR /inside-html
현재 위치(WORKDIR로 옮긴 위치)에 복사를 해줍니다.
COPY index.html .
위와 동일하게 경로위치를 확인합니다.
RUN ["pwd"]
위와 동일하게 파일이 있는지 확인합니다.
RUN ls -al
sudo docker build -t addcopy .
도커 파일을 이미지로 빌드합니다
'DevOps > Docker' 카테고리의 다른 글
[Docker]8. GCP Artifact Registry [도커 기초 | Week 4] (0) | 2021.10.05 |
---|---|
[Docker]7. 도커 레지스트리 [도커 기초 | Week 4] (0) | 2021.09.03 |
[Docker]5. 도커 파일 [도커 기초 | Week 3] (0) | 2021.09.01 |
[Docker]4. 도커 이미지[도커 기초 | Week 3] (0) | 2021.08.26 |
[Docker]3. 도커 기본 명령어[도커 엔진 | 도커 기초 | Week 2] (0) | 2021.08.21 |