20220503 필기노트

강재민·2022년 5월 3일
0

필기노트

목록 보기
1/23

가상머신 1대로 wordpress배포를 했을 때

  1. vmss로 구성했을 때 인스턴스는 하나
    인스톨을 눌렀을 때 success가 나와야 DB의 스키마가 만들어지는거라서 연동이 된다.

  2. 로그인을 해보았고
    글을 쓰거나 댓글을 달 때
    시스템이 한 대 밖에 없어서 F5번을 눌러도 달라지는게 없다

하지만 만약 LB가 존재를 하고 2개의 웹서버가 존재하면 라운드로빈으로 전달을 하게 된다.
이때 로그인을 하게되면은 로그인 정보가 어디에 저장되느냐에 따라서 상황이 달라지게 된다

또는
DB에다가 저장되는 경우가 있다.

로그인 세션 정보를 어플리케이션에 남기때와 DB에 남길때가 다른데
어떤게 효율적인지는 케바케임
DB에 남기면 매번 DB에 로그인 정보를 요청해야하기 때문에 DB에 부하가 엄청 걸린다


가상머신 2대로 wordpress 배포를 했을 때

  1. 지금은 정보가 웹서버에 남기 때문에 1번 서버에 접속을 했다고 되고 다시 F5를 눌러서 다른 웹서버를 열게되면 로그인 정보가 없어져서 다시 풀리게 된다.

L4로드밸런서 같은경우 스티키세션이 있다.
F5를 눌러도 사용자를 보고 자동으로 특정 웹서버에 계속해서 연결시켜주는게 있다.

  1. L4애플리케이션 로드밸런서의 경우 쿠키 기반으로 가능함
    https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ko
    확장프로그램에 editcookie 추가하면
    현재 사이트에 대한 쿠키값을 확인 가능하다

  2. 워드프레스 화면에가서 쿠키 프로그램을 열면
    크게 2가지 값이 있음
    wordpress_test_cookie가 키
    밑에가 값
    wp_lang가 키
    밑에가 값
    이렇게 키 값형식으로 되어있다.

  3. 로그인 하고 다시 프로그램을 보면 뭐가 많음
    우리가 로그인을 하면 이런 정보를 서버가 우리한테 전송을 해주는거임

    로그인 정보를 쿠키를 통해 보내주게 된다
    이값을 가지고 스티키세션을 하는거임

  4. 로그인 시간도 확인함 유닉스타임으로 되어있음
    https://www.unixtimestamp.com/

    유닉스 타임은 1970년1월1일 기점으로 알려주는거임

  5. wordpress_logged_in 키 값 을 통해서 스티키세션을 구성할 수 있다.
    쿠키 내보내기를 통해 텍스트파일로 해당되는 키값을 받아볼 수도 있음

  6. 아까 내보내기했던거를 불러오기에 넣으면
    로그인 되지 않았던 페이지에 로그인이 되는 것을 확인 할 수 있다.

  7. 로그아웃을 누르게되면 아까 그 세션정보를 날리게된다 그래서 이후에는 쿠키값이 있어도 로그인이 안됨

    로그아웃은 장식이 아니다. -장성균 강사님


Azure의 애플리케이션 게이트웨이 실습

애플리케이션 게이트웨이 만들기
리소스그룹
게이트웨이이름
지역
자동크기조정
가상네트워크
서브넷
공용IP추가
백엔드 풀 추가	vmss
회람규칙	추가
규칙이름
우선순위
수신기이름
백엔드대상	이름
`쿠키기반 선호도 사용	선호도 쿠키 이름 여기에 wordpress_logged_in_ 을 추가하게 되면 로그인했던 서버만 연결이 되는거임`

AWS 애플리케이션 로드밸런서 실습

AWS 애플리케이션로드밸런서
에서는
로드밸런서 간단하게 하나를 만들고
리스너에 들어가서 규칙편집에 들어가서
규칙에 http헤더

https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
Set-Cookie: wordpress_logged_in_XXXX=XXXXX
이런 규칙을 추가 해주어야함

예시

네트워크 로드밸런서는 간단하게 구성 가능하지만 L7애플리케이션 로드밸런서의 경우 이런식으로 구성을 함

