[개발일지 2022.4.22] Docker 와 Kubernetes

허제민·2022년 4월 22일
0

1.학습한 내용

1)Docker

실행하던 환경이 다른것을 Container 라는 규격에 맞춘 후 사용하는것으로 환경이 다른 것을 한대의 컴퓨터에서 여러개를 사용할수있도록 되었다.

위의 그림은 가상화와 Docker의 차이이다
가상화는 OS , LINUX가 들어가야 실행되는것과 다르게 Docker는 바로 실행이 된다.
Docker 시스템은 가상화보다 더 가볍게 실행이 된다.


Docker Engine: docker를 실행할수 있는 엔진

Docker Container: Kernel 에 올라가는 컨테이너

Docker Image: 이미 만들어진 컨테이너가 적용된 기초


Docker 기본 커맨드들.

Docker 사용해보기

Azure -리소스 그룹 - 만들기- Ubuntu Server 20.04 LTS -가상머신 이름 설정:dockerㅁㅁvm - 크기 : Standard_D4s_v3 -4 vcpu, 16GB 메모리 -암호설정 - 검토 및 만들기

PuTTY 를 통해서 로그인.

sudo apt-get update
sudo apt-get upgrade
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
sudo apt-get install apt-transport-https
sudo apt-get install ca-certificates curl gnupg lsb-release
echo \
"deb [arch=amd64 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-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

(docker core engine)를 설치한다.

sudo docker run hello-world


로컬내에 hello-world 가 없어서 인터넷을 통해서 찾아서 제일 최근의 것으로 저장을 하고 실행을 한다.
Hello from Docker! 부터는 hello-world 의 내용이다.

 sudo usermod -a -G docker $USER

모든 유저가 docker 를 사용할수있도록 해주는 코드
이 코드를 사용하여도 바로 적용은 되지 않으므로 리스타트를 한다.

sudo service docker restart
docker ps

실행중인 docker의 프로세스를 모두 표시한다.
이때 -a 를 추가하면 실행중이지 않은 모든 프로세스도 표시한다.

docker pull ubuntu:18.04

ubuntu:18.04 버전의 이미지를 받아온다.

docker run --name demo1 ubuntu:18.04

ubuntu:18.04 로 demo1 이라는 컨테이너를 만든다.

docker run -it --name demo2 ubuntu:18.04 /bin/bash

18.04버전의 ubuntu 로 만들어진 demo2 의 /bin/bash 안으로 들어간다.

하지만 이렇게 만들어진 컨테이너는 빠져나오면 종료가 된다.

docker run -it -d --name demo3 ubuntu:18.04

18.04버전의 ubuntu 로 만들어진 demo3 안으로 들어간다.
이때 -d는 daemon 을 뜻한다. 상시 작동을 하도록 만든다.

docker exec -it demo3 /bin/bash

demo3 의 /bin/bash 로 들어간다.
이때 만들어진 컨테이너는 -d가 설정되어 있으므로, exit로 나와도 실행이 되고있다.

docker logs --help

docker 의 logs 의 명령어들을 확인한다.

docker run --name demo6 -d busybox sh -c "while true; do $(echo date); sleep 1; done"

busybox 라는 이미지(없으면 다운받는다)로 1초마다 echo date 를 찍는 demo6를 만든다.

docker logs demo6 -f

현재 실행하는 화면을 계속 확인한다. 이때 끊을때는 컨트롤+C 버튼을 누른다.

docker logs demo6 -f & 

& 는 백그라운드로 계속 실행한다는 의미이다.

docker stop demo3

demo3 을 stop 시킨다는 명령어.

docker rm demo1

demo1 이라는 컨테이너를 rm(remove) 하는 명령어.
동시에 여러개도 삭제가 가능하다 (ex) docker rm demo2 demo3

docker rmi hello-world

사용하고 있는 이미지, hello-world 를 삭제한다.
이때, 이미지를 사용하고 있는 컨테이너가 있으면 삭제가 안되므로 그 컨테이너를 먼저 삭제해주어야한다.

mkdir docker-practice

docker-practice 디렉토리를 만든다.

cd docker-practice/

docker-practice 디렉토리 안으로 들어간다.

touch Dockerfile

touch : 내용이 없는 빈 파일을 만들어준다.

vi Dockerfile

이 파일을 vi editor 로 편집한다.

이때 vi editor 는 i 를 눌러서 Insert 모드로 먼저 바꾸어줘야 입력이 가능하다.

이때 esc 를 누르면 Insert 모드가 꺼진다.

