Ops, Infra, etc/🐋 Docker (+Swarm)

Dockerfile을 이용한 Docker 이미지 생성하기

DarrenKwonDev 2020. 9. 3. 14:36

 

🐳 docker build과 Dockerfile을 이용한 커스텀 이미지 생성

 

커스텀 도커 이미지를 만들 때 유의할 점은, 빌드하는 것처럼 성공 실패가 존재한다는 것입니다. 도커 이미지를 만드는 것도 쉽지 않습니다. 또, 빌드에 성공했다고 하더라도 리팩토링을 통해 더 최적화될 여지도 항상 있습니다.

 

dockerfile의 효율적인 작성에 대해서는 darrengwon.tistory.com/804여기에서 주의할 점 3을 참고해보시면 알 수 있습니다.

 

 

dockerfile 만들기

 

 

Dockerfile은 도커 이미지를 만들기 위한 파일입니다.

우선 작업하고자 하는 디렉토리에 Dockerfile이란 이름의 파일을 하나 만들고 처리할 명령어들을 입력합니다.

 

base image를 명시한 후 (FROM)

컨테이너 실행 전 수행할 쉘 명령어를 입력한 후 (RUN)

컨테이너 시작시 실행된 명령어도 입력하면 됩니다. (CMD) docker exec로 보시면 됩니다.

 

이것 외에도 COPY, ADD, ENV 등 다양한 것이 존재합니다.

우리가 시스템을 배포할 때 거치는 내용들을 되짚어보면서 작성하시면 뚝딱입니다.

 

Dockerfile 예시

# 베이스 이미지 명시
FROM alpine

# 컨테이너 실행 전 수행할 쉘 명령어
# RUN apt-get update

# 컨테이너가 시작되었을 때 실행한 쉘 명령어
# DockerFile 내 1회만 사용할 수 있음
CMD ["echo", "hello"]

 

 

docker build하기

 

docs.docker.com/engine/reference/commandline/build/

docker build [OPTIONS] PATH | URL | -

 

이제 dockerfile이 존재하는 경로로 이동해서 build해주면 됩니다.

docker build ./

 

위와 같이 간단한 방법으로 build할 수도 있지만 보통 다음과 같이 좀 더 자세하게 적는 편입니다.

docker build -t {이미지명}:{태그} {빌드 컨텍스트}

 

이렇게 커스텀 이미지를 만들 때의 이름을 주는 데에는 일종의 규칙이 있습니다. 강제되는 규칙은 아니고 작업을 편리하게 하기위한 것입니다. 태그에는 뭘 넣어도 좋지만 편의성을 위해 버전을 명시하는 것이 좋습니다.

docker build -t {이름공간}/{이미지이름}:{태그} {빌드 컨텍스트(DockerFile이 있는 경로)}

docker build -t cinpes/ubuntu:git .

 

 

빌드가 성공적으로 이루어진 후 docker images를 확인해봄녀 우리가 만드록자 하는 이미지가 있는 것을 확인할 수 있습니다.

 

 

 

🚨 Window 환경에서 Dockerfile을 실행했더니 경고가 뜬다?

 

You are building a Docker image from Windows against a  non Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

 

이 문제는 Dockerfile에 CMD가 있기 때문입니다. 빌드 자체는 되었으므로 무시합시다.

That warning was added, because the Windows filesystem does not have an option to mark a file as 'executable'. Building a linux image from a Windows machine would therefore break the image if a file has to be marked executable.

For that reason, files are marked executable by default when building from a windows client; the warning is there so that you are notified of that, and (if needed), modify the Dockerfile to change/remove the executable bit afterwards.

 

 


 

 

🐳 명령창 내에서 커스텀 이미지 생성하기

 

이 방법보다는 Dockerfile을 이용한 방법이 더 많이 사용되고 있습니다. 그래도 알아는 두자는 의미에서 남깁니다.

docker 측에서 제공하는 기본 이미지는 base Image로, 순수하게 그것 외의 다른 환경은 아무 것도 설치되어 있지 않습니다. 

docker run -it --name git ubuntu bash

 

base image 우분투 이미지를 기반으로한 컨테이너에 git을 추가로 설치해보자

apt-get update
apt-get install -y git
git --version (설치 확인)

 

우분투에 git을 설치한 후 docker commit을 해보겠습니다.

 

 


🚨 git commit, git pull, push을 하여 github에 코드를 푸쉬/풀 하듯 docker 이미지 또한 docker hub에서 docker commit, docker push, docker pull을 합니다. 코드와 마찬가지로 docker 이미지도 다른 사람의 것을 가져다 쓸 수 있습니다.

자세한 내용은 docker hub를 살펴봅시다.

 


 

여튼, commit을 합니다.

docker commit git ubuntu:git

 

그리고 docker images를 통해 확인해보니 따로 설치하진 않았어도 TAG에 git이 붙은 ubuntu 이미지가 하나 생겼습니다.

 

그리고 이 이미지를 기반으로 docker를 run할 수도 있습니다. 이런 방법으로 도커를 이용해서 작업, 개발 환경을 만드는 것입니다. 참 편리하죠~

docker run -it --name git2 ubuntu:git bash

$ git --version // 이미지에 git이 이미 설치되어 있으므로 git이 작동함!