다른사이트들도 쿠키값들을 확인 할 수 있음 그리고 대부분 값들을 유추하지 못하게 인코딩이나 해쉬를 걸어놓는다

옛날에 쿠키값을 알 수 있게 노출된적이있는데 카페에서 level:1이런 정보가 있었는데 쿠키값을 9로 올리기만 하고 접속을 하면 관리자로 바로 접속이 가능했던 경우가 있었다.

사용자에대한 내용이 쿠키에 있어서 그 부분만 바꾸면 다른 사용자의 정보를 알 수 있었던 사고도 있었음

그래서 값들이 인코딩 되어있는것임


Docker

도커 책 1페이지에서 그림이 중요함
VM을 사용해야하는 이유는 무엇인가? 에 대한 내용과 관됨
가상화의 목적은 무엇이냐

isolation

리소스 즉 어플리케이션을 분리하는것임
하나의 하드웨어에 하나의 운영체제가 올라가고 여기에는 여러개의 어플리케이션 프로세스들이 올라가게된다.
이 프로세스들간에 격리가 안되면 안된다. 격리가 되어야 서로 영향을 주지 않는다.

가장 간단한 방법은 하드웨어를 각각 나눠서 각각 운영체제를 올리는 것이지만 너무 비효율적임

이런식으로 구성을 하면 어플리케이션이 운영체제를 건들여서 서로 영향을 끼침

그렇다고해서 하드웨어를 여러 대 구성하는것은 너무 비용이 많이 듦

그래서 우리는 VM이라는 개념을 생각해낸거임

물리적이 아닌 논리적으로 분리시키는 개념

컨테이너의 목적도 똑같다 isolation
격리를 하기위해서이다.
https://www.docker.com/blog/containers-replacing-virtual-machines/

가상화에는 2가지 종류가있는데 책에는 타입2 가상화이고 위의 링크에는 타입1 가상화이다.
타입1으로 이해하는게 좋음
apach같은 100메가의 작은 사이즈의 어플리케이션을 실행시키기위해 운영체제 800메가를 설치하는 것은 너무 비효율적임 윈도우는 거의 8기가 10기가에 육박하는 너무 비효율적인 상태이다.

그래서 도커를 쓰는거임

도커가 컨테이너는 아님
우리는 컨테이너라는 기술을 배우는거고 도커가 그것을 구현하기위한 도구이다. 다른 도구들도 많이 있다. 도커말고도 다양한 컨테이너가 있다는 것을 알아두면 좋다.

여기서 오해할만한 내용은 hypervisor처럼 도커가 계층을 존재하느냐 그렇지는 않다.
protection ring이라는 개념으로 운영체제가 존재했다.

도커 그림에 docker라는 layer가 있는것 처럼 보이지만 실제 layer가 있는것은 아님

어플리케이션을 appA B C D ... 로 분리시켜놓은개념임
운영체제 OS는 한 개를 가지고 참조함

다만 격리를 보장하기위한 컨테이너 개념을 가져가는 것이다.

컨테이너중에 기가가 넘어가는 어플리케이션도 있긴하지만 거의 10메가 정도로 작다.

bins 어플리케이션을 실행하기위한 바이너리 라이브러리

그래서 app1과 bins/lib만을 포함한것이 컨테이너임

배포하는데 있어서 vm은 아무리 빨라도 수 분이 걸리지만 해당되는 컨테이너를 띄우는 시간은 수 초밖에 걸리지 않는다.

컨테이너 기술은 실제로 운송시스템의 컨테이너개념과 같다.
컨테이너는 안에 무엇이 있던간에 일정 규격에 맞추어서 적재가 가능하고 전세계 규격이 동일하기 때문에 어디서든 무엇으로든 사용가능하다. 그래서 컨테이너 구조로 랩핑한다고 하는 개념이 있다.

vm은 제조사마다 다르다.

Docker의 가장 핵심 기술이 있는데
Cgroup
Namespace
Layerd Firesystem
첫 번째와 두 번째는 중요한 개념임

CGroup 확인 실습

리눅스환경에 접속을 해서
systemctl status chronyd  #중요한서비스는아니고 그냥 보는거임
CGroup이라는 정보가 담겨있다.

