a.sh
#!/bin/sh
echo "\$MSG = $MSG"
echo "\$@ = $@"
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
MSG="Hello World" ./a.sh 1 2 3 4 5 6
Busybox + APK(패키지 관리자)
패키지 인덱스
apk update
패키지 검색
apk search <PKG>
패키지 추가
apk add <PKG>
패키지 제거
apk del <PKG>
sudo apt install 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>"
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;
}
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
패스워드는 인증방법중에 가장 보안성이 낮은 방법중에 하나이다.
인증에는 여러 형태가 있지만 패스워드는 지식기반이기 때문에 모니터 옆에 비밀번호를 포스트잇으로 붙여놓는다거나 하는것은 노출위험이 크다.
키기반 인증도 결국은 패스워드 인증방식의 연장선임..
그렇지만 패스워드 인증방식이 너무 보편적이라 그만둘 수는 없고 MFA라고해서 서로 다른 인증방식을 섞어서 쓰는 형태가 되어갔다.
다만 이제 패스워드 없는 미래가 오고 있다고 한다.
https://www.protocol.com/bulletins/google-apple-microsoft-passwords
https://www.sans.org/blog/time-for-password-expiration-to-die/
이것은 SANS라고해서 Security 관련된 연구, 교육 비영리단체이다.
여기서 이야기하는 것은 패스워드 유효기간은 더 이상 필요하지 않다. 왜 90일단위로 패스워드를 바꾸라고 하는 것일까?
hash는 역방향으로 계산할 수가 없음 그래서
보통 해쉬를 계산해놓은 값과 내가 방금 친 비밀번호를 해쉬해서 두 값을 비교하는 방식으로 하는데
계속해서 대입을 하면 언젠가는 이 방식도 뚫리게 되어있다.
이때 하나의 패스워드를 cracking하는데 걸리는 시간이 90일이었다.
근데 그당시 컴퓨팅속도로 그런것이고 요즘은 10초 미만이다..
그래서 90일마다 바꾸는게 의미가 있느냐 하는내용임..
hash는 경우의 수가 정해져 있기 때문에 컴퓨팅파워가 강해지면 시간문제가 되어버림.. 결론적으로 패스워드는 안쓰는게 좋겠다가 됨
생체인식도 안되는 경우의 수가 있음..
만약 자동으로 패스워드가 초기화되어서 나에게 알려주는 사이트가 있다면
패스워드를 암호화하고있지 않거나 패스워드를 자체적으로 복호화 하는 사이트임
https://www.notion.so/5b1bcb7a87c24ab6b36d87959371ff19
그중에서 14번 PPT 목차 디자인
https://news.hada.io/topic?id=6483
건방지게 보일 수 있다.
쉘변수
이것의 정체가 무엇일까에 대한 이야기
vi 편집기로 다음과같이 편집을 해주고,,
#!/bin/sh
echo "\$MSG = $MSG"
echo "\$@ = $@"
echo "\$0 = $0"
echo "\$1 = $1"
argument를 붙이게 되면 이렇게 달라진다.
이렇게 각 번호의 의미를 알 수 있음
좀더 확장해보면
그래서 "$@"
는 명령어를 제외하고 나머지를 받는 특수 변수이다.
예제
줄이면
확인해보면
추가 예제 1
추가 예제 2
명령어 앞에 변수를 정의할 수 있다.
이렇게 해서 httpd에 추가적인 argument를 붙일 수 있다.
이거는 자동으로 export가 됨
설치시에 y or n 물어보는것은 관리자권한이 필요한지 안한지에 따라서 정해진다.
경고메시지가 떠도 설치되는데에는 아무런 문제가 없음
apt-get과 apt의 차이이다.
apt-get은 처음부터 존재했던 명령어는 아니다.
apt-cache search apach2
이렇게 명령어가 다 분리되어있다.
apt 명령어는 다른 apt-xxx에서 자주쓰는 기능들만 뽑아서 간편하게 만든 명령어이다.
그래서 apt명령어로만 사용하면 원하는데로 설치가 안될 수 도 있다는 내용이다.
그래서 경고를 띄우는 것이다.
이미 한 번 빌드를 한 경우
이 일련의 과정들이 cashing 되어있다.
로컬에 저장되어있음
html파일을 바꾸고 다시 실행을 하게 되면
해당 Step만 바뀌게됨
해쉬값을 비교하기 때문에 바뀐 내용을 알아챌 수 있음
이 부분을 붙이지 않아도 이미지가 만들어진것은 해당 레이어를 그냥 지나쳤기 때문임
만약, apache가 최신버진이 나와서 이미지를 다시 빌드하고싶게 된다면
새로운 패키지 목록을 가지고있는 index정보를 update로 가져와야한느데 이미 이 과정이 있기 때문에 패키지 정보가 바뀌지 않는다.
이게 centos에서는 yum명령어를 내릴 때마다 패키지 목록을 가져오기 때문에 문제가 안되는데 ubuntu에서는 그렇지 않기 때문에 이미 캐싱된 정보를 가져와서 업데이트가 안될 수 있다.
그래서
이 apache2 패키지의 버전을 지정해주어야한다.
방법은 2가지
https://docs.docker.com/engine/reference/builder/
ONBUILD라는 인스트럭션이 있음
빌드를 할 때마다 캐싱하지않고 새로 시작하라는 의미
또 다른 방법은
docker build --help
이 세 가지를 비교해보려고 한다.
docker pull python:3.9-buster
docker pull python:3.9-slim-buster
docker pull python:3.9-alpine
docker image ls | grep python
https://busybox.net/
비지박스는 보통 임베디드에서 사용할 아주 작은 리눅스이다.
리눅스 커널과 핵심 바이너리와 라이브러리만을 가지고있는 작은사이즈의 리눅스이다.
문제는 이 busybox에는 패키지관리자가 없다.
설치한다는 개념없이 소스 빌드를 해주어야한다.
소스코드를 받아서 실행파일을 직접 빌드 해주어야하고 그 실행파일을
어딘가에 가져다 놔야함
https://www.alpinelinux.org/
별도의 패키지 관리자가 있음
busybox에 apk 패키지 관리자를 추가한 것이 바로 이 alpinelinux이다.
docker pull alpine:3
알파인 리눅스에 파이썬을 설치하는 방식이기 때문에 이미 설치가 되어있음
docker run -it alpine:3 bash
배쉬쉘이 없음 기본적으로 본쉘만 가지고있다.
apt update #가능
apt search #가능
apt search apache2 #가능
apt search python3 #가능
apt add python3 #이런식으로 사용가능하다.
위키피디아 에서 Alpine linux에서..
Glibc C library
musl C library
Alpine리눅스에서 mysql을 사용하는 것은 그렇게 좋은 방법은 아니다.
그럼에도 불구하고 용량에서 너무나도 큰 이점이 있기 때문에 사용을 많이 하고있다.
docker사이트에서 python을 검색해서 들어가보면
Image Vagiants
이미지 변형
이라는 파이썬 패키지들의 종류들에 대한 설명이 되어있다.
bullseye는 데비안 리눅스를 위한것임
alpine은 알파인 리눅스를 위한것임
mkdir python
cd python
vi hello.py
#!/usr/bin/python3
print("Hello world")
vi Dockerfile
FROM python:3.9-buster
WORKDIR /root
ADD hello.py
CMD ["python3", "hello.py"]
:wq
###
docker build -f pyhello:v1
docker image inspect pyhello:v1
docker run -it pyhello:v1 bash
cd /root
ls
cat hello.py
python3 hello.py
docker run pyhello:v1
ls
cp Dockerfile Dockerfile-slim
vi Dockerfile-slim
도커파일이름이 Dockerfile이 아닌경우 이렇게 실행가능
docker run pyhello:v1-slim
cp Dockerfile Dockerfile-alpine
vi Dockerfile-alpine
...
이런 변형 버전의 이미지들이 존재를 하고 이것들을 효과적으로 사용할 수 있어야한다.
항상 .
은 빼먹지말기 !
파이썬을 웹에서 작동할 수 있게만들어놓은 것임
https://flask.palletsprojects.com/en/2.1.x/
비슷한 녀석으로 장고가 있음 django
점유율은 둘 다 비등비등함
장고는 풀스택과 백 오피스(어드민페이지)까지 가지고있다.
장고는 웹사이트를 순식간에 만들어낼 수 있다.
그런데 플라스크는 웹 앱 서비스만 할 수 있게 해주고 나머지는 우리가 모두 구현해야한다.
그래도 장고는 너무 커서 플라스크쪽을 많이 쓰게된다.
pip
명령어
파이썬용 라이브러리를 모아놓은 파이썬 패키지이다.
파이썬 패키지를 관리하기 위한 명령어임 yum 이나 apt같은 개념임
https://flask.palletsprojects.com/en/2.1.x/installation/
이미지를 만들기전에 로컬에서 확인을 해봐야하기 때문에..
로컬에 설치해서 해보도록하자
python3 --version
pip
pip3
apt search pip
sudo apt install python3-pip
pip --version
pip3 --version
pip3 list #이 컴퓨터에 설치되어 있는 python패키지 목록을 볼 수 있다.
### Global 패키지라고해서 이 시스템 전체에서 사용 가능한 것이다
### 다만 가상환경이라고 해서 vitual environment
### 가상환경에서만 패키지를 설치할 수 있게도 할 수 있다.
### 결국 패키지를 분리시키는 것이고 이것을 추천함
### 앱마다 패키지의 버전을 다르게 사용할 수도 있기 때문에 가상환경으로 해줌
pwd
mkdir python-flask
cd python-flask
python3 -m venv venv #마지막venv는 이름임
sudo apt install python3-venv
y
python3 -m venv venv
ls -a #venv라는 디렉토리가 생성되어있는데 왠만하면 직접 관리하지 말기
tree venv #보면 lib를 현재 디렉토리에서 관리함
. venv/bin/activate #스크립트 파일 실행하는 명령어
pip3 list #보면 패키지가 3개밖에 없음
deactivate #가상환경을 벗어남
pip3 list #global 패키지가 다시 뜸
차이점을 알아두시길
이부분이 python 2.7버전으로 되어있으면 주의해야함
질문
파이썬으로 웹사이트를 호스팅할수있게 해주는게 플라스크인가요?
옘
가상환경을 실행할 때에는 디렉토리에서 실행하고 이후에 디렉토리는 나와도 상관없음
이렇게 패키지들을 구분해서 관리할 수 있음
https://flask.palletsprojects.com/en/2.1.x/quickstart/#a-minimal-application
https://flask.palletsprojects.com/en/2.1.x/quickstart/
vi hello.py
from flask import Flask
app = Flask(__name__)
@app.route("/") #@는 꾸미는 데코레이터임 /는 url의 경로임 루트경로에 오면 아래 함수를 실행하세요 라는 의미임
def hello_world():
return "<p>Hello, World!</p>"
:qw
export FLASK_APP=hello
flask run
### 또는
python -m flask run
터미널 하나 더 열어서
curl localhost:5000
근데 이걸 크롬에서 접근하려고하면 안됨
해결하는 방법은
flask run --host=0.0.0.0
또 다른 예제로
변수 예제
pip3 freeze
설치한 패키지들을 보존하는 명령어임
패키지를 묶어서 한 번에 설치하기 위해서
파일로 만들어놓고
이렇게 한 번에 설치할 수 있음
https://github.com/kubernetes-sigs/kubespray
실제 사례임
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
숙제 flask를 이용해서 웹서비스 배포하는걸 freeze해서 패키지묶음파일 만들어보기
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
https://www.djangoproject.com/start/
https://docs.djangoproject.com/en/4.0/intro/install/
https://docs.djangoproject.com/en/4.0/topics/install/#installing-official-release
가상환경에서 이걸 설치해주면 됨
https://docs.djangoproject.com/en/4.0/intro/tutorial01/
장고는 아까 말했듯 풀스택이 가능하다
mkdir ~/python/hello-django
cd ~/python/hello-django
python3 -m venv djangoapp
deactivate
. djangoapp/bin/activage
pip3 install Django
pip3 list
pip3 freeze > requirements.txt
cat requirements.txt
django-admin startproject mysite
ls
tree mysite
tree구조 설명 나와있음
프레임워크는 그 안에서 모든작업을 하는거고
라이브러리는 불러와서 필요한 작업만 해주는 거고
cd mysite
....
크롬에서 접속은 안됨
curl localhost:8000
하면 접속됨
외부에 노출시키려면
python3 manage.py runserver 0.0.0.0:8000
크롬에서 접속하면 되긴 함
192.168.100.100:8000
ctrl+c
ls
vi mysite/settings.py
ALLOWED_HOSTS = ['*']
이렇게 하면 외부에서 접속이 가능하다.
그리고..
프로젝트 안에 여러개의 app이 있을 수 있다.
실행하기 전에 항상 현재 위치 확인해보고
tree polls
vi polls/views.py
vi polls/urls.py
루트로 들어오면 idex함수를 실행하라는 의미
앱의 url과 프로젝트의 url이 다름
vi mysite/urls.py
둘다 가능
python manage.py runserver
python manage.py runserver 0.0.0.0:8000
이렇게해서 패키지를 설치하고 실행은
python manage.py runserver 0.0.0.0:8000
이렇게해서 하면 된다.
홈페이지 보면 DB연결하는 부분도 나와있음
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
플라스크와 장고앱 이미지로 만들어서 실행해보기 숙제
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C로 간단한 hello world를 만들어보려고한다.
language
컴파일이 있고 스크립트가 있다
컴파일은 C, C++, Golang, Rust #바로 실행 가능한 파일로 만들어줘야함
Java, .NET(C#) #특이한 구성
스크립트는 Shell, Perl, Python, Ruby, Javascript
가 있다.
속도는 무조건 컴파일이 빠를 수 밖에 없다.
스크립트 랭귀지는 반드시 인터프리터/런타임 이라는 해석기가 필요하다.
파이썬은 800메가짜리 이미지가 필요하지만 C는 그런거 필요없이 바로 실행이 가능함
Java는 Bytecode라는 것을 만들어내서
이렇게 해석이 필요하긴 하지만 인터프리터 언어보다는 훨씬 빠르긴 함
ls
mkdir clang
cd clang
ls
vi hello.c
#include <stdio.h>
int main() {
printf("Hello C world");
return 0;
}
:wq
sudo apt install gcc
gcc hello.c -o hello
file hello
./hello #결과를 볼 수 있다.
FROM ubuntu:focal
ADD hello /root
CMD ["/root/hello"]
docker build -t chello .
docker run chello #결과가 잘 출력됨
### %나오는걸 없애고 싶으면
\n을 추가해주면 됨
문제는 이걸 실행하기 위한 이미지 크기가 너무 크다.
이걸 어떻게 하면 되느냐
scratch라는 이미지가 있음
아무것도 없는 이미지
이렇게하면 안됨 뭐라도 이미지를 지정해주어야 함 그래서 나온게
scratch
이걸로해도 결국 이미지는 만들어지지만 run은 안됨
hello world를 실행하기 위해서는 인터프리터가 필요하다.
아까 그 인터프리터와는 다르다 그냥 so
라고해서 그냥 c 라이브러리 라고 한다..
ldd hello #하면 이 친구가 사용하는 라이브러리들을 볼 수 있다.
그래서 ADD를 할 때 이 파일들을 같이 추가해주어야함
mkdir -p lib64 #디렉토리를 따로 만들어주고
ls
vi Dockerfile
docker build -t chello
docker run chello
프로그램은 혼자서 작동하는 것은 없다 다 라이브러리가 필요하다
이게 정적 바이너리이다
gcc hello.c -o hello
gcc hello.c -o hellos -static
file hell
file hells
ls -lh hello hellos
라이브러리를 실행파일에 넣어버린것임
vi Dockerfile
///
docker build -t chellos .
ldd hellos
이미지를 하루에 한 번씩 개발자가 보내줘서 이미지를 만들어야하는 상황이라고 하면
매번 이렇게 이런 작업을 해주어야하느냐
이런거를 자동화하려면
귀찮이즘을 많이 느끼는 사람이 잘한다. -장성균 강사님
multi stage build
두 개의 빌드를 할 수있음
vi Dockerfile
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"]
:qw
docker build -t chellos .
빌드용으로만 gcc가 쓰이고 마지막 이미지만 이미지가 만들어진다.
%%%%%%%%%%%%%%%%%%%%%%%%%%%
숙제
flask나 django 소스코드를
이미지화시켜보도록 하자
%%%%%%%%%%%%%%%%%%%%%%%%%%%
내일은 고랭이랑 도커 컴포즈였는데
내일까지 도커하고 금요일부터 쿠버네티스를 하는걸로..