k8s/docker

docker 커스텀 이미지 만들기

부엉이사장 2023. 10. 28. 15:12

# inrtoduction

지금까지 컨테이너를 띄울때 docker hub에 있는 이미지들을 가져다가 썼었다.

docker run -d nginx:latest

 

이번 포스팅에서는 Dockerfile을 이용하여 이런 이미지를 원하는대로 커스텀하여 새로운 이미지를 만들 수 있다.

 

 

 

# Dockerfile

아무 디렉토리나 가서 Dockerfile을 만들어주자.

mkdir /muzzi
cd /muzzi

여기서 이제 Dockerfile을 만들어줄거다

vi Dockerfile

이 파일의 내용은 이렇게 작성해줬다.

From nginx:latest
RUN mkdir /muzzi_con
WORKDIR /muzzi_con
RUN touch muzzi_test.txt

첫번째 FROM은 이 커스텀이미지의 기본 이미지이다.

나는 nginx의 lastest 태그로 만들어줬다.

 

두번째로는 RUN인데 이건 커맨드 명령어를 실행하게 해주는것.

위에선 최상위 디렉토리에 muzzi_con이라는 디렉토리를 만들어줬다.

 

세번쨰 WORKDIR은 다음으로 쓸 커맨드를 쓸 디렉토리 위치를 적어준다. 

디렉토리 이동한다고 보면됨. 커맨드에선 cd /muzzi_con이라고 보면된다.

 

마지막으로 RUN을 한번 더 썼고

muzzi_test.txt라는 파일을 만들어줬다.

커맨드가 실행될 곳은 /muzzi_con이라는 디렉토리니까 여기에 muzzi_test.txt파일이 만들어질거다.

 

 

 

# 그럼 이미지는 어떻게 만들까? => docker build 

docker build -t 이미지이름:태그 .

!!! 이 명령어를 실행할떄는 Dockerfile 파일이 있는 위치에서 실행시켜야 한다.

 

-t 옵션은 이미지 이름과 태그를 만들려고 쓴다. 이거 안쓰고 걍 docker build . 이렇게만 쓰면 만들어지긴하는데 못찾는다.

docker image ls 쳐도 안보인다. 도커 이미지들이 있는 곳도 찾아봤는데 해시값들이라서 뭔지모르겠음..

 

그리고 당연히 이미지이름과 태그를 써준다

 

마지막 . 은 현재 디렉토리에있는 Dockerfile을 가지고 만들어준다는거다.

그래서 첨 주의사항에 파일이 있는 위치에서 사용해야 한다고 한거임.

이것도 -f 옵션으로 바꿔줄수는 있는데 그냥 귀찮.. 중요한것도아니고..

 

 

암튼 이 명령어를 실행하면 

이런식으로 이미지가 빌드되고 다음명령으로 이미지들을 확인해보면,

docker image ls

이미지가 잘 만들어진걸 볼 수 있다.

 

 

 

# 이제 이 이미지로 컨테이너를 띄워서 Dockerfile에 있는 명령어들이 실제로 먹혔는지 볼까?

docker run -it muzzi:1.0 /bin/bash

아래는 Dockerfile 내용

From nginx:latest
RUN mkdir /muzzi_con
WORKDIR /muzzi_con
RUN touch muzzi_test.txt

 

원하는대로 모두 잘 작동된걸 볼 수 있다.

 

 

 

 

 # 커스텀 이미지의 구조 살짝..

위에서 만든 muzzi:1.0 이미지는 기본바탕이 nginx이미지이다.

nginx이미지와, muzzi 이미지를 살짝 살펴보면

docker inspect nginx
docker inspect muzzi:1.0

nginx꺼
muzzi꺼

자세히보면 nginx의 inspect 출력물 layer랑 muzzi 출력물 layer랑 비슷하다. 그리고 muzzi:1.0이미지가 더 붙었는데,

muzzi는 nginx를 바탕으로 추가적으로 더 Dockerfile을 작성해서 적어서 일단 두 이미지는 nginx:latest이미지를

기본으로 만든거고 muzzi:1.0이미지에 레이어가 추가적으로 더 붙은거다.

도커의 이미지들은 이렇게 레이어구조로 이루어져있다.

 

 

 

# 추가적인 Dockerfile 요소들

RUN

COPY

CMD

ENTRYPOINT

EXPOSE

ENV

 

 

 

# docker hub

 

# 실습 httpd in centos

 

# systemctl 명령어 되게만들기