Cgroup은 Control Group이라는 뜻
프로세스를 그룹핑해주고 제어하는 개념임 무엇을 제어하느냐
리소스의 양을 제어한다.
/usr/sbin/chronyd에 할당해줄 리소스의 양을 제어할 수 있다.
cpu 메모리 네트워크를 얼마나 사용할 지에 대한 양을 제어할 수 있음
VM은 실제로 하드웨어의 특정 양을 제어하는건데 이것을 하이퍼바이져가 해주는거임

그럼 컨테이너에서는 누가 제어할것이냐 그게 CGroup이다
운영체제에 내장되어있는 개념임
이미 리눅스 커널에 20년전정도 부터 있었던 기능이다.

그렇다고해서 현재 실습 내용의 Cronyd CGroup에 제한이 있지는 않다 무제한임

Namespaces역시 리눅스 커널에 아주 오래전부터 존재했던 기능임

바로 isolation을 위한..

용어설명
IPC NS프로세스간에 통신하는 큐
PID NS프로세스
Network NS네트워크
UID NS유저 그룹
Mount NS마운트 포인트
UTS NS호스트네임

이런 것들이 있음

기본적으로 격리는 네임스페이스가 하는거고 VM과 유사하게 가져가기 위해서 위에서 정의한 요소들을 격리하는 기능을 가지고 서로서로 컨테이너간에 영향을 끼치지 않게 해준다.

이런것들을 쉽게 사용할 수 있게 도와주는 것이 도커이다 2014년쯤 나온 기술임.

구글에서는 2000년도 초반부터 이미 컨테이너 기술을 사용하고있었다고한다.

여담 )도커 데스크탑은 설치하지마시길

https://en.wikipedia.org/wiki/Docker_(software)
이게 도커임

처음에는 닷 클라우드에서 시작되었다.


linux kernel 안에 라이브러리를 제어가기 쉽게 libcontainer가 있는거임
라이브러리를 관리하기 편하게 되어있다.

윈도우 용도 있지만 안쓸예정

https://en.wikipedia.org/wiki/OS-level_virtualization
OS레벨의 버추얼라이제이션 컨테이너가 있기 이전에 LXC라는 리눅스 컨테이너가 있었다. LXC는 역사가 깊음

rkt Rocket이라는 컨테이너도 있고~ 이건 중단됨 지금은
WPARs 라는 컨테이너도 있고~
chroot 라는 루트 디렉토리를 체인지시킨다는 역사가 오래된 컨테이너
FreeBSD Jail 이라는 것도잇고..
안드로이드는 루팅한다고 함 스마트폰은 일반사용자권한으로 모든것들이 사용된다
아이폰은 Unix계열이라 관리자 권한이 됨 그리고 아이폰에는 Jail breaker라고해서 말그대로 jail을 깨는게 있음

루팅은 불법으로 다양한 변환이 가능하게 하는거임

podman은 도커의 대체로 대두되고있는 기술임
https://podman.io/

결론적으로 도커가 컨테이너를 만든게아니라 다양한 컨테이너 기술들이 존재했었는데 그중에서 도커가 사용하기 쉽게 만들어준것이다.

책에 3페이지 에서..
4페이지 맨 위쪽에 내용과 지금까지 다룬 내용이 동일함

https://github.com/cri-o/cri-o
쿠버네티스의 컨테이너에 인터페이스가 크라이 오 임

책에 5페이지 에서..
모놀리식과 마이크로서비스의 차이
https://microservices.io/
MSA라고도 말하는 마이크로 서비스개념이 컨테이너와 함께 나온다.

https://microservices.io/patterns/monolithic.html

모놀리식 서비스는 이렇게 하나의 큰 개념안에 여러 어플리케이션의 기능들이 들어가있는것임

래거시라고하면 구시대적인 옛날방식을 뜻하는데 모놀리식도 래거시로 치부하긴하는데 나중에 쿠버네티스에서 언급할것이지만 지금도 사용을 많이하는 가장 일반적인 방식이다. 꼭 마이크로서비스로만 할 필요없이 가장 기본적으로 간단하게 사용하기 위해서는 이렇게 모놀리식으로도 많이 사용을 함

WAR(와르) Web Archive이다

https://microservices.io/patterns/microservices.html

이렇게 기능을 다 분리시키는 것이 마이크로 서비스이다. 그러면 필요한 기능들만 스케일링이 가능한 것이다.
그렇지만 꼭 이렇게 구성할 필요는 없는것임
그리고 이것들을 하나하나 vm을 올리면 당연히 무거워짐

