20220511 필기노트

강재민·2022년 5월 11일
0

필기노트

목록 보기
5/23

수업내용 요약


쉘 변수

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
  • $0: 명령어
  • $1: 첫번째 아규먼트
  • $2: 두번째 아규먼트
  • $@: 모든 아규먼트

Alpine Linux

Busybox + APK(패키지 관리자)

패키지 인덱스

apk update

패키지 검색

apk search <PKG>

패키지 추가

apk add <PKG>

패키지 제거

apk del <PKG>

Flask

  • python3
  • python3-pip
  • python3-venv
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


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
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;
}

동적 바이너리

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 목차 디자인

  • 항상 pdf로 변환해서 제출해라
  • 인트로 페이지가 50점이고 결론 페이지가 30점이다.
  • 그래서 인트로 페이지와 결론페이지를 가장 먼저 작업해야함
  • 첫 부분에 쉽게 이해할 수 있게 간단한 단어나 그림으로 전체적인 맥락을 표현하는게 매우 중요하다.
  • 완벽한 아키텍처는 없기 때문에 하나의 경험이 되고 계속해서 나아가면 된다.. 다만 왜 잘못되었는지를 물어봤을 때 아는지를 잘 말할 수 있으면 된다.
  • 심지어 코드는 전부다 보여줄 필요는 없다. GIT서버에 올릴 수도 있고 하니까 필요한 코드만 올려도 되니까 최대한 설명을 많이 올려주기를 바람


기술점수 적지마세요

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가 됨


ubuntu에 timezone 세팅하기

추가사항

설치시에 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 python


이 세 가지를 비교해보려고 한다.

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을 사용하는 것은 그렇게 좋은 방법은 아니다.

그럼에도 불구하고 용량에서 너무나도 큰 이점이 있기 때문에 사용을 많이 하고있다.


python

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
...

이런 변형 버전의 이미지들이 존재를 하고 이것들을 효과적으로 사용할 수 있어야한다.



항상 .은 빼먹지말기 !


flisk

파이썬을 웹에서 작동할 수 있게만들어놓은 것임
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버전으로 되어있으면 주의해야함

질문
파이썬으로 웹사이트를 호스팅할수있게 해주는게 플라스크인가요?

가상환경을 실행할 때에는 디렉토리에서 실행하고 이후에 디렉토리는 나와도 상관없음


이렇게 패키지들을 구분해서 관리할 수 있음


가상환경에 flask 패키지 설치 및 실행

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해서 패키지묶음파일 만들어보기
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


django

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 소스코드를
이미지화시켜보도록 하자
%%%%%%%%%%%%%%%%%%%%%%%%%%%

내일은 고랭이랑 도커 컴포즈였는데
내일까지 도커하고 금요일부터 쿠버네티스를 하는걸로..

0개의 댓글