사붐이개발일기

[Docker] 윈도우에서 도커 설치하기 본문

CI-CD/Docker

[Docker] 윈도우에서 도커 설치하기

sabeom 2023. 9. 22. 18:56
kubeadm join 192.168.32.10:6443 --token x1qogf.3i1d8zc267sm4gq8 \
--discovery-token-ca-cert-hash sha256:1965b56832292d3de10fc95f92b8391334d9404c914d407baa2b6cec1dbe5322

Virtualization Hypervisor - VirtualBox 

 

1. Vagrant + VirtualBox 이용한 가상화 구성

1.1 Vagrant download

vagrant hashicorp > download > windows > 인텔이면 I686, 암드면 AMD64로 다운로드 받기

Vagrant 란, 설정 스크립트를 기반으로 특정 환경의 가상머신을 생성
개발환경 궁유
Ruby로 개발되었으며 Linux, FreeBDS, OSX, Windows 지원

1-2. BirtualBox download

 

vagrant cloud 에서 os이미지 파일 다운로드

https://app.vagrantup.com/boxes/search

 

vagrant 명령어

3. vagrant os 설치방법

<CMD>
 
git에서 vagrant 디렉토리 클론해오기

C:\Work>git clone https://github.com/joneconsulting/vagrant.git

작업폴더생성

ex) C:\Work\vagrant

Vagrant VM 초기화

C:\Work\vagrant>vagrant init

 
VagrantFile 수정 (os는 vagrant cloud에서 가져와야한다.)

vagrant VM 실행
실행하기전 code에서 vagrantFile을 node1, node2를 주석 처리한다. (master node만 실행되어야 함)
작업디렉토리에 있는 vagrantFile을 찾아서 실행 시켜준다.

C:\work\vagrant\scripts>vagrant up

 
 
실행하다가 오류 발생할 경우 vagrantFile에서 인증서 검사를 하지 않도록 하는 옵션을 추가해주어야 에러 발생하지 않는다.

Error Code
// vagrantFile
...
Vagrant.configure(...) do |config|
    ...
    config.vm.box_download_insecure = true
    ...
end
...

Vagrant VM 확인

C:\Work\vagrant>vagrant status
    
        # 192.168.32.10 -> Kubernetes Master (CPU:2, MEM:2048M)
        # 192.168.32.11 -> Kubernetes Node1 (CPU:1, MEM:1024M)
        # 192.168.32.12 -> Kubernetes Node2 (CPU:1, MEM:1024M)

Vagrant 인스턴스 연결 (접속)

C:\Work\vagrant>vagrant ssh [Vagrant VM 이름] 
        ex) vagrant ssh k8s-master

SSH Client 설치 (운영체제에 맞게 다운로드)
Terminus - https://termius.com 
 
이제 모든 작업은 Termius에서 작성함
 
 
 

4. 사전 준비 - Master, Node 모두

<cmd>
cmd에서 Vagrant 접속 후 명령어 입력
sudo apt install net-tools           // 기본명령어 사용할수있도록 도와줌
ifconfig            // =ipconfig
 
<termius>
Root 계정 변경

sudo su -

Root Password 변경 (ex, vagrant로 변경)

passwd root
New password: vagrant
Retype new password: vagrant

SWAP 비활성화

swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

노드간 통신을 위한 Bridge 설정 (Iptables 커널 옵션 활성화)

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF>>  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

Hostname 변경(Vagrantfile에서 변경 됨), Hosts 파일 수정 --> 각 노드의 ipaddress에 맞게 수정, Hostname 변경하지 않으면 kubeadm join 시 오류 발생

vi /etc/hosts
// /etc/hosts 맨 아랫줄에 추가
192.168.32.10 k8s-master
192.168.32.11 k8s-node01
192.168.32.12 k8s-node02

// :wq!
ping k8s-master

 

5. Docker 설치, 실행 - Master, Node 모두

필수 패키지 설치

apt-get -y install ca-certificates curl gnupg net-tools

Docker GPG key 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Docker repostory 등록

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

Docker engine 설치

apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io

Docker 버전 확인

docker version

Docker 서비스 등록

systemctl enable docker
systemctl status docker

// status 입력했을때 !를 입력해야 종료 가능

Dockeradmin 유저 생성 (optional)

useradd dockeradmin
passwd dockeradmin 
# password --> dockeradmin
// docker 그룹에 dockeradmin 계정 추가
usermod -aG docker dockeradmin

 