워드프레시의 경우 댓글, 화면, 등등이 한 화면에 하나로 묶어서 모놀리식으로 되어있는것인데 이거를 분리 시키는 것이 마이크로 서비스임

컨테이너 환경이 이런 마이크로서비스환경과 유사하다.
다만 컨테이너도 얼마든지 모놀리스 방식으로 사용가능하다.

도커에 제품이 많다

도커 허브
도커 스웜
도커 컨테이너
기본적으로 컨테이너를 제공하는 도커엔진을 도커라고 이야기함
Docker = Docker Engine

아까 도커 데스크탑은 설치하지 말라고했는데 이건 일반 데스크탑에서 도커를 실행시켜주는 것이지만 컨테이너는 리눅스에서만 동작하는 것을 알아두기 바람

마이크로 소프트도 컨테이너 개념을 만들긴했지만 우리는 그내용을 보지는 않을것임

mac이나 window 에서 사용가능하게 만든거임 어차피 vm을 만들어서 리눅스에서 동작하는거임
mac도 unix이기 때문에 동작하지않고 vm 을 만들어서 작동하는거임

그래서 도커 데스크탑을 설치하면 vm을 만들기 위해 hyperV가 설치되면서 버츄얼박스가 엄청 느려짐 그래서 설치하지말라는거임

단어의미
Docker CECommunity Edition
Docker EEEnterprise Edition

도커회사가 매우 가난하다. 실제로 돈을 번 회사는 구글과 레드헷임
도커 EE를 미란트란스 회사에 팔았음
도커의 버전이 YY.MM 이렇게 되어있는데
도커가 잘나갈 때는 월마다 버전을 하나씩 만들었었다.
하지만 지금은 어렵기 때문에 버전업데이트를 잘 해주지 못하고있다.

7page는 우분투 8page는 centos에 설치하는 방법이 나와있는데

현재 controller에는 이것저것 많이 설치되어있기 때문에
학습차원에서 별도로 디렉토리를 만들어서 새로 컨테이너를 위한 vm 을 시작하자

Vagrant.configure("2") do |config|
	# Define VM
	config.vm.define "docker" do |centos|
		centos.vm.box = "ubuntu/focal64"
		centos.vm.hostname = "docker"
		centos.vm.network "private_network", ip: "192.168.100.100"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "docker"
			vb.cpus = 2
			vb.memory = 4096
		end
	end
end

centos는 많이 사용해봤으니 ubuntu로 해보자

vscode 터미널에서

cd vagrant/container
vagrant up

책에도 설치하는 방법이 나와있지만 설치방법이 계속해서 업데이트 되니까 공식문서를 참조하는 것이 좋다.
https://docs.docker.com/engine/install/ubuntu/
CentOS Debian Fedora... 등등 설치방법들이 나누어져있음
~/.ssh/config에 아래 내용을 붙여넣기

Host docker
    HostName 192.168.100.100
    User vagrant
    IdentityFile C:\Users\Playdata\vagrant\container\.vagrant\machines\docker\virtualbox\private_key

터미널창에서..
ssh docker
만 해도 잘 접속이 되는 것을 확인할 수 있음

Uninstall old virsion 이라고 있는데

sudo apt search docker

기본적으로 도커가 있..지는 않다
centos경우에는 있다. 옛날버전이 있으므로 먼저 제거해주어야함
https://docs.docker.com/engine/install/ubuntu/
홈페이지 대로 잘 설치하면 됨

docker-ce라는게 커뮤니티 버젼이라는 뜻임

apt랑 apt-get은 같음

sudo apt update #패키지 목록 가져오기
sudo apt install ca-certificates curl gnupg lsb-release #설치를 위함
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg #전자서명을 받아오기 위한 명령어
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null #도커리스트
sudo apt update #설치하기전에 업데이트
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin #설치

docker-ce가 엔진 docker-ce-cli가 명렁어 containerd.io는
https://containerd.io/

컨테이너를 실행할 수 있는 산업 표준이다.
containerd.io가 라이브러리임 어떤 컨테이너 도구여도 상관없음
초기에는 라이브러리가 달라서 호환이 안되었지만 이제는 containerd를 사용해서 docker와 podman 둘 다 사용 가능하다

