안녕하세요~
오늘은 Container 이미지를 만들 때 사용하는 Docker 에 대해서 알아보도록 하겠습니다~!
k8s 환경으로 이전하기 위해서는 Docker Image File이 필요한 경우가 상당히 많은데요,
오늘은 간단하게 Docker Image를 만들어보는 시간을 가져보도록 할게요~!
DockerFile?
그래서 DockerFile이 뭔데??
DockerFile은 우리가 Docker Image를 만들기 위한 절차라고 생각하면 쉬워요~!
그러면 Docker Image는?
쉽게 말하면,, Docker Container를 띄우기 위한 기반이라고 생각하면 좋습니다~!
조금 더 자세하게 이야기해보면
이미지는 Container 환경에서 구동하기 위한 라이브러리, 소스를 설치해서 파일로 만드는 것을 의미해요!
그리고, Image는 Layer들의 집합체라고도 표현하는데요..
Image를 받아오거나 삭제할 때, 위와 같은 화면을 볼 수 있는데요,
각각의 Layer는 독립적으로 저장되며, sha256으로 암호화된 모습을 볼 수 있어요~!
그리고 Layer들은 읽기 전용 의 속성이기 때문에 절대로 수정하거나 건드릴 수 없습니다
Layer들은 어떻게 확인할 수 있나요.?
위 Layer들은 python:3 를 기반으로 하는 Layer들을 참조했기 때문에, 나중에 python:3 의 Layer도 같이 보여드릴게요 ㅎㅎ
자세한 것은 만들고 나서 더 설명드릴게요 ㅎㅎ
그러면 이제 차근차근히 명렁어에 대해 알아볼까요?
DockerFile 작성
먼저 DockerFile을 작성하기 전에,
간단하게 Python Server를 만들어 봅시다~!
Flask를 기반으로 하는 간단한 서버를 만들어볼게요
from flask import Flask
app = Flask(__name__)
@app.route('/')
def main():
return 'Hello From Flask'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
간단하게 8080 port로 서버를 하나 만들어봤어요~!
해당 서버는 로컬에서도 띄울 수 있는데요,
제대로 띄우고 요청하시면~!
위와 같이 응답이 오는 것을 볼 수 있습니다~!
그러면 위를 기반으로 하는 DockerFile을 작성해 볼게요~!
# python:3.9의 이미지로 부터
FROM python:3.9
# 제작자 및 author 기입
LABEL maintainer="huisam@naver.com"
# 해당 디렉토리에 있는 모든 하위항목들을 '/app/server`로 복사한다
COPY . /app/server
# image의 directory로 이동하고
WORKDIR /app/server
# 필요한 의존성 file들 설치
RUN pip3 install -r requirements.txt
# 환경 설정 세팅
RUN python setup.py install
# container가 구동되면 실행
ENTRYPOINT ["python", "Server.py"]
기본적인 명령어는 주석으로 써놓았습니다~!
중요한 포인트중의 하나는 바로 ENTRYPOINT 인데요!
ENTRYPOINT는 기본적으로 /bin/sh 을 참조해서 사용하기 때문에
FROM으로 부터 참조한 이미지에서 /bin/sh 가 없다면 사용할 수 없습니다 ㅠㅠ
그럼 이제 만들었으니
빌드해서 한번 구동하는 것까지 해볼까요?
Dockerfile 빌드하고 실행하기
Dockerfile을 빌드하는 명령은 되게 간단합니다
docker build -t (image 이름) .
현재 디렉토리에 있는 Dockerfile을 기반으로 빌드를 하겠다는 명령어입니다~!
다른 디렉토리를 참조하고 싶다면 -f 옵션을 추가하시면 좋습니다~!
그러면 위와 같이 구동되는 것을 볼 수 있어요~!
만약, 로컬 image에 python:3.8 이미지가 없다면, pulling 해오는 모습도 볼 수 있습니다
그렇다면 위에서 만든 것을 Container로 한번 실행해볼까요?
docker run -d -p 2222:8080 --name python_server python_server
위에서 작성한 옵션들을 한번 볼게요~!
- -d : background로 container 실행
- -p : local환경에서의 2222번 port를 container 환경의 8080으로 포워딩
- --name : container의 이름
- 마지막은 image 이름
한번 실행해보면?
정상적으로 뜬 것을 확인했어요 ㅎㅎ
한번 요청이 잘 날라가는지 확인해볼까요?
2222번 포트를 연결 시켰기 때문에, 정상적으로 응답이 오는 것을 볼 수 있어요 ㅎㅎ
해당 container에서도 로그를 잘 남겼는지 확인해볼까요?
docker logs <container 이름>
실제로 container에 대해서 로그가 남는 것을 확인해볼 수 있습니다~!
만일 해당 컨테이너에 대한 실행 상태를 보고 싶다면,
docker ps
컨테이너를 종료하고 삭제하고 싶다면.?
docker rm -f <container 이름>
Layer 확인해보기
위에서 저희가 Layer를 살펴보는 시간이 있었죠 ㅎㅎ
그렇다면, python:3.8의 Layer와 저희가 만든 이미지의 Layer가 어떻게 구성되어있는지 볼까요?
실제로 밑에 3개 있는 Layer는 제외하고 동일한 것을 볼 수있죠?
위처럼 Layer는 정말 독립적으로 구조가 되어있기 때문에, 최대한의 메모리 효율을 볼 수 있어요 ㅎㅎ
container의 이미지마다 Layer가 각각 다르다면, image를 저장하는데만 엄청난 메모리 낭비를 볼 수 있는데,
개발하신 분께서 정말 효율적으로 만들어주신 것을 볼 수 있네요~!
마치며
지금까지는 되게 기본적인 설명만 있어요 ㅎㅎ
추가적으로 작성해야 될 부분이나, 모자른 점이 있다면 언제든 댓글 남겨주시면 감사하겠습니다~!
참고
도커 이미지 빌드 원리
초보를 위한 도커 이미지 만들기
dockerFile reference
'Developer > Kubernetes' 카테고리의 다른 글
[K8S] Pod topology spread constraint - 토폴로지 분배 제약 (0) | 2023.08.26 |
---|---|
[K8S] HPA - 쿠버네티스 Horizontal Pod AutoScaler (2) | 2021.12.26 |
[k8s/쿠버네티스] - Deployment로 애플리케이션 배포 (0) | 2020.07.20 |
[쿠버네티스 입문] - Pod 운영 (0) | 2019.01.15 |
[쿠버네티스 입문] - Docker 입문 (0) | 2019.01.13 |