6. Docker compose 설치

// docker-compose란, 여러개의 컨테이너를 관리하기 편리하게 사용할 수 있는 도구
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose -version

 
 
 

도커에서 nginx 이미지 다운받고 설치 후 실행하기


현재 가지고있는 docker 이미지 확인하기

docker images

 
 
프로세스가 아무것도 작동되고있지 않은지 확인하기

docker ps -a

 
docker에서 nginx 이미지 다운 명령어 확인하기
1. hub.docker.com 에서 nginx 검색
2. nginx 선택
3. nginx 이미지 다운 명령어 복사

https://hub.docker.com/

nginx 이미지 다운받기

docker pull nginx

nginx 이미지 설치

https://hub.docker.com/_/nginx
// docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
docker run --name mynginx -d -p 80:80 nginx

웹서버 확인

 
 

도커 프로세스 중지, 삭제 명령어


  • docker 이미지 확인
docker images
docker images
  • docker 실행 프로세스 확인
docker ps -a
docker ps -a
  • docker 실행중인 프로세스 중지
docker stop mynginx
  • docker 프로세스 삭제 (중지시켜도 프로세스는 살아있음)
docker rm mynginx
  • docker 프로세스 실행
docker start mynginx

 
 
 
 
 

7. Kubernetes 설치 - Master, Node 모두

  • kubeadm, kubelet, kubectl 설치 및 활성화
apt-get install -y apt-transport-https ca-certificates curl
  • Key 추가 및 apt udpate
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
  • 최신 버전 설치 (2023-06-07 기준 1.27 버전)
apt-get install -y kubelet kubeadm kubectl
  • 버전 확인
kubeadm version
kubelet --version
kubectl version
  • 최신 버전 업데이트 방지
apt-mark hold kubelet kubeadm kubectl
  • K8s 1.22부터는 systemd와 cgroup을 맞추는 작업 필요
sudo mkdir /etc/docker
// 이미 생성되어 있을 수 있음 -> 넘어가기
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  • containerd 및 kubeadm 최신 업데이트
rm /etc/containerd/config.toml
systemctl restart containerd
kubeadm config images pull

 
 
 

8. Kubernetes 설정 - Master

  • 초기화 (apiserver-advertise-address는 Master ipaddress -> 192.168.32.10)
kubeadm reset
kubeadm init --pod-network-cidr=10.96.0.0/16 --apiserver-advertise-address=192.168.32.10
  • Kubeadm 실행 후 생성 된 아래 명령어를 복사해 놓고, Worker Node에서 실행 (생성되는 IP, Token 값은 본인의 환경에 따라 다름)
kubeadm join 192.168.32.10:6443 --token x1qogf.3i1d8zc267sm4gq8 \
--discovery-token-ca-cert-hash sha256:1965b56832292d3de10fc95f92b8391334d9404c914d407baa2b6cec1dbe5322
  • kubectl을 root 계정없이 실행 (반드시 실행)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • Network add-on - Calico 기본 설치 (Kubernetes Cluster Networking plugin, 2023-06-07 기준 3.25버전)
curl https://docs.projectcalico.org/archive/v3.25/manifests/calico.yaml -O --insecure
kubectl apply -f calico.yaml
kubectl get pods --all-namespaces

 
 

9. Kubernetes 노드 연결 - Node

  • 연결 (Master의 init 작업에서 복사 한 커맨드를 사용)
kubeadm join 192.168.32.10:6443 --token x1qogf.3i1d8zc267sm4gq8 \
--discovery-token-ca-cert-hash sha256:1965b56832292d3de10fc95f92b8391334d9404c914d407baa2b6cec1dbe5322
  • 연결 시 오류 발생하면 kubeadm reset 명령어로 초기화 후 다시 실행 (Node 모두 초기화)
kubeadm reset
  • 확인 (Master에서)
kubectl get nodes

 
 
 
 
 

10. 테스트

  • Pod 실행
kubectl run nginx-test --image=nginx --port 80
  • Service 실행
kubectl expose pod nginx-test 
kubectl get services
  • Service Type 변경
kubectl edit service nginx-test # (ClusterIp -> NodePort)
  • 확인 (port는 service에서 forwarding 된 port 사용)
http://192.168.32.10:30039/ # (<- port forwarding)
http://192.168.32.11:30039/ # (<- port forwarding)

 
 

VM환경에 Docker Engine 설치

 
 

Kubenetes Cluster 구축