docker-compose-plugin은 나중에 공부할 예정

터미널창에서..
systemctl status docker 해보면 작동함

sudo docker run hello-world는 아직 실행시키지마셈

docker ps 해보면 오류가 남
sudo doker ps 해보면 오류가 안남
도커 명령어를 내릴 때 매번 sudo 명령어를 내리기 귀찮기 때문에


vagrant를 docker 그룹에 넣어주기

tail /etc/group
에서 docker라는 그룹이 같이 세팅이 되고
ps -ef | grep dockerd
하면 root에 의해서 실행되는거 확인 가능
id
vagrant사용자는 vagrant그룹에 되어있다.
sudo usermod -aG docker vagrant #vagrant 사용자를 docker그룹에 넣는것이다. 이렇게 해주고 나서 터미널을 닫았다가 열어주어야한다.
이거는 로그인할 때 변경사항이 적용되기 때문에 나갔다가 들어와야함

docker ps 했을 때
정상적으로 이제 작동하는거 확인


앞으로 도커 명령어를 많이 사용해야하는데 이 때 팁이 있다.
현재 우리는 bash shell을 쓰고 있지만 보통은 z shell을 많이 씀

sudo apt install zsh
필수사항은 아니지만 이런 방식을 많이 사용한다.
https://ohmyz.sh/
그냥 zshell을 쓰는게 아니라 테마를 넣어서 사용함
설치하는 방법도 홈페이지 아래 install 부분에 있다.

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
y

하면
vi ~/.zshrc
테마가 여러 개 있다 이중에 맘에 드는 테마를 선택 가능
https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
일반적으로 agnoster를 많이 사용함
ZSG_THEME 부분을 변경해주면됨

그리고 저장하고 다시 설정파일을 읽게 하기위해서
가상머신을 나갔다 들어오면됨
중간중간에 못읽어서 이상하게 뜨는 문자들이 있는데 이부분을 해결하기위해 폰트를 설치해준다.


터미널 폰트 패치하기

sudo apt search powerline
sudo apt install fonts-powerline
해결안됨

윈도우에도 폰트가 있어야 해결이 되는 것 같음

https://github.com/powerline/fonts
에서 보통은 Meslo slashed...를 많이 사용함

  1. https://github.com/powerline/fonts/archive/refs/heads/master.zip
    파일을 다운 받아서
    L
    M
    S는 사이즈고
    M사이즈꺼 4개를 모아서 클릭해서 설치해주면된다

  2. /터미널/설정/windows powershell/추가설정/모양에서 글꼴: Meslo LG M xxx

  3. vscode터미널 에서도 폰트를 사용하려면 폰트설정을 해주어야한다
    /왼쪽아래/설정/설정검색/font family.. 나중에 해결해줄거임

좀 더 많은 정보를 노출시켜주는것 뿐만아니라 막강한 기능들 이 많이 있다.
https://github.com/zsh-users/zsh-autosuggestions
자주사용하는 명렁어들을 자동으로 완성해주는 기능이다.
install.md에 들어가서
우리는 OhMyZsh방식을 사용하면됨
보면 명령어들이 쭉 있음
이거를 그대로 붙여서 설치하면 됨

https://github.com/zsh-users/zsh-completions
여기에서도 설치방법에 따라 실행 시켜주면 됨

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions
source ~/.zshrc

vi ~/.zshrc

plugins=(
	git
    zsh-autosuggentions
    zsh completions
)

source ~/.zshrc

docker ps하고
d만 쳐도 희미하게 뒤에 자동완성이 있는데
여기서 화살표 오른쪽 키를 누르게 되면 완성이 되게 된다.

또한 화살표를 위 아래로 해보면 docker로 시작하는 다른 명령어들을 쉽게 볼 수 있게 해준다.

다른것도 많지만 이게 가장 기본적인 내용이다.
편리하고 오타를 안칠 확률이 높아지게 된다

왼쪽아래 설정에서
원격 [ssh-remote_docker]
terminal font
'Meslo LG M for Powerline'
해주고 vscode를 다시 실행시켜주어야함

docker version

20년 10월 버전에 14번째 패치이다.
기능개발은 거의 이루어지지 않고있는 중이다.

