57/120

김건호·2022년 5월 3일
1

가상화의 목적 -> isolation 리소스 분리 어플리케이션
vm을 사용하면 os가 같이 있기 때문에 비용이 큼

Docker

Container vs VM


APP + Bins/Lib = Container
컨테이너는 운영체제가 없고, 호스트의 운영체제를 사용 -> 사이즈가 가볍다는 장점

  • Bins/Lib -> 앱을 실행하기 위한 바이너리, 라이브러리

Container 핵심 기술

  • Cgroup: Control Group(리소스 양) 리눅스 시스템 상태에서, Control Group(리소스 양을 제어) 컨테이너를 제어 - 운영체제에 내장된 기능
  • Namespace: Isolation
    리눅스 커널에 오래전부터 존재, 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
Cgourp 과 namespacce를 쉽게 쓸 수 있게 해준게 도커

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

모든 패키지에는 서명이 되어있고 그 전자서명을 검증하는 키를 받아오는게 gpgkey

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

레포지토리 정보가 있는데 그파일을 만들고 내용을 넣음

cd /etc/apt/sources.list.d/doker.list

치전 업데이트 -> 새로운 저장소를 저장했기때문에

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
    오픈소스 산업표준 컨테이너 런타임에 컨테이너를 실행할 수 있는 산업표준
    containerd 전에는 컨테이너마다 전부 라이브러리가 달랐음 -> 이제는 얘땜에 무엇을 사용하든 가능-> 표준화
  • docker-compose-plugin: Docker Compose
    도커 데몬은 자동으로 실행
    도커엔진은 도커 그룹에 의해 실행
docker ps 에러
sudo docker 오케이

vagrant@docker:~$ tail /etc/group
docker:x:998: # 도커 그룹 같이 설치

현재 사용자를 도커 그룹에 넣어줌

sudo usermod -aG docker vagrant

그룹에 추가 후 시스템 재시작 해야함

터미널 환경 구성

zsh

sudo apt install zsh

oh my zsh zsh의 테마

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

~/.zshrc

...
ZSH_THEME="agnoster"
...

https://github.com/powerline/fonts

zshcrc파일 업데이트

source ~/.zshrc

zsh-suggestion 자주사용하는 명령어를 자동으로 완성해주는 기능

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

zsh-completions

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

zshrc에 플러그인 추가

~/.zshrc

 73 plugins=(
 74         git
 75         zsh-autosuggestions
 76         zsh-completions
 77			docker
 78 )

zsh의 docker 플러그인 -> 도커 옵션 검색 가능


도커 아키텍쳐


도커 아키텍쳐 그림
도커명령어 : client
Docker_HOST : server
Registry 저장소 : 컨테이너를 만들기위한 컨테이너용 이미지가 필요 - 그이미지 저장하는게 레지스트리
로컬에 있는거 쓸수 있고 서비스도 이용가능
대표적인 서비스는 도커 허브

이미지를 엔진이 있는 서버로 가져오고 -> 컨테이너를 만듬
이미지는 항상 레지스트리라는곳에 잇음

docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
# 1. 도커데몬에게 도커 클라이언트가 접근을한다
 1. The Docker client contacted the Docker daemon.
# 2. 도커 데몬은 hello-wordl 이미지로 컨테이너만듬 로컬에서 찾고 없으면 레지스트리에서 다운
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
# 3. 도커데몬은 새로운 컨테이너를 만듬
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
# 4. 도커데몬은 도커 클라이언트에게 전송한다 
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

한번 실행해서 도커가 제대로 설치되었는지 확인하는 이미지

컨테이너 이미지

(registry/)repository/name:tag
태그 생략하면 무조건 latest
로컬에 한 번이라도 썼던 이미지 목록

docker images

docker ps

실행중인 컨테이너 목록을 볼수 잇음

 vagrant@docker  ~  docker ps
CONTAINER ID   IMAGE         COMMAND              CREATED             STATUS                           PORTS     NAMES
d7d8ce3a39ba   hello-world   "/hello"             4 minutes ago       Exited (0) 3 minutes ago                   stupefied_varahamihira

모든 컨테이너 목록

docekr ps -a
  • COMMAND : 이미지에서 실행할 앱
  • CREATED : 생성한 시간
  • STATUS : 컨테이너 상태
    실행하려는 어플은 /hello -> 명령어 명령어 종료되면 컨테이너도 같이 종료 -> 앱이 없으면 컨테이너를 실행할 필요가 없음
  • NAMES: 컨테이너의 이름 별도로 지정하지 앟으면 랜덤으로 지정

docker rm

컨테이너 삭제

docker rm <NAMES|ID>

id는 앞 두 글자 이상을 쓰면 자동으로 찾아줌, 앞 두글자가 같은 컨테이너가 두 개이상 있다면 실패

이미지 삭제

docker rmi

Lifecycle

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

application이 종료 컨테이너도 종료(stop)
kill의 시그널은 시스템의 시그널 + 128 -> 시스템의 시그널과 구분하기 위함

docker run -it ubuntu(이미지) bash(커맨드)

  • -i: STDIN 유지
    bash는 입력이 들어가면 출력이 나옴 도커 클라는 기본적으로 표준입력을 전송시키지 않음
    이 옵션 사용하면 입력을 오픈하고 유지함 표준입력을 전송할수 있게만듬

bash 입력이 있어야 출력을 할 수 있음 -> 그냥 실행되면 바로 종료 표준입력을 받을수 없기 때문에

  • -t: Terminal 할당
  • -d: Detach

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

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

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

컨테이너 이미지에는 운영체제가 없는데❓ 이건 뭘까❓❗
-> base image
이미지를 만들때 사용 (packer처럼 이미지를 생성할 때)
앱에서 사용하는 바이너리와 라이브러리를 포함

profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

2개의 댓글

comment-user-thumbnail
2022년 5월 4일

건호님 ~/.zshrc 파일 plugins에 docker도 추가 해주세여!

1개의 답글