0. 목차
- 가상머신 만들기
- 리소스그룹 선택, 만들기> Ubuntu Server 22.04 LTS
- 이름: labuser12345ubuntu
- 가용성 옵션 없음
- 보안 표준
- 크기: D4s_v3 (운영 중에도 바꿀 수 있긴 함, 바꾸고 나서 분 당 가격으로 바뀜)
- 인증 형식: 암호
- 공용 인바운드 포트: 선택한 포트 허용_네트워크 시큐리티 등록) SSH 포트 이용
- 생성
1. 도커
- 도커 설치 및 업그레이드, 연결
Install Docker Engine on Ubuntu
Install Docker Engine on Ubuntu
docs.docker.com
- 도커 권한 갖고 옴, 적용하기 위해 나갔다가 다시 재접속
- docker —version 버전 확인
1.1. 들어가기에 앞서
- 도커 파일 만들기
- 현재 디렉토리 위치 확인: pwd
- 다른 디렉토리로 이동: cd .. 와 cd /usr
- 개인 홈 디렉토리 이동: cd $home
- 디렉토리 생성: mkdir docker-practice
- ls을 통해 디렉토리 확인
1.2. 위치 지정
abcde@labuser111ubuntu:/usr$ pwd
/usr
abcde@labuser111ubuntu:/usr$ cd ..
abcde@labuser111ubuntu:/$ cd $HOME # 내 홈 디렉토리로 이동
abcde@labuser111ubuntu:~$ pwd # 현재 디렉토리 확인
/home/abcde
abcde@labuser111ubuntu:~$ mkdir docker-dir
abcde@labuser111ubuntu:~$ ls
docker-dir
abcde@labuser111ubuntu:~$ dir
docker-dir
abcde@labuser111ubuntu:~$ ls -al # 자세한 정보
total 36
drwxr-x--- 5 abcde abcde 4096 May 2 10:23 .
drwxr-xr-x 3 root root 4096 May 2 09:24 ..
-rw------- 1 abcde abcde 1968 May 2 10:12 .bash_history
-rw-r--r-- 1 abcde abcde 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 abcde abcde 3771 Jan 6 2022 .bashrc
drwx------ 2 abcde abcde 4096 May 2 09:25 .cache
-rw-r--r-- 1 abcde abcde 807 Jan 6 2022 .profile
drwx------ 2 abcde abcde 4096 May 2 09:24 .ssh
-rw-r--r-- 1 abcde abcde 0 May 2 09:53 .sudo_as_admin_successful
drwxrwxr-x 2 abcde abcde 4096 May 2 10:23 docker-dir
abcde@labuser111ubuntu:~$ ls -l # 숨김 파일 제외하고 보임
total 4
# 권한 drwxrwxr-x
drwxrwxr-x 2 abcde abcde 4096 May 2 10:23 docker-dir
abcde@labuser111ubuntu:~$
abcde@labuser111ubuntu:~$ cd docker-dir/ # 탭키
abcde@labuser111ubuntu:~/docker-dir$ touch Dockerfile # 실행
abcde@labuser111ubuntu:~/docker-dir$ ls
Dockerfile # 도커 파일 생성된 것을 확인
abcde@labuser111ubuntu:~/docker-dir$ cat Dockerfile # 아무 것도 없음, touch는 아무 것도 없는 파일을 생성하게 해줌
abcde@labuser111ubuntu:~/docker-dir$ reboot # 리부팅
abcde@labuser111ubuntu:~/docker-dir$ sudu reboot # 권한 없을 시 사용
1.3. 기본 명령어
- From: 베이스 이미지 지정
- - nginx(엔진엑스)_ 오픈소스 가장 가벼운 웹서버, 가볍고 배포하기 쉬움
- Copy: 담아서 하나의 컨테이너 활용
- Run: 커맨드를 도커 컨테이너에서 실행, 주로 pip 명령문이 있음
- - ubuntu 18.04 환경의 도커 컨테이너가 있다고 쳤을 때, 배포할 때 도커 환경 세팅(사이킷런, 넘파이, 판다스 넣어서 하지 않고 명령어로 미리 만들 수 있음)
RUN pip install touch # touch 패키지 설치 같이 됨
RUN pip install -r requirement.txt
- CMD: 도커 파일을 가지고 실제 이미지를 만들 때 사용. 하나의 명령어만 사용 _ 도커 이미지를 가지고 실제로 컨테이너가 메모리 상에 올라왔을 때 실행될 게 필요한데 그때 사용함, 실행 할 때 한 번만 사용
- Workdir: 어떤 디렉토리 내에서 수행할 것인지 확인하는 명령어
- Env: 시스템 환경 변수 지정
키와 환경변수를 통해 설정, language, 지역변수 설정
- Expose: 시스템 위에 여러 개의 도커가 실행이 되고 있을 때, 대체로 외부에 접속이 안 됨(경비가 있음), 특정 도커는 외부와 연결할 때 사용, 프로토콜 지정하지 않으면 TCP로 지정해줌
1.4. VI editer를 통한 도커 이미지 생성
- 유닛은 대소문자 구별하여 사용
- VI editer 모드로 들어가기
- I(인서트 모드)나 A 누르기
# 도커 파일 들어가기
$vi Dockerfile
-- INSERT -- # 키보드의 I 누르기
FROM ubuntu:18.04 # 우분투 18.04
RUN apt-get update # update 눌러서 만들 때 update 같이 진행
# ["첫번째파라미터", "명령에들어가는파라미터"], 리눅스 명령으로 들어감
# 셸에서 echo는 print와 동일
CMD ["echo","Hello Microsoft AI 2"]
나오기: ESC
하단에 :wq # 쓰고 나가기 (도커 파일 저장)
# 저장확인
cat Dockerfile
FROM ubuntu:18.04
RUN apt-get update
CMD ["echo","Hello Microsoft AI 2"]
$ls -al
total 12
drwxrwxr-x 2 abcde abcde 4096 May 2 10:56 .
drwxr-x--- 5 abcde abcde 4096 May 2 10:56 ..
-rw-rw-r-- 1 abcde abcde 73 May 2 10:56 Dockerfile
# 같은 디렉토리 참조하여 my-image:v1.0.0을 만들어냄, -t: tag, 맨 끝 . 현재 여기에 만들겠다는 의미
$ docker build -t my-image:v1.0.0 .
# 도커 실행
[+] Building 7.9s (6/6) FINISHED
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 110B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:18.04
# 우분투 명령어로 실행 0.4s
=> [1/2] FROM docker.io/library/ubuntu:18.04@sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005 1.1s
=> => resolve docker.io/library/ubuntu:18.04@sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005 0.0s
=> => sha256:3941d3b032a8168d53508410a67baad120a563df67a7959565a30a1cb2114731 2.30kB / 2.30kB 0.0s
=> => sha256:0c5227665c11379f79e9da3d3e4f1724f9316b87d259ac0131628ca1b923a392 25.69MB / 25.69MB 0.3s
=> => sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005931b 1.33kB / 1.33kB 0.0s
=> => sha256:0779371f96205678dbcaa3ef499be2e5f262c8b09aadc11754bf3daf9f35e03e 424B / 424B 0.0s
=> => extracting sha256:0c5227665c11379f79e9da3d3e4f1724f9316b87d259ac0131628ca1b923a392 0.6s
# 업데이트
=> [2/2] RUN apt-get update 5.5s
=> exporting to image 0.7s
=> => exporting layers 0.7s
=> => writing image sha256:8a935203c7b2f21a9de96da0239bbd21d45083595e98951092bb485461b16d04 0.0s
=> => naming to docker.io/library/my-image:v1.0.0
$docker build -t my-image:v1.0.0 .
# 어디에 만들었는가 확인
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-image v1.0.0 8a935203c7b2 About a minute ago 108MB
1.5. Dockerfile
# 컨테이너 만들기
$ docker run --name demo1 my-image:v1.0.0
(넣고 싶은 내용)
(1) Local Docker Registry
# 외부에서 접속할 수 있게 -p(포트 넘버) 지정해줘야 함
# 포트넘버: 5000, 이름: registry
docker run -d -p 5000:5000 --name registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
91d30c5bc195: Pull complete
65d52c8ad3c4: Pull complete
54f80cd081c9: Pull complete
ca8951d7f653: Pull complete
5ee46e9ce9b6: Pull complete
Digest: sha256:8c51be2f669c82da8015017ff1eae5e5155fcf707ba914c5c7b798fbeb03b50c
Status: Downloaded newer image for registry:latest
c45c73ffc7ce83b0ce2261a79a7f86190bc3778aef1b7fd0ac91c89b6af19943
# 레지스트리, 포트 넘버 열림 확인
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
c45c73ffc7ce registry "/entrypoint.sh /etc…" 27 seconds ago Up 26 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry
# image 이름 확인
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-image v1.0.0 8a935203c7b2 28 minutes ago 108MB
registry latest 8db46f9d7550 4 weeks ago 24.1MB
# 도커 파일 찾기
docker images | grep my-image
my-image v1.0.0 8a935203c7b2 29 minutes ago 108MB
# 레지스트리에 도커 이미지 넣기, localhost: 아이피 어드레스: 로컬 서비스 5000, 여기에 my-image를 넣기
docker push localhost:5000/my-image:v1.0.0
# 레지스트리 찾아볼 수 있게 localhost:5000의 my-image라고 연결
docker tag my-image:v1.0.0 localhost:5000/my-image:v1.0.0
# 도커 이미지 확인, curl -X GET 카탈로그 요청,
curl -X GET <http://localhost:5000/v2/_catalog>
{"repositories":["my-image"]}
# curl -X GET <http://localhost:5000/v2/my-image/tags/list>
{"name":"my-image","tags":["v1.0.0"]}
(2) Docker Hub
- https://hub.docker.com/ 회원가입, 로그인
- 도커 허브에 이미지 올리는 작업 진행
- docker commands> Run 통해서 이미지 공유가 가능
Docker Hub Container Image Library | App Containerization
Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.
hub.docker.com
도커 설치 파일 중에 CLI: 커맨드 라인 인터페이스_ 명령줄 인터페이스
docker login
Username
password
# docker hub 해당하는 위치로 연결
docker tag my-image:v1.0.0 (아이디)/my-image:v1.0.0
:~$ docker push (아이디)/my-image:v1.0.0
The push refers to repository [docker.io/qb86400/my-image]
bd606e52: Pushed
b7e0fa7f: Pushed
v1.0.0: digest: sha256:fd476467bafc4492b1af0328c04805188f5 size: 741
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
abcde/my-image v1.0.0 8a935203c7b2 About an hour ago 108MB
my-image v1.0.0 8a935203c7b2 About an hour ago 108MB
localhost:5000/my-image v1.0.0 8a935203c7b2 About an hour ago 108MB
registry latest 8db46f9d7550 4 weeks ago
24.1MB
2. 쿠버네티스 (Kubernetes)
2.1. minikube, kubectl 설치
# 설치
curl -LO <https://storage.googleapis.com/minikube/releases/v1.22.0/minikube-linux-amd64>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 66.5M 100 66.5M 0 0 99.7M 0 --:--:-- --:--:-- --:--:-- 99.7M
ls
docker-dir minikube-linux-amd64
# minikube 설치
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 버전
minikube --version
minikube provisions and manages local Kubernetes clusters optimized for development workflows.
Basic Commands:
start Starts a local Kubernetes cluster
status Gets the status of a local Kubernetes cluster
stop Stops a running local Kubernetes cluster
delete Deletes a local Kubernetes cluster
dashboard Access the Kubernetes dashboard running within the minikube cluster
pause pause Kubernetes
unpause unpause Kubernetes
Images Commands:
docker-env Configure environment to use minikube's Docker daemon
podman-env Configure environment to use minikube's Podman service
cache Add, delete, or push a local image into minikube
image Manage images
Configuration and Management Commands:
addons Enable or disable a minikube addon
config Modify persistent configuration values
profile Get or list the current profiles (clusters)
update-context Update kubeconfig in case of an IP or port change
Networking and Connectivity Commands:
service Returns a URL to connect to a service
tunnel Connect to LoadBalancer services
Advanced Commands:
mount Mounts the specified directory into minikube
ssh Log into the minikube environment (for debugging)
kubectl Run a kubectl binary matching the cluster version
node Add, remove, or list additional nodes
cp Copy the specified file into minikube
Troubleshooting Commands:
ssh-key Retrieve the ssh identity key path of the specified node
ssh-host Retrieve the ssh host key of the specified node
ip Retrieves the IP address of the specified node
logs Returns logs to debug a local Kubernetes cluster
update-check Print current and latest version number
version Print the version of minikube
Other Commands:
completion Generate command completion for a shell
Use "minikube --help" for more information about a given command.
# 관리, kubectl 다운
curl -LO <https://dl.k8s.io/release/v1.22.1/bin/linux/amd64/kubectl>
# kubectl 설치 (권한, 위치 주기)
# -o: oner, -g:group, -m 0755:
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 설치 확인
kubectl --help
2.2. minikube 실행
# minikube 실행
minikube start --driver=docker
😄 minikube v1.22.0 on Ubuntu 22.04
🎉 minikube 1.30.1 is available! Download it: <https://github.com/kubernetes/minikube/releases/tag/v1.30.1>
💡 To disable this notice, run: 'minikube config set WantUpdateNotification false'
✨ Using the docker driver based on user configuration
👍 Starting control plane node minikube in cluster minikube
🚜 Pulling base image ...
💾 Downloading Kubernetes v1.21.2 preload ...
> preloaded-images-k8s-v11-v1...: 502.14 MiB / 502.14 MiB 100.00% 196.59 M
> gcr.io/k8s-minikube/kicbase...: 361.08 MiB / 361.09 MiB 100.00% 42.66 Mi
🔥 Creating docker container (CPUs=2, Memory=4000MB) ...
🐳 Preparing Kubernetes v1.21.2 on Docker 20.10.7 ...
▪ Generating certificates and keys ...
▪ Booting up control plane ...
▪ Configuring RBAC rules ...
🔎 Verifying Kubernetes components...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟 Enabled addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
# 설치 상태 확인
:~$ minikube status
> minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
kubectl get pod # 파드 확인
> No resources found in default namespace.
kubectl get pod -n kube-system # 이것 자체도 컨테이너, Restarts: 불안정 척도, READY: 새로 생김
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-hz65s 1/1 Running 0 6m28s
etcd-minikube 1/1 Running 0 6m40s
kube-apiserver-minikube 1/1 Running 0 6m40s
kube-controller-manager-minikube 1/1 Running 0 6m40s
kube-proxy-l8t6k 1/1 Running 0 6m28s
kube-scheduler-minikube 1/1 Running 0 6m40s
storage-provisioner 1/1 Running 0 6m39s
# 삭제 (메모리에 남아 있는 것만 삭제 실행)
minikube delete
🔥 Deleting "minikube" in docker ...
🔥 Deleting container "minikube" ...
🔥 Removing /home/abcde/.minikube/machines/minikube ...
💀 Removed all traces of the "minikube" cluster.
# 완전 삭제
minikube uninstall
minikube status
minikube start --driver=docker
3. YAML
네트워크 전송 관련
YAML은 사람이 읽을 수 있는 데이터 직렬화 언어로서, 구성 파일 작성에 자주 사용됩니다. YAML을 yet another markup language로 생각하는 사람도 있고, YAML ain’t markup language(재귀 약어)로 생각하는 사람도 있습니다. 후자는 YAML이 문서가 아닌 데이터용임을 강조하는 말입니다.
YAML은 쉽게 읽고 이해할 수 있도록 설계 됐습니다. 또한 다른 프로그래밍 언어와 함께 사용할 수도 있습니다.
3.1. YAML 구문
YAML 파일은 .yml 또는 .yaml, Perl, C, XML, HTML, YAML은 JSON의 상위 집합이므로 YAML에서 JSON 파일을 사용할 수 있습니다.
YAML 파일은 Python 스타일의 들여쓰기를 사용해 구조를 결정하고 중첩을 표시하므로 더 읽기 쉽습니다.
3.2. 문법
- key-value의 조합
- 주석: #
3.3. 자료형
- String: ‘’
- y, yes, true: “y”
- 특수문자: “”
- integer: 123
- float: 소수점, 복소수
3.4. List
- [””, “”], name, image로도 표현 가능
3.5. Multi-line strings
- \n: 다음줄
3.6. Multi-document yaml
- 각 스펙으로 떨어져서 표기도 가능
3.7. VI Editor yaml 파일 생성
# VI Editor 진입
vi pod.yaml
# --Insert (들여쓰기 중요)
apiVersion: v1
# 종류
kind: Pod
metadata:
name: counter
spec: #스펙
containers:
- name: count
image: busybox
# 셸 프로그램
args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); slepp 1; done']
# 저장 확인
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); slepp 1; done']
# 다시확인
kubectrl apply -f pod.yaml
kubectl get pod
kubectl get pod -n kube-system #system 컨테이너 확인
kubectl get pod -A
kubectl get pod counter
# pod 자세한 내용 확인
kubectl describe pod counter
# 더 자세한 내용 확인, ip number
kubectl get pod -o wide
# pod 상태 감시, 모니터링
kubectl get pod -w > ctrl + C
# 로그 찍기
kubectl logs counter
# pod 접속 (counter: pod 이름)
kubectl exec -it counter /bin/sh (커맨드 역할)
# pod 삭제 (-f: 파일지정)
kubectl delete -f pod.yaml
# 위치 지정 ls로 확인하고, cd 위치/ 엔터
# kubectl get pod
> No resources found in default namespace.
4. Deployment
# - 반복적으로 나올 수 있을 때
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchlabels:
app: nginx
# 템플
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
~$ kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-2ndbc 1/1 Running 0 78s
nginx-deployment-66b6c48dd5-4ltkl 1/1 Running 0 78s
nginx-deployment-66b6c48dd5-r5drs 1/1 Running 0 78s
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 2m39s
# 서비스 pod 늘리고 싶을 때, 스케일 조정
abcde@labuser111ubuntu:~$ kubectl scale deployment/nginx-deployment --replicas=20
deployment.apps/nginx-deployment scaled
abcde@labuser111ubuntu:~$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/20 20 3 4m2s
# 다시 조정
:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-2ndbc 1/1 Running 0 5m45s
nginx-deployment-66b6c48dd5-2qd6v 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-4ltkl 1/1 Running 0 5m45s
nginx-deployment-66b6c48dd5-4r4mr 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-6p8vs 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-9msdk 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-cnw92 1/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-d5p4f 1/1 Running 0 107s
nginx-deployment-66b6c48dd5-flvtj 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-hd5x6 1/1 Running 0 107s
nginx-deployment-66b6c48dd5-j2bdj 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-ngv9p 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-pl6dc 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-pvt4z 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-qptqm 0/1 Terminating 0 107s
nginx-deployment-66b6c48dd5-r5drs 1/1 Running 0 5m45s
# 삭제, 모니터링 확인 필요
:~$ kubectl delete pod nginx-deployment-66d5-4ltkl
pod "nginx-deployment-66b6d5-4ltkl" deleted
# deployment 삭제하면 하위 pod 함께 삭제
kubectl delete deployment nginx-deployment
'Study' 카테고리의 다른 글
DP-900 대비 1. Azure SQL 데이터베이스 살펴보기 (0) | 2023.05.15 |
---|---|
Azure AI-900, DP-900 공부 (0) | 2023.05.15 |
[파이썬 기본 문법] 변수, 열거형 자료 구조 list, set, tuple, dict (0) | 2023.05.14 |
깃, 깃허브 차이, 비주얼 스튜디오 코드(VSCord) 깃허브(Github) 연결하기 (0) | 2023.05.11 |
2023-05-08. 딥러닝, 신경망, 신경망 데이터 표현, 텐서 (0) | 2023.05.09 |