교재 19페이지가 가장 중요하다
도커 엔진에 대해서 살펴볼 예정
도커를 이해하지 못하면 쿠버네티스도 이해할 수 없다

https://docs.docker.com/get-started/overview/#docker-architecture
도커 아키텍처
client는 도커 명령어
host는 서버이다
서버는 도커 데몬이 작동하고 있다 도커 명령어가 도커 데몬에게 명령어를 입력하는 식이다
레지스트리라는 저장소가 있는데 ec2인스턴스를 만들때 보면 ami 이미지가 필요한데 컨테이너를 만드는데도 필요한 이미지를 저장하는 곳이 레지시트리이다. registry

https://hub.docker.com/
회원가입 하기

여기서 Saas형태로 레지스트리를 이용 가능하다. 약 900만개의 이미지들이 존재하는중


도커 이미지를 로컬로 가지고 와서 그 이미지를 가지고 컨테이너를 생성하는 구조

docker run hello-world

도커가 잘 설치 되어있는지 확인 할 수 있다
hello-world라는 이미지를 실행하라는 명령어이다.

오른쪽에는 다운로드 횟수와 별점이 있다. 최근 업데이트 날짜와 설명이 있다.

일반적인 이미지는 이렇고 rancher는 계정 이름이다.

rancher는 일종의 회사이고 뒤에는 이미지 이름이 있다

컨테이너는 start stop 개념이 있긴하지만 컴퓨터를 키고 끄는 개념은 존재하지 않는다. 나중에 컨테이너의 라이프사이클을 소개할 예정

unable to find image 로컬에서 이미지를 찾을 수 없기 때문에 다운로드를 받아야 한다는 내용
'hello-world:latest'에서 :뒤에는 태그라고 하는 부분이 붙는다.
(registry/)repoository/name:tag 이게 이미지이 실제 완전한 이름이다.
만약 태그를 생략한다면 무조건 latest라는 태그를 사용하게된다

물론 여러가지 형태의 태그가 존재한다.

httpd를 검색해보면
official image라서 앞에 레포지토리는 없음
들어가서 보면 latest태그가 있다 보통 모든 이미지들은 이 latest태그가 있고 말 그대로 이미지의 실제 가장 최신 버전을 가져오게된다.
linux/386은 32비트

태그명은 보통은 버전을 명시한다.
예를들어 bullseye는 데비안계열이라는 의미이다.

다시한번 강조하는데 태그를 지정하지 않으면 latest태그를 지정하게된다.

오피셜이미지는 library/hello-world에서 앞에 레포지토리를 생략 가능하다

docker images
하면 한 번이라도 사용했던 이미지들이 남아있다
보면 레포지토리 태그 이미지아이디 생성날짜 등등이 명시되어있다.
사이트에 있는 이미지들은 압축된 이미지여서 이곳에 사이즈는 좀더 커진 모습을 볼 수 있다.

vm에서는 유저데이터나 앤서블을 이용해서 이미지에 추가적으로 동작을 가능하게 하지만

컨테이너는 이미지에 이미 모든 정보가 담겨있고 그게 끝이다.

to generate this message, Docker took the following steps 부분이 중요하다.
동작 원리들이 설명되어있음
1. 도커 클라이언트가 데몬에 접근한다.
2. hello-world 이미지가 로컬에 있는지 확인하고 없으면 레지스트리에서 다운받아서 가져온다.
3. 컨테이너를 만든다.
4. 도커 데몬은 클라이언트에게 전송한다. output을 stdout을
(stdout stderr stdinput)


여기에서 -it부분이 중요하다. 상세한 내용은 다음 시간에 공부할 예정

다시 docker run hello-world해보면 설치하는 과정없이 텍스트가 바로 찍히는 것을 확인할 수 있다.
docker ps 해보면 컨테이너 목록을 볼 수 있다.
docker ps -a
-a는 all 이라는 옵션임 만약에 붙이지 않으면 현재 실행되는 컨테이너만 보인다.

docker run 을 실행 할 때마다 컨테이너가 만들어진다. 그래서 docker ps -a에서 보면 각각 다른 ID가있는데 원래ID는 훨씬 길다