시프트 + : 키
뒤에 문자를 쓰는것으로 실행이 된다.
w : write
q: quit

cat Dockerfile

cat: 만들어진 코드를 확인하는 명령어.

docker build --help

docker build 의 명령어들을 확인한다.

docker build -t my-image:v1.0.0 .

현재 디렉토리에 my-image 1.0.0버전으로 만든다.

docker images | grep my-image

my-image 의 키워드를 가진 목록을 확인할수있다. ( | grep : my-image가 있는)

docker run -d -p 5000:5000 --name registry registry

-p : port 를 의미한다.
registry 에서 registry이미지를 가져와서 포트넘버가 5000:5000 인 registry 를 만든다.

docker tag my-image:v1.0.0 localhost:5000/my-image:v1.0.0

localhost 가 5000인 곳에 my-image를 태그로 저장할것이다.

docker push localhost:5000/my-image:v1.0.0

로컬에서 Git 처럼 docker를 관리해주는 registry 에 이미지를 넣는것이다.

curl -X GET http://localhost:5000/v2/_catalog

localhost:5000 에 현재 저장 되어있는 이미지의 목록을 보여준다.

curl -X GET http://localhost:5000/v2/my-image/tags/list

my-image의 태그를 보여준다.

docker login

hub.docker.com 의 아이디와 패스워드를 묻는다.

docker tag my-image:v1.0.0 도커허브의아이디/my-image:v1.0.0

로컬에서의 registry 가 아닌 인터넷상의 docker hub와 연결이 된다.

docker push 도커허브의아이디/my-image:v1.0.0

docker hub의 registry에 이미지를 넣는다.

2)Kubernetes

microsoft architecture : 시스템을 조각조각 내서, 필요할때마다 필요한 부분에 호출을 하는식으로 진행을 한다.

2-1)minikube

:

curl -LO https://storage.googleapis.com/minikube/releases/v1.22.0/minikube-linux-amd64

minikube 를 다운받는다.

sudo install minikube-linux-amd64 /usr/local/bin/minikube

minikube-linux-amd64를 생성한다.

minikube --help

minikube 의 명령어들을 확인한다.

curl -LO https://dl.k8s.io/release/v1.22.1/bin/linux/amd64/kubectl

인터넷에 있는 kubectl을 다운받는다.
kubectl 을 사용하는 명령어.

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

실제로 설치를 하고 kubectl에 root 권한을 준다.
0755 (실행권한)

minikube start --driver=docker

minikube 를 시작한다.

kubectl get pod -n kube-system

kubenetes 들이 사용하려고 만든 component 를 가진다.

vi pod.yaml

해당 파일을 생성하고 바로 편집하게 한다.

apiVersion: v1 # kubernetes resource 의 API Version
kind: Pod # kubernetes resource name
metadata: # 메타데이터 : name, namespace, labels, annotations 등을 포함
name: counter
spec: # 메인 파트 : resource 의 desired state 를 명시
containers:
- name: count # container 의 이름
image: busybox # container 의 image
args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done'] # 해당 image 의 entrypoint 의 args 로 입력하고 싶은 부분

api버전 1.0
실행을 시킬수 있는 pod를.
pod의 이름은 counter.
실제로 pod를 실행할 내용인 container 가 count라는 컨테이너를 busybox 라는 이미지를 사용하여서 만든다.

kubectl apply -f pod.yaml

파일에 잇는 내용을 적용한다.

kubectl get pod

pod의 내용을 확인한다.

kubectl exec -it counter sh

kubenetes 에 의해 동작하고 있는 서버에 접속을 한다.

kubectl delete pod counter

counter 이라는 pod를 삭제를 한다.

2.학습내용 중 어려웠던 점

도중에 docker run my-image:v1.0.0 이 실행이 되지 않았다.

3.해결방법

이 이유를 알기 위해서 Dockerfile 의 내용을 확인하였는데, 이때 강사님은 반점(,)를 썻던 부분을 나는 온점(.)으로 보고 찍은것을 알게되어서 바꾸었더니 실행이 제대로 되었다.

4.학습소감

3주간 강사님에게 수업을 들으면서 전혀 없었던 기초를 쌓을수 있었다, 전문적인 내용까지 가는것에는 시간이 부족해서 불가능했지만, 기초를 쌓았으니 그 위에 지식을 쌓는것은 나에게 주어진 일일것이다. 시간은 오래 걸릴수 있을지라도 이를 조금씩이라도 확실하게 쌓을 수 있기를 바란다.

profile
대구 AI 스쿨 2기 초급개발자 과정을 진행중인 허제민입니다.

0개의 댓글