61/120

김건호·2022년 5월 11일
1
post-custom-banner

리눅스 시스템 관련

  • 유닉스 시스템은 대소문자를 구별

이미지를 빌드 하다보면 평소보다 금방끝나는 이유

한 번 빌드를 하고, 다시 한번 빌드를 하는 경우 이전보다 소요시간이 짧은 경우 ->
1. FROM에서 이미지를 컨테이너로 만들고
2. RUN에선 실행 - 커밋 - 컨테이너를 만들고
...
이러한 과정을 진행하게 되는데 이 과정들은 캐싱(저장)이 되어 있음

이미 진행된 과정은 Using cache로 표시

Step 2/7 : RUN apt update
 ---> Using cache
 ---> 0f7d008ceac9

파일의 내용을 바꾸고 빌드한다면❓

내용이 바뀌면 도커는 변경된 내용을 확인하는게 아니라 파일의 해시를 확인하기 때문에 변경된 파일로 빌드를 하게 됨

추후에 빌드를 다시할 경우 생길 수 있는 문제점

apache update는 캐싱되어 있어 진행되지 않는 경우

RUN apt install -y apache2

처럼 설치를 하게 될 때 생기는 문제점인데
예를 들어 2.4.10 버전을 설치하려는 의도인데,apache update 실행되지 않아 이전 버전으로 빌드하게 되는 문제점이 있음

방지하려면❓

  1. 우분투의 경우 apache==x.x.x처럼 버전을 지정해주는 것을 권장
  2. ONBUILD를 사용하기 - 빌드할 때마다 실행할 인스트럭션을 지정
  3. docker build --no-cache 옵션을 통해 캐싱을 진행하지 않음

빌드시간에 따라 고려하여 진행하기

slim, alpine

 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 : 리눅스 커널과 핵심 바이너리만 포함하고 있는 작은 사이즈의 리눅스 -> 임베디드 시스템에 사용 -> 패키지 관리자가 없음

musl

대부분의 리눅스는 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

Flask

  • python3
  • python3-pip
  • python3-venv
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 데코레이터 메소드를 붙이면 뒤에 경로이고
루트 경로로 오면 이 함수를 실행하세요 라는 뜻

Flask app 외부에서 접속하기

export FLASK_APP=hello
flask run
flask run --host='0.0.0.0' [--port='8080']

코드 배포 시, 패키지 관리

pip3 freeze > requirements.txt

현재 설치한 패키지들을 얼린다 -> 보존한다
보존한 값을 저기에 저장
현재 설치된 패키지들의 목록들이 저장

pip3 install -r requirements.txt

Django

https://docs.djangoproject.com/en/4.0/intro/tutorial01/

프로젝트 생성

mkdir ~/python/hello-django
cd ~/python/hello-django

가상환경 생성 및 활성화

python3 -m venv venv
. venv/bin/activate

Django 설치

pip3 install Django
pip3 freeze > requirments.txt

외부접속 허용

mysite/settings.py

...
ALLOWED_HOSTS = ['*']
...
cd mysite
python3 manage.py runserver 0.0.0.0:8000

C

Language

  • 컴파일: C, C++, Golang, Rust -> 실행파일
    - Java, .NET(C#) -> Bytecode
  • 스크립트: Shell, Perl, Python, Ruby, Javascript
    - 인터프리터/런타임
sudo apt install gcc
mkdir ~/clang
cd ~/clang

hello.c

#include <stdio.h>

int main() {
        printf("Hello C World\n");
        return 0;
}

간단한 프로그램을 실행하기 위해 이미지가 너무 무거운 경우 사용하는 방법 -> 실행파일 하나만 이미지에 넣으면 되는 경우
아래와 같은 방법 사용

scratch

아무것도 없는 이미지
위의 상황처럼 실행파일만 있으면 되는 경우 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 생성

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
profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽
post-custom-banner

0개의 댓글