의미
COMMAN미지가 실행할 어플리케이션이고 이미지 내에 이미 정해져있다 라임 무엇 나중에 바꿀수도있지만 나중에 다시 이야기할 예정
CREATED생성시간 STATUS는 종료되었다 (0)는 exit코드 뒤에는 그 상태가 되기 몇 초 전인지 몇 분인지이다.
ports나중에 알아보도록 하고
names컨테이너의 이름이고 별도로 지정하지않으면 랜덤하게 지정하게 된다

CREATED와 STATUS시간의 차이를 확인할 수 있다. COMMAND 에서 "/hello"가 꺼지면 컨테이너가 꺼진다.

어플리케이션이 없는데 컨테이너가 더이상 실행될 이유가 없다.
그래서 자동으로 종료가 된다는점이 vm이랑 다름

docker rm [adoring_carwright]
docker rm 51d2db928ea7
docker rm 76 하면 그에 해당하는 id가 유일하면 지워진다

이런 방식으로 컨테이너를 지울 수 있음

질문사항있음

docker run httpd
이미지에 따라서 층이 다 다름

하고나면 커맨드가 입력되지 않는것을 확인 할 수 있다.
아까 4번 아웃풋을 클라이언트에게 보낸다는 개념에서
apache에서 실행되다가 적절한 설정이 안되어있어서 에러메시지와함께 종료되었다.

해당 터미널을 아파치가 사용하고있어서 커맨드입력이 안되는것이다
ctrl + C 하면종료됨

docker rm 8c b9 2e c2 c1 [id]

docker start elegant-golick하면 실행할 수 있지만 바로 종료되었음 하지만 종료시점을 앎으로서 실행이 되었던것을 알 수 있다.

계속적으로 도커를 띄워놓는 방법은 차차 알아볼 예정이다.

docker rmi c3 하면 rmi는 이미지를 지우는 것임

강의자료에 컨테이너 생명주기 추가요망

docker run = docker createdocker start를 합쳐놓은 것이다.
application이 종료되면 컨테이너도 종료되는 개념은 stop이다.

pause를 하면 리소스는 메모리를 가지고있는 상태에서 중지가 되어있다. 특별한 이유가 있지 않는한 잘 사용하지 않는 내용임
kill은 말그대로 컨테이너를 강제로 종료시키는 것임

docker run -d httpd 하면
백그라운드에서 사용를 하는 것인데 -d를 붙일 수 있는것과 붙일 수 없는것이 나누어져있음

마지막에 d03... 이게 컨테이너의 이름임

docker pause interesting_chatterjee
docker unpause interesting_chatterjee
docker kill interesting_chatterjee


137-128을 해주면 9 이다 이렇게 분리하는거는 컨테이너와 우리 프로세서를 분리하기 위함임
kill -9 강제종료

docker create -d httpd
docker ps -a
docker start [컨테이너 이름]

이런 라이프사이클을 이해하면 됨
일반적인 프로세스의 라이프사이클과 별반 다르지 않다.


~/.zshrc에 들어가서 plugins= (
에 보면 docker라고 플러그인을 추가해줄 수 있다.
)
docker 하고 탭탭눌러주면 명령어들을 확인할 수 있다.
매우 간편하구만

docker run hello-world 라고 쳤을 때 마지막에
ubuntu를 실행해보세요 라는 부분을 다시 보자면..

docker run --help
보면 어떤 옵션이 어떤 의미인지 알 수 있음
docker run -it ubuntu bash를 알아볼 예정 bash가 COMMAND 임

공식 레포지토리 홈페이지에서
ubuntu이미지를 보면 오피셜 이미지임

각 한 줄의 3개의 태그는 같은 의미임

docker run ubuntu 해보면..
설치가 되구
docker run -it ubuntu bash에서 bash는 사실 의미가 없는게 우분투는 이미 실행을 하면 기본적으로 bash를 실행하게 됨
-it옵션이 중요한데, docker run --help로 확인 할 수 있다.

-i		#interactive Keep STDIN
-t		#터미널을 할당
-d		#Detach

도커 클라이언트는 기본적으로 표준입력을 입력하지 않는다 그런데 -i 옵션을 사용하면 클라이언트가 데몬에게 표준입력을 전송할 수 있게 열어주는 것이다.

즉 키보드로 치는게 클라이언트에게서 데몬으로 표준입력이 stream 전송되는 것이다.

