[Docker]6. 도커 파일 명령어 [도커 기초 | Week 3]
DevOps/Docker

[Docker]6. 도커 파일 명령어 [도커 기초 | Week 3]

목차

- 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

 

[Docker] Error response from daemon: driver failed programming external connectivity on endpoint, port is already allocated 대

도커 컨터이너를 잘 사용하다가 컴퓨터를 껐다가 다시 켜고서 docker start 를 다시 하면 포트가 이미 할당되어 있다(port is already allocated) 면서 에러가 발생하는 경우가 있습니다. 저의 경우, 도커로

rfriend.tistory.com

 

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 DockerfileDockerfile에서 FROM으로 불러와 봅니다

 

 

 

nano Dockerfile.base

 

 

FROM ubuntu:18.04

 

ONBUILD RUN echo "Hello, Docker!"

 

 

sudo docker build -t base -f Dockerfile.base .

Dockerfile.base를 가져와서 basebuild 합니다. 

 

 

 

새롭게 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 .

도커 파일을 이미지로 빌드합니다