한 번 빌드를 하고, 다시 한번 빌드를 하는 경우 이전보다 소요시간이 짧은 경우 ->
1. FROM에서 이미지를 컨테이너로 만들고
2. RUN에선 실행 - 커밋 - 컨테이너를 만들고
...
이러한 과정을 진행하게 되는데 이 과정들은 캐싱(저장)이 되어 있음
Step 2/7 : RUN apt update
---> Using cache
---> 0f7d008ceac9
내용이 바뀌면 도커는 변경된 내용을 확인하는게 아니라 파일의 해시를 확인하기 때문에 변경된 파일로 빌드를 하게 됨
apache update
는 캐싱되어 있어 진행되지 않는 경우
RUN apt install -y apache2
처럼 설치를 하게 될 때 생기는 문제점인데
예를 들어 2.4.10 버전을 설치하려는 의도인데,apache update
실행되지 않아 이전 버전으로 빌드하게 되는 문제점이 있음
apache==x.x.x
처럼 버전을 지정해주는 것을 권장ONBUILD
를 사용하기 - 빌드할 때마다 실행할 인스트럭션을 지정docker build --no-cache
옵션을 통해 캐싱을 진행하지 않음빌드시간에 따라 고려하여 진행하기
vagrant@docker ~/imagebuild docker image ls | grep python
python 3.9-buster 2081325398fc 2 weeks ago 889MB
python 3.9-slim-buster 975c845dddf2 2 weeks ago 118MB
python 3.9-alpine 9f14ea10b146 3 weeks ago 47.5MB
buster는 데비안의 표준 라이브러리를 포함한 파이썬
slim은 표준 라이브러리를 제외하고 모두 제거가 되어 있음
alpine은 busybox에 apk 패키지 관리자를 설치하여 사용한 가장 작은 사이즈 -> bash 셸 조차 없고 born 셸만 포함
busybox : 리눅스 커널과 핵심 바이너리만 포함하고 있는 작은 사이즈의 리눅스 -> 임베디드 시스템에 사용 -> 패키지 관리자가 없음
대부분의 리눅스는 Glibc를 사용(lib + C)
알파인 리눅스는 용량을 줄이기 위해 musl(C 라이브러리)를 사용
완전히 호환이 되지 않아 오작동을 일으킬 가능성이 있음
vi Dockerfile
docker build -t mypyhello:v1 .
docker image inspect mypyhello:v1
Dockerfile
FROM python:3.9-buster
ADD hello.py /root # hello.py 파일을 컨테이너에 추가
CMD ["python3","/root/hello.py"]
vagrant@docker ~/python docker run mypyhello:v1
hello
파이썬은 가상환경 별로 패키지를 설치하고 관리할 수 있음
시스템 별로 패키지를 분리하여 관리할 수 있게 때문에 isolation이 가능함
sudo apt install python3-venv
python3 -m venv(가상환경 패키지명) 가상환경 이름
tree venv
├── lib
│ └── python3.8
│ └── site-packages
│ ├── Flask-2.1.2.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.rst
│ │ ├── METADATA
│ │ ├── RECORD
│ │ ├── WHEEL
│ │ ├── entry_points.txt
│ │ └── top_level.txt
라이브러리를 디렉토리에 따로 관리
. venv/bin/activate
deactivate
mkdir ~/python/hello-flask
cd ~/python/hello-flask
가상환경/프로젝트 생성
python3 -m venv venv
가상환경 활성화
. venv/bin/activate
가상환경 비활성화
deactivate
pip3 install Flask
hello.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
함수위에 @ 는 데코레이터 꾸미는 용도
app route 데코레이터 메소드를 붙이면 뒤에 경로이고
루트 경로로 오면 이 함수를 실행하세요 라는 뜻
export FLASK_APP=hello
flask run
flask run --host='0.0.0.0' [--port='8080']
pip3 freeze > requirements.txt
현재 설치한 패키지들을 얼린다 -> 보존한다
보존한 값을 저기에 저장
현재 설치된 패키지들의 목록들이 저장
pip3 install -r requirements.txt
mkdir ~/python/hello-django
cd ~/python/hello-django
python3 -m venv venv
. venv/bin/activate
pip3 install Django
pip3 freeze > requirments.txt
mysite/settings.py
...
ALLOWED_HOSTS = ['*']
...
cd mysite
python3 manage.py runserver 0.0.0.0:8000
Language
sudo apt install gcc
mkdir ~/clang
cd ~/clang
hello.c
#include <stdio.h>
int main() {
printf("Hello C World\n");
return 0;
}
간단한 프로그램을 실행하기 위해 이미지가 너무 무거운 경우 사용하는 방법 -> 실행파일 하나만 이미지에 넣으면 되는 경우
아래와 같은 방법 사용
아무것도 없는 이미지
위의 상황처럼 실행파일만 있으면 되는 경우 ADD로 Dockerfile에 파일을 추가만 하면 될 것 같지만, FROM이 없으면 빌드가 되지 않음 -> 그때 사용 되는 이미지
gcc hello.c -o hello
file hello
... dynamically linked ...
ldd hello
linux-vdso.so.1 (0x00007ffcd014b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe1a8ed2000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe1a90d2000)
mkdir -p lib/x86_64-linux-gnu
mkdir lib64
cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 lib64/
Dockerfile
FROM scratch
COPY lib /lib
COPY lib64 /lib64
COPY hello /
CMD ["/hello"]
docker build -t hello:dynamic .
docker run hello:dynamic
연결된 라이브러리를 파일 안에 포함시킬 때 사용
gcc hello.c -static -o helloc
Dockerfile-static
FROM scratch
COPY helloc /
CMD ["/helloc"]
docker build -f Dockerfile-static -t hello:static .
docker run hello:static
실행 파일 빌드를 따로 하지 않고 빌드 시에 진행
Dockerfile-multi
# 이미지 생성 시 커밋되지 않음
FROM gcc AS cbuilder
WORKDIR /root
ADD hello.c .
RUN gcc hello.c -static -o hello
FROM scratch
COPY --from=cbuilder /root/hello /
CMD ["/hello"]
docker build -f Dockerfile-multi -t hello:multi .
docker run hello:multi