ctrl+C하면 다시 중지가 되고

docker run ubuntu하면 바로종료된다 왜냐하면 입력받은게 없으니 그냥 종료되는거임
그래서 -i옵션을 통해서 입력을 기다리고있는것임
ls 해볼 수 있는것임

docker run -it ubuntu
를하면 우리가 평소에 사용하던 모습으로 터미널 상태에서 표준입력과 출력을 할 수 있다.
hostname 은 기본적으로 컨테이너의 id이다
여기서 실행하는 명령어들은 전부다 컨테이너에서 실행하는 내용들임

docker run -it centos:7
해보면 마찬가지로 실행이 가능하다
yum install은 가능하지만
하지만
systemctl start httpd는 불가능하다. 근본적으로 이걸 사용하기 위해 컨테이너를 만든것도 아니긴하다

-it 옵션은 Shell을 실행하는 이미지에서 사용 centos,ubuntu...
-d 옵션은 어플리케이션이 계속적으로 실행되어야할 때 사용한다. httpd...

컨테이너는 운영체제가 없다고했는데 왜 이런것들이 존재하는 걸까 고민해보기

이런 이미지를 뭔가를 만들어서 다시 이미지로 만들어서 실행을 하는 구조이다 그래서 이걸 베이스 이미지라는 것이다.

다시 한 번 컨테이너는 운영체제가 없다고했다 그래서 커널도 없다.
운영체제의

설치를 하든 복사를하든 하는 하는 일을 시키기 위함임

docker run -d httpd #하면 실행이 됨
docker run -d ubuntu #하면 실행이 안됨
docker run -it hello-world bash #하면 실행이 안됨

900만개의 이미지들에 이런 차이점들이 존재하는데 이를 잘 확인하고 활용해야한다.


아래 내용은 강의자료이다.

Docker

Container 핵심 기술

  • Cgroup: Control Group(리소스 양)
  • Namespace: Isolation
    - IPC NS: IPC
    - PID NS: Process
    - Network NS: Network
    - UID NS: User/Group
    - Mount NS: Mount Point
    - UTS NS: Hostname
  • Layered Filesystem

Docker = Docker Engine

Docker CE: Community Edition
Docker EE: Enterprise Edition

YY.MM

Vagrant 환경 구성

`~/vagrant/container/Vagrantfile

Vagrant.configure("2") do |config|
	# Define VM
	config.vm.define "docker" do |centos|
		centos.vm.box = "ubuntu/focal64"
		centos.vm.hostname = "docker"
		centos.vm.network "private_network", ip: "192.168.100.100"
		centos.vm.provider "virtualbox" do |vb|
			vb.name = "docker"
			vb.cpus = 2
			vb.memory = 4096
		end
	end
end

~/.ssh/config

Host docker
    HostName 192.168.100.100
    User vagrant
    IdentityFile C:\Users\Playdata\vagrant\container\.vagrant\machines\docker\virtualbox\private_key

Docker Engine 설치

https://docs.docker.com/engine/install/ubuntu/

sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  • docker-ce: Docker Engine
  • docker-ce-cli: docker command
  • containerd.io: Container Runtime Interface
  • docker-compose-plugin: Docker Compose
sudo usermod -aG docker vagrant

터미널 환경 구성

sudo apt install zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

~/.zshrc

...
ZSH_THEME="agnoster"
...

https://github.com/powerline/fonts

source ~/.zshrc
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions

~/.zshrc

 73 plugins=(
 74         git
 75         zsh-autosuggestions
 76         zsh-completions
 77 )
source ~/.zshrc

컨테이너 이미지

(registry/)repository/name:tag

Lifecycle

create -> start -> (pause) -> (unpause) -> (kill) -> stop -> rm
run ---------->

application이 종료 컨테이너도 종료(stop)

  • -i: STDIN 유지
  • -t: Terminal 할당
  • -d: Detach

-it 옵션은 Shell을 실행하는 이미지에서 사용: centos, ubuntu ...
-d 옵션 application이 계속적으로 실행되어햐 할 때: httpd ...

리눅스 배포판 이름으로된 이미지

  • ubuntu
  • centos
  • rocky
  • debian
  • alpine
  • busybox
  • amazonlinux
  • oraclelinux
  • ...
    -> Base Image

2개의 댓글