3. Namespace 생성, LimitRange 를 이용한 자원 사용량 제한, POD 및 Deployment 생성, 자원 제한 확인

반응형

3. Namespace 생성, LimitRange 를 이용한 자원 사용량 제한, POD 및 Deployment 생성, 자원 제한 확인

 

1) Namespace 생성

 

test-ns 라는 이름의 네임스페이스를 만듭니다.

# kubectl create ns test-ns

 

생성된 네임스페이스를 확인합니다.

# kubectl get ns
NAME               STATUS   AGE
calico-apiserver   Active   19h
calico-system      Active   19h
default            Active   20h
kube-node-lease    Active   20h
kube-public        Active   20h
kube-system        Active   20h
test-ns            Active   2s
tigera-operator    Active   19h

 

2) LimitRange 설정

 

네임스페이스에 LimitRange 설정을 하기 위해 yaml 파일을 생성합니다.

# vi test-limitrange.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: test-limitrange
spec:
  limits:
  - default:  # 기본 제한값 (생략 가능)
      cpu: 1
      memory: 1Gi
    defaultRequest:  # 요청 제한 값 (생략 가능)
      cpu: 1
      memory: 1Gi
    max:  # 최대값 (생략 가능)
      cpu: 1
      memory: 1Gi
    min:  # 최소값 (생략 가능)
      cpu: 1
      memory: 500Mi
    type: Container

 

test-ns 네임스페이스에 적용 합니다.

# kubectl apply -f test-limitrange.yaml -n test-ns
limitrange/test-limitrange created

 

모든 네임스페이스에 설정된 LimitRange 목록을 확인 할 수 있습니다.

# kubectl get limitrange -n test-ns  // 네임스페이스 지정하여 보기

# kubectl get limitrange --all-namespaces                       // 네임스페이스 전체 보기
NAMESPACE        NAME              CREATED AT
test-ns                 test-limitrange   2022-12-29T02:08:54Z

 

자세한 LimitRange 정보를 보고 싶을땐 아래와 같이 실행합니다.

# kubectl get limitrange test-limitrange --output=yaml -n test-ns

 

3) POD 생성

 

httpd 이미지를 이용해 POD 를 생성합니다.

기존에 httpd 이미지를 받지 못하였을 경우 crictl 명령을 이용해 다운로드 합니다.

# crictl pull httpd

Image is up to date for docker.io/library/httpd@sha256:753edbf6bf19a74c580c57f7d98e05b6b34073adc929234da6eb193a8029ab91

 

POD 을 생성하기 위한 환경 파일을 만듭니다.

# vi test-httpd.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-httpd
spec:
  containers:
  - name: test-container
    image: httpd

 

test-ns 네임스페이스 POD 를 생성 합니다.  // yaml 파일을 이용해 POD 를 생성하는 방법

# kubectl apply -f test-httpd.yaml -n test-ns

pod/test-httpd created

 

생성된 POD 정보를 자세히 보고싶을 경우 아래와 같이 실행합니다.

# kubectl get pods test-httpd --output=yaml -n test-ns

 

* 참고

POD 를 생성 한 뒤 Namespace 에 LimitRange 를 적용할 경우 기존의 POD 에는 LimitRange 가 반영되지 않습니다.

 

* 참고 : 네임스페이스를 삭제하면 해당 Namespace 와 쿠버네티스 오브젝트들이 삭제되고, 할당되있던 리소스들이 자동으로 해제됩니다.

# kubectl delete ns test-ns
namespace "test-ns" deleted

 

4) Deployment 생성

 

한개의 httpd 컨테이너를 더 만들어 봅니다.

원래는 POD 생성후 Deployment 생성이 순서이지만 Deployment 생성시 POD 이 없다면 자동 생성됩니다.

우선 CRI-O 명령을 이용해 이미지를 다운로드 합니다.

 

httpd 이미지를 이용해 deployment 를 생성 합니다.  // 명령줄에서 POD를 생성, 배포하는 방법

                                                                                // POD 없이 deployment 하면 POD 자동 생성 후 배포가 됩니다.

자원 사용에 제한을 주기 위해 test-ns 라는 네임스페이스 안에 생성합니다.

# kubectl create deployment test-httpd2 --image httpd -n test-ns
deployment.apps/test-httpd2 created

 

test-ns 네임스페이스 내 POD 현황입니다.

생성된 POD 는 두 개가 보입니다.

# kubectl get pods -n test-ns
NAME                           READY   STATUS    RESTARTS   AGE
test-httpd                       1/1     Running   0          12m
test-httpd2-7c7c8bd5d-x4jl5       1/1    Running   0          3m55s  // 자동 생성이라 이름에 난수값이 들어감

 

test-ns 네임스페이스 내 배포 현황입니다.

배포된 컨테이너는 한 개라서 test-httpd2 만 보입니다.

# kubectl get deployments -n test-ns
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
test-httpd2        1/1     1            1           45s

 

5) LimitRange 적용 확인 (부하 테스트)

 

이제 httpd 컨테이너 쉘에 접근하여 부하를 주면, control 노드에서 확인되는 부하는

위에서 제한한 LimitRange 한도로 제한되는것을 확인 할 수 있습니다.

# kubectl exec -it test-httpd -n test-ns -- bash    // httpd 컨테이너 쉘 접근

# apt -y update

# apt install stress    // 부하 테스트 패키지 설치 후

# cat /proc/cpuinfo |grep processor |wc -l    // 서버의 코어수 확인

# stress -c 2    // CPU 부하 시작

 

다른 터미널 창을 띄워 control-node 에서 컨테이너별 자원 사용량 체크 툴을 설치합니다.

# git clone https://github.com/kodekloudhub/kubernetes-metrics-server.git
# cd kubernetes-metrics-server
# kubectl create -f .

 

# kubectl top pod -n test-ns
NAME                           CPU(cores)   MEMORY(bytes)   
test-httpd                     1000m        24Mi    // 1000m 은 1core 를 의미합니다.
test-httpd2-7c7c8bd5d-x4jl5   1m           0Mi             

 

컨테이너에서 stress 테스트를 중지했을때

# kubectl top pod -n test-ns
NAME                           CPU(cores)   MEMORY(bytes)   
test-httpd                     1m           23Mi            
test-httpd2-7c7c8bd5d-x4jl5   1m           0Mi  

 

참고로 노드별 자원 사용량도 확인이 가능합니다.

# kubectl top node -n test-ns
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
control-node   85m          4%     1759Mi          46%       
work-node-1    27m          1%     1200Mi          31%       
work-node-2    39m          1%     1273Mi          33%     

 

반응형

댓글()

2. CRI-O 와 Kubernetes 를 활용한 httpd 배포

반응형

2. CRI-O 와 Kubernetes 를 활용한 httpd 배포

 

1) httpd 설치

 

(control 노드에서)

httpd 이미지를 배포합니다.

# kubectl create deployment httpd --image=httpd
deployment.apps/httpd created

 

배포 명령 이후 진행상태가 이벤트 로그에 기록되므로 아래와 같이 출력해 볼 수 있습니다.

# kubectl get events |grep httpd
70s         Normal   Scheduled           pod/httpd-975f8444c-5xfch     Successfully assigned default/httpd-975f8444c-5xfch to sysdocu-189114
70s         Normal   Pulling             pod/httpd-975f8444c-5xfch     Pulling image "httpd"
58s         Normal   Pulled              pod/httpd-975f8444c-5xfch     Successfully pulled image "httpd" in 11.734922345s (11.734929076s including waiting)
58s         Normal   Created             pod/httpd-975f8444c-5xfch     Created container httpd
58s         Normal   Started             pod/httpd-975f8444c-5xfch     Started container httpd
70s         Normal   SuccessfulCreate    replicaset/httpd-975f8444c    Created pod: httpd-975f8444c-5xfch
70s         Normal   ScalingReplicaSet   deployment/httpd              Scaled up replica set httpd-975f8444c to 1

 

httpd 배포 정보를 확인합니다.

# kubectl describe deployment httpd

 

2) yaml 파일 생성 및 배포

 

httpd 리소스 템플릿 파일을 생성합니다.

# kubectl get deployment httpd -o yaml > httpd.yaml

 

생성된 httpd.yaml 파일을 열어 포트를 추가합니다.

# vi httpd.yaml

...
    spec:
      containers:
      - image: httpd
        imagePullPolicy: Always
        name: httpd
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
...

 

수정된 yml 파일을 기본 httpd 템플릿으로 갱신 (over write) 합니다.

# kubectl replace -f httpd.yaml

deployment.apps/httpd replaced

 

갱신 시간으로 이미지 업데이트 내역을 확인 할 수 있습니다.

# kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
httpd   1/1     1            1           11m

 

# kubectl expose deployment/httpd
service/httpd exposed

 

클러스터 httpd 서비스 IP 를 출력합니다.

# kubectl get svc httpd
NAME    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
httpd   ClusterIP   10.99.72.96   <none>        80/TCP    5m24s

 

출력된 클러스터 IP 로 httpd 접근 확인이 가능합니다.

# curl 10.99.72.96:80
<html><body><h1>It works!</h1></body></html>

엔드포인트 httpd 서비스 IP 출력합니다.

# kubectl get ep httpd
NAME    ENDPOINTS         AGE
httpd   10.101.0.195:80   5m51s

 

출력된 엔드포인트 IP 로 httpd 접근 확인이 가능합니다.

# curl 10.101.0.195:80

<html><body><h1>It works!</h1></body></html>

 

3) httpd 스케일 아웃 (Replica)

 

httpd 의 replica 를 3으로 조정하면 3개의 POD 가 생성된 것을 확인 할 수 있습니다.

# kubectl scale deployment httpd --replicas=3
deployment.apps/httpd scaled

 

복제되는 과정에서 시간이 약간 걸리며 watch 명령으로 모니터링을 해보면 아래와 같이 Ready 와 AVAILABLE 값이 3까지 늘어나는 것이 보입니다.

# watch kubectl get deployment httpd
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
httpd   3/3     3            3           15h

 

엔드포인트도 POD 개수대로 늘어난 것을 확인할 수 있습니다.

# kubectl get ep httpd
NAME    ENDPOINTS                                        AGE
httpd   10.101.0.129:80,10.101.0.195:80,10.101.0.67:80   41m

 

이제는 POD 를 삭제해도 replica 개수 3 으로 유지 (자동 생성) 됩니다.

클러스터 IP 로 접근을 해보면 3개의 POD 로 분산되어 접근되는 것을 확인할 수 있습니다.

 

4) 클러스터 외부에서 접근 허용 설정

 

현재의 POD 정보 입니다.

# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
httpd-56b65865c4-74zxp   1/1     Running   0          15h
httpd-56b65865c4-b8phd   1/1     Running   0          10m
httpd-56b65865c4-dkjdc   1/1     Running   0          10m

 

NAME 값을 이용하여 POD 의 환경 설정값을 확인합니다.

# kubectl exec httpd-56b65865c4-74zxp -- printenv |grep KUBERNETES
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443

 

현재의 서비스 정보 입니다.

# kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
httpd        ClusterIP   10.99.72.96   <none>        80/TCP    51m
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   18h

 

외부에서 접근이 가능하도록 svc 값을 삭제하고 LoadBalancer 형태로 다시 생성해 줍니다.

# kubectl delete svc httpd
service "httpd" deleted


# kubectl expose deployment httpd --type=LoadBalancer
service/httpd exposed

 

다시 svc 정보를 출력해보면 httpd 가 LoadBalancer 형태로 생성되었으며, EXTERNAL-IP 는 없는 상태입니다.

# kubectl get svc
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
httpd        LoadBalancer   10.96.23.114   <pending>     80:31452/TCP   2m29s
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP        18h

 

웹브라우저를 통해 새로 생성된 포트로 접근을 해보면 httpd 초기 페이지가 출력되며, 3개의 POD 로 분산 접근이 됩니다.

http://<서버 공인 IP>:31452

 

[참조] https://blog.psnote.co.kr/184

 

 

반응형

댓글()

1. Ubuntu 22.04 에서 CRI-O, Kubernetes 1.26, Calico 설치하기

반응형

Kubernetes 는 컨테이너의 생성, 배포, 실행을 하는 등 컨테이너를 관리하는 오픈소스 플랫폼 입니다.

여기에서는 Ubuntu 22.04 버전의 서버 3대로 (master 노드 1대 / worker 노드 2대) Kubernetes 를 구성하는 방법에 대해 설명합니다.

 

 

1. CRI-O 설치

 

CRI-O 공식 홈페이지 : https://cri-o.io

 

설치에 앞서 사용하고자 하는 호스트네임을 적용 합니다.

# hostnamectl set-hostname master      // master 노드에서

# hostnamectl set-hostname worker1    // worker1 노드에서

# hostnamectl set-hostname worker2    // worker2 노드에서

 

(모든 노드에서)

# vi /etc/hosts

127.0.0.1 localhost
10.101.0.5 master
10.101.0.10 worker1
10.101.0.12 worker2

 

운영 할 Kubernetes 버전이 1.26인 경우 CRI-O 버전 1.26을 설치해야 합니다.

# OS=xUbuntu_22.04
# VERSION=1.26

 

# echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
# echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

# curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | apt-key add -
# curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add -

# apt -y update

# apt -y upgrade  // 업그레이드 완료 후 최신 커널로 사용하고자 할 경우 reboot 을 진행합니다.

# apt -y install cri-o cri-o-runc cri-tools

 

CRI-O 를 실행하고 버전을 확인합니다.

# systemctl enable --now crio

# crio --version

crio version 1.26.4
Version:        1.26.4
GitCommit:      unknown
GitCommitDate:  unknown
GitTreeState:   clean
BuildDate:      2023-08-17T06:08:14Z
GoVersion:      go1.19
Compiler:       gc
Platform:       linux/amd64
Linkmode:       dynamic

...

 

2. Kubernetes 설치

 

Kubernetes 공식 홈페이지 : https://kubernetes.io

 

설치 전, 쿠버네티스 (kubelet) 사용을 위해 SWAP 을 반드시 비활성화 시켜줍니다.

# swapoff -a

# cat /etc/fstab

fstab 에서도 swap 파티션이 존재한다면 주석처리하여 비활성화 시킵니다.

 

1) kubeadm, kubelet 및 kubectl 설치

다음 패키지들을 설치합니다.
- kubeadm : 클러스터를 부트스트랩하는 명령
- kubelet : 클러스터의 모든 노드에서 실행되는 POD와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트
- kubectl : 클러스터와 통신하기 위한 CLI 유틸리티

 

(모든 노드에서)

# apt -y install apt-transport-https ca-certificates
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
# echo "deb https://apt.kubernetes.io/ " >> ~/kubernetes.list
# mv ~/kubernetes.list /etc/apt/sources.list.d
# apt-y update
# VERSION="1.26.0-00"
# apt -y install kubelet=$VERSION kubeadm=$VERSION kubectl=$VERSION kubernetes-cni

 

쿠버네티스는 버전이 중요하므로 패키지가 자동으로 설치, 업그레이드 또는 제거되지 않도록 고정 시킵니다.

# apt-mark hold kubelet kubeadm kubectl

kubelet set on hold.
kubeadm set on hold.
kubectl set on hold.

 

2) 쿠버네티스 필수 환경 구성

(모든 노드에서)

쿠버네티스 운영을 위해 필요한 필수 요소들을 설치하고 구성합니다.

필요한 모듈을 로드하고 부팅시에도 자동 적용되도록 합니다.
# modprobe overlay
# modprobe br_netfilter

# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

 

IPv4 를 포워딩하여 iptables 가 브릿지된 트래픽을 보게 합니다.

sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지됩니다.
# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

재부팅하지 않고 sysctl 파라미터를 적용합니다.
# sysctl --system

3) cgroup 드라이버 설정
(모든 노드에서)
CRI-O는 기본적으로 systemd 라는 cgroup 드라이버를 사용합니다. 
# cat <<EOF | sudo tee /etc/crio/crio.conf.d/02-cgroup-manager.conf
[crio.runtime]
conmon_cgroup = "pod"
cgroup_manager = "systemd"
EOF

 

4) master 서버 초기화 및 노드 연결

(master 노드에서)

서버간 통신할 사설 네트워크 대역을 설정합니다.

쿠버네티스 구성에 필요한 이미지를 다운로드 받아야 하므로 이 단계에서 시간이 약간 소요됩니다.

# kubeadm init --pod-network-cidr=10.101.0.0/24

 

아래는 쿠버네티스 컨트롤 플레인이 성공적으로 초기화 되었을때 출력하는 메세지 입니다.

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.101.0.5:6443 --token fayi8m.4qus4e8y3cnon9nc \
--discovery-token-ca-cert-hash sha256:b5693e9d1a3fd79b64e790d5218369ef9449b211c0c30eef88e6376887ad774b 

 

위에 나와있는 안내 대로 추가 명령을 실행합니다.

클러스터 사용을 시작하려면 일반 사용자로 다음을 실행해야 합니다.

 

(master 노드에서)
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config

또는 root 사용자인 경우 다음을 실행할 수 있습니다.
# export KUBECONFIG=/etc/kubernetes/admin.conf

 

앞으로 SSH 접속시마다 자동으로 환경이 로드 되도록 하면 편리합니다.

# echo 'export KUBECONFIG="/etc/kubernetes/admin.conf"' >> ~/.bashrc

 

master 노드에서 확인 가능한 노드 상태를 출력합니다.

STATUS 에서 NotReady 로 표시되지만, 아래에서 별도 작업을 통해 Ready 로 변경할 예정입니다.

# kubectl get nodes
NAME           STATUS     ROLES           AGE     VERSION
master             NotReady   control-plane   4m57s   v1.26.0

 

worker 노드에서는 아래와 같이 master 서버에 join (가입) 합니다.

token 과 hash 값은 쿠버네티스 컨트롤 플레인이 초기화 되었을때 출력된 값으로 합니다.

 

(worker 노드에서)

# kubeadm join 10.101.0.5:6443 --token fayi8m.4qus4e8y3cnon9nc \
--discovery-token-ca-cert-hash sha256:b5693e9d1a3fd79b64e790d5218369ef9449b211c0c30eef88e6376887ad774b

 

다시 master 노드에서 확인 가능한 노드 상태를 출력하면 가입된 worker 노드 리스트까지 확인이 됩니다.

(master 노드에서)

# kubectl get node
NAME           STATUS     ROLES           AGE    VERSION
master             NotReady   control-plane   8m1s   v1.26.0
worker1           NotReady   <none>          18s    v1.26.0
worker2           NotReady   <none>          16s    v1.26.0

 

 

3. Calico 설치하기

 

Project Calico 는 Kubernetes에 대한 네트워크 정책 엔진입니다.
Calico 네트워크 정책 집행을 통해 네트워크 세분화 및 테넌트 격리를 구현할 수 있습니다.

Calico 공식 홈페이지 : https://www.tigera.io/project-calico

 

1) Calico 설치하기

(master 노드에서)

Tigera Calico 연산자 및 사용자 지정 리소스 정의를 설치합니다.
# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/tigera-operator.yaml

필요한 커스텀 리소스를 생성하여 Calico를 설치합니다.

배포하는 yaml 파일에서 CIDR 정보를 자신이 사용하는 네트워크 정보로 수정하고 생성합니다.

# wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/custom-resources.yaml

# sed -i 's/192.168.0.0\/16/10.101.0.0\/24/' custom-resources.yaml 

# kubectl create -f custom-resources.yaml

다음 명령을 사용하여 모든 POD가 실행 중인지 확인합니다.

이 부분에서 모든 STATUS 값이 Running 이 되기까지 약간의 시간이 소요됩니다.

# watch kubectl get pods -n calico-system

NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-67df98bdc8-kdt6m   1/1     Running   0          83s
calico-node-hp78g                          1/1     Running   0          83s
calico-node-ntfq4                          1/1     Running   0          83s
calico-node-rwm2s                          1/1     Running   0          83s
calico-typha-7f4f4655f7-6psfv              1/1     Running   0          76s
calico-typha-7f4f4655f7-t7ccr              1/1     Running   0          83s

 

master 노드에서 POD 를 스케쥴링 할 수 있도록 모든 노드의 taint 를 제거 합니다.

우선 taint 상태를 확인하면 아래와 같이 출력되는데,

이 룰을 없애줘야 kubectl get node 명령으로 출력된 NotReady 상태가 Ready 상태로 변경됩니다.

# kubectl describe nodes |grep -i taint
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
Taints:             <none>
Taints:             <none>

 

룰 뒤에 - 를 붙이면 제거됩니다.

# kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-

 

taint 상태를 다시 확인합니다.

# kubectl describe nodes |grep -i taint

Taints:             <none>
Taints:             <none>
Taints:             <none>

 

이제 모든 노드의 상태가 Ready 로 돌아왔습니다.
# kubectl get nodes
NAME            STATUS   ROLES           AGE   VERSION
master                Ready    control-plane   36m   v1.26.0
worker1              Ready              14m   v1.26.0
worker2              Ready              12m   v1.26.0

 

* 참고

worker 노드는 사용 설정에 따라 <none> 이 아닐 경우 NoSchedule 이나 NoExecute 가 있을 수 있는데

제거해야하는 상황에 명령어가 수행되지 않는다면 아래와 같이 worker 노드에서 생성되었던 파일 2개 삭제 및 kubelet 데몬 중지 후 다시 join 을 하면 해결됩니다.

(해당 worker 노드에서)

# rm -f /etc/kubernetes/kubelet.conf
# rm -f /etc/kubernetes/pki/ca.crt 
# systemctl stop kubelet

# kubeadm join 10.101.0.5:6443 --token fayi8m.4qus4e8y3cnon9nc \
--discovery-token-ca-cert-hash sha256:b5693e9d1a3fd79b64e790d5218369ef9449b211c0c30eef88e6376887ad774b

 

반응형

댓글()

6. Docker PHPMyAdmin 설치

반응형

6. Docker PHPMyAdmin 설치

 

1) 설치 및 설정

 

접속할 MySQL 이 설치되어 있다는 가정하에 진행합니다. (Docker MySQL 설치)

최신버전의 PHPMyAdmin 이미지를 다운로드 받습니다.

# docker pull phpmyadmin:latest

 

phpmyadmin 컨테이너 환경 설정을 합니다.

# vi docker-compose.yml

...
    phpmyadmin:
        image: phpmyadmin:latest
        container_name: phpmyadmin
        restart: unless-stopped
        ports:
            - "8080:80"
        environment:
            PMA_ARBITRARY: 1

 

phpmyadmin 컨테이너를 가동 합니다.

# docker compose up -d phpmyadmin

 

2) PHPMyAdmin 페이지 접근 및 설정

 

웹브라우저로 관리 페이지에 접근합니다.

예) http://sysdocu.tistory.com:8080

 

입력란은 아래의 데이터로 입력 합니다.

서버 : mysql          // mysql 컨테이너 이름

사용자명 : root       // mysql 계정 이름

암호 : 12345678    // mysql 계정 패스워드

* mysql 컨테이너 입장에서는 로컬 접근이 아닌, 원격 접근 (호스트 서버 또는 다른 컨테이너) 이므로 접근권한이 없다면 추가해줘야 합니다.

 

 

 

반응형

댓글()

[TIP] Docker 룰이 포함된 iptables 룰 저장 및 복구

리눅스/DNS|2022. 12. 22. 16:53
반응형

[TIP] Docker 룰이 포함된 iptables 룰 저장 및 복구

 

iptables 기본 룰에서 docker 컨테이너등을 실행하면 컨테이너가 사용하는 포트의 연결을 위해

자동으로 iptables 룰이 추가됩니다.

하지만 iptables 룰을 잘못 수정하였다가 컨테이너 서비스가 먹통 되는 일이 생기는데 이를 방지하기 위해

iptables 룰을 주기적으로 저장해 두어야 합니다.

 

-----------------------------------

# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0           
DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (2 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            192.168.96.2         tcp dpt:3306
ACCEPT     tcp  --  0.0.0.0/0            192.168.96.3         tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            192.168.96.4         tcp dpt:9000
ACCEPT     tcp  --  0.0.0.0/0            192.168.96.3         tcp dpt:80

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

-----------------------------------

 

현재 iptables 룰 저장

# iptables-save > iptables_20221222.rules

 

백업한 iptables 룰 복원

# iptables-restore < iptables_20221222.rules

 

혹시 백업해둔 룰이 없을땐 서비스 중지를 감수하고 docker 를 재시작 하면 컨테이너가 구동되면서 iptables 룰이 재구성 됩니다.

# systemctl restart docker

 

반응형

댓글()

5. Docker 이미지 생성 (컨테이너 현재 상태 저장)

반응형

5. Docker 이미지 생성 (컨테이너 현재 상태 저장)

 

php 컨테이너의 경우 라이브러리 등을 추가 설치하고 docker compose down 및 up -d 명령을 사용하여 컨테이너를 재가동 하면

컨테이너에 설치한 라이브러리 파일이 초기화 되어져 다시 라이브러리를 설치하고 php 컨테이너를 재시작 해주어야 합니다.

이런 번거로움을 줄이기 위해서 라이브러리 설치 후 아래와 같이 컨테이너의 마지막 상태를 이미지로 저장할 수 있습니다.

 

실행중인 php 컨테이너를 중지합니다.

# docker compose stop php

중지한 php 컨테이너의 ID 를 확인 합니다.

# docker ps -a |grep php |awk {'print $1'}
891757604a66

중지한 컨테이너 ID 값을 이용하여 새로운 이미지를 만듭니다.

# docker commit 891757604a66 php:8.2.0-fpm_update1
sha256:1e7354a1a3030c6cf7e842f200bb3c9319e99fc700f68f8b363410b5a8e48c64

 

생성된 이미지 리스트를 확인합니다.

# docker images
REPOSITORY   TAG                 IMAGE ID       CREATED          SIZE
php          8.2.0-fpm_update1   1e7354a1a303   11 minutes ago   450MB
php          8.2.0-fpm           51dbab2b7efc   13 days ago      450MB
mysql        8.0.31              7484689f290f   2 weeks ago      538MB
httpd        2.4.54              157dcdf23d6c   2 weeks ago      145MB


다음 php 컨테이너를 생성할때 새로운 이미지 기반으로 생성하도록 합니다.

# vi docker-compose.yml

...
    php:
        image: php:8.2.0-fpm_update1
...


이제 php 컨테이너를 삭제 해도 이미지 기반으로 생성 및 구동할때, 이미 이전에 설치한 라이브러리가 있는것을 확인 할 수 있습니다.

 

반응형

댓글()

4. Docker PHP 환경 설정 및 MySQL 연동, 기타 라이브러리 활성화

반응형

4. Docker PHP 환경 설정하기 (php.ini)

 

1) PHP 환경 설정 방법

 

php 컨테이너 내의 설정 파일 (php.ini) 를 호스트 서버로 복사하고 호스트 서버의 php.ini 파일을 사용하도록 해야 합니다.

컨테이너가 구동중인 상태에서 아래와 같이 파일을 복사 합니다.

 

php 컨테이너의 /usr/local/etc/php/php.ini-development 파일을 /home/sysdocu/php/conf/ 디렉토리 아래에 php.ini 이름으로 복사.

# mkdir -p /home/sysdocu/php/conf

# docker cp php:/usr/local/etc/php/php.ini-development /home/sysdocu/php/conf/php.ini

 

기본적으로 소스내 PHP 태그없이도 코드 인식이 가능하도록하고 한국 표준시를 출력하도록 설정합니다.

# vi /home/sysdocu/php/conf/php.ini

short_open_tag = On
date.timezone = "Asia/Seoul"

 

호스트 서버에서 php.ini 파일을 사용할 수 있도록 docker-compose.yml 파일을 수정합니다.

# vi docker-compose.yml

...
    php:
        image: php:8.2.0-fpm
        container_name: php
        restart: unless-stopped
        ports:
            - "9000:9000"
        volumes:
            - /home/sysdocu/httpd/html:/var/www/html
            - /home/sysdocu/php/conf/php.ini:/usr/local/etc/php/php.ini
        command:
            - /bin/sh
            - -c
            - |
              echo "security.limit_extensions = .html .htm .php" >> /usr/local/etc/php-fpm.d/www.conf
              php-fpm

...

 

변경된 컨테이너를 적용합니다.

# docker compose stop php
# docker rm -v php
# docker compose up -d php

 

2) mysql 연동 및 테스트

 

php 컨테이너에서 docker-php-ext-install 명령을 이용해 필요한 라이브러리를 설치해줍니다. (mysqli.so 파일 생성)

# docker exec -it php /bin/bash

root@8e2d3bf1c94f:/var/www/html# docker-php-ext-install mysqli

 

호스트 서버에서 설정 파일을 열고 아래 행을 주석 해제 합니다.

# vi /home/sysdocu/php/conf/php.ini

extension=mysqli

 

변경 사항을 적용합니다.

# docker compose restart php

 

웹 소스를 수정하여 MySQL 연동이 잘 되는지 테스트 해봅니다.

아래 소스 코드를 이용하여 작성한 뒤 웹브라우저에서 접근하면 확인이 가능합니다.

 

# vi /home/sysdocu/httpd/html/index.html

MySQL Connect TEST<br>
<?
$conn = mysqli_connect("mysql", "sysdocu", "12345678", "sysdocudb"); # 여기에서 mysql 은 컨테이너 이름

if ($conn) {
    echo "MySQL 연결 성공";
} else {
    echo "MySQL 연결 실패";
}

$result = mysqli_query($conn, "SELECT VERSION() AS VERSION");
$data = mysqli_fetch_assoc($result);
echo "<br>Version : " . $data['VERSION'];
?>

 

3) 기타 라이브러리 활성화

 

주로 사용하는 curl, gd, mbstring, openssl 라이브러리를 활성해 보겠습니다.

(사실 gd 만 추가 설치, 나머지는 재설치 과정)

mysqli 설치하는 방법과 같이 컨테이너에 접근하여 라이브러리를 설치하면 되지만,

그냥 설치 명령을 내리면 컨테이너에 필요한 패키지가 없다며 에러가 출력되므로

사전에 필요한 패키지를 설치하고 라이브러리 설치를 진행합니다.

# docker exec -it php /bin/bash

 

제일 먼저 리포지토리를 정리해야 패키지 설치가 잘 되므로 업데이트를 해줍니다.

root@8e2d3bf1c94f:/var/www/html# apt -y update

 

(curl 라이브러리 설치)

root@8e2d3bf1c94f:/var/www/html# apt -y install libcurl4-openssl-dev

root@8e2d3bf1c94f:/var/www/html# docker-php-ext-install curl

 

(gd 라이브러리 설치)

root@8e2d3bf1c94f:/var/www/html# apt -y install zlib1g-dev libpng-dev

root@8e2d3bf1c94f:/var/www/html# docker-php-ext-install gd

gd 는 기본 허용 모듈에서 빠져 있기 때문에 사용을 위해 아래와 같이 추가 구성해줍니다.

root@8e2d3bf1c94f:/var/www/html# docker-php-ext-configure --with-gd

 

(mbstring 라이브러리 설치)

root@8e2d3bf1c94f:/var/www/html# apt -y install libonig-dev

root@8e2d3bf1c94f:/var/www/html# docker-php-ext-install mbstring

 

(openssl 라이브러리 설치)

root@8e2d3bf1c94f:/var/www/html# cd /usr/src/php/ext/openssl
root@233900ce6ef9:/usr/src/php/ext/openssl# cp config0.m4 config.m4
root@233900ce6ef9:/usr/src/php/ext/openssl# phpize
root@233900ce6ef9:/usr/src/php/ext/openssl# # apt -y install libssl-dev
root@233900ce6ef9:/usr/src/php/ext/openssl# docker-php-ext-install openssl

 

라이브러리 설치 완료 후 php 컨테이너를 재시작 하면 phpinfo 화면에서 설치한 모듈이 보여지게 됩니다.

# docker compose restart php

# docker exec php php -i |grep -i gd

 

반응형

댓글()

3. Docker MySQL 환경 설정 및 DB, 사용자 계정 생성

반응형

3. Docker MySQL 환경 설정 및 DB, 사용자 계정 생성

 

1) MySQL 환경 설정 방법

 

MySQL 컨테이너 내의 data 디렉토리와 my.cnf 설정 파일을 호스트 서버로 복사해오면 데이터 및 설정 관리가 수월해 집니다.

컨테이너가 구동중인 상태에서 아래와 같이 파일을 복사 합니다.

 

mysql 컨테이너의 /var/lib/mysql 디렉토리를 /home/sysdocu/mysql/data 디렉토리로 복사

# mkdir /home/sysdocu/mysql
# docker cp mysql:/var/lib/mysql/ /home/sysdocu/mysql/

# mv /home/sysdocu/mysql/mysql /home/sysdocu/mysql/data

 

mysql 컨테이너의 my.cnf 파일을 /home/sysdocu/mysql/conf/my.cnf 로 복사

# mkdir /home/sysdocu/mysql/conf
# docker cp mysql:/etc/my.cnf /home/sysdocu/mysql/conf/my.cnf

 

호스트 서버에서 변경사항을 적용할 수 있도록 docker-compose.yml 파일을 수정합니다.

# vi docker-compose.yml

...
    mysql:
        image: mysql:8.0.31
        container_name: mysql
        restart: unless-stopped
        tty: true
        ports:
            - "3306:3306"
        environment:
            MYSQL_HOST: localhost
            MYSQL_ROOT_PASSWORD: 12345678 # 초기 mysql root 비밀번호
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
            TZ: Asia/Seoul
        volumes:
            - /home/sysdocu/mysql/data/:/var/lib/mysql/
            - /home/sysdocu/mysql/conf/my.cnf:/etc/my.cnf
...

 

변경된 컨테이너를 적용합니다.

# docker compose stop mysql
# docker rm -v mysql
# docker compose up -d mysql

 

my.cnf 변경사항이 잘 적용되는지 확인해 봅니다.

# vi /home/sysdocu/mysql/conf/my.cnf

[mysqld]
max_connections = 10000

 

# docker compose restart mysql

 

MySQL 에 접근하여 변경된 값을 확인합니다.

# docker exec -it mysql /bin/bash
bash-4.4# mysql -u root -p
Enter password: (docker-compose.yml 에서 설정한 root 비밀번호 입력)

 

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 10000 |
+-----------------+-------+
1 row in set (0.00 sec)

 

2) DB, 사용자 계정 생성

 

MySQL 에 접근하여 DB, 사용자 계정 생성 및 권한을 할당 합니다.

(암호화 방식은 기본값인 caching_sha2_password 로 정함)

 

# docker exec -it mysql /bin/bash
bash-4.4# mysql -u root -p
Enter password: (docker-compose.yml 에서 설정한 root 비밀번호 입력)

 

mysql> create databases sysdocudb;

mysql> create user 'sysdocu'@'localhost' identified with caching_sha2_password by '12345678';
mysql> grant all privileges on sysdocudb.* to 'sysdocu'@'localhost'; 
mysql> grant grant option on sysdocudb.* to 'sysdocu'@'localhost'; 
mysql> flush privileges;

 

컨테이너 밖에서 접근을 하면 (호스트 서버 또는 다른 컨테이너) 외부 IP 에서 접근한 것으로 간주하기 때문에

접근 호스트명만 바꿔서 동일한 계정으로 추가 생성 해줍니다.

 

mysql> create user 'sysdocu'@'%' identified with caching_sha2_password by '12345678';
mysql> grant all privileges on sysdocudb.* to 'sysdocu'@'%'; 
mysql> grant grant option on sysdocudb.* to 'sysdocu'@'%'; 
mysql> flush privileges;

 

3) MySQL root 패스워드 변경

 

추후 MySQL root 패스워드를 변경하고자 할 경우 mysql 로그인 후 아래와 같이 쿼리를 실행하면 됩니다.

mysql> use mysql;

mysql> alter user root@localhost identified by 'NEWPASSWD';

mysql> alter user root@'%' identified by 'NEWPASSWD';

mysql> flush privileges; 

 

4) data dump 방법

 

DB 를 운영하면서 백업은 필수 진행해야 합니다.

호스트 서버의 data 디렉토리를 압축해도 되지만, mysqldump 명령으로 백업하고자 할때는

아래와 같이 실행하여 간단히 백업을 할 수 있습니다.

 

# docker exec mysql /usr/bin/mysqldump -u root -p12345678 sysdocudb > sysdocudb.sql

 

 

 

 

반응형

댓글()

2. Docker httpd 환경 설정하기 (PHP 연동, Virtualhost 및 SSL 적용)

반응형

2. Docker httpd 환경 설정하기 (PHP 연동, Virtualhost 및 SSL 적용)

 

1) httpd 기본 환경 설정 방법

httpd 컨테이너 내의 설정 파일 (conf) 를 호스트 서버로 복사하고 호스트 서버의 conf 디렉토리를 사용하도록 해야 합니다.

컨테이너가 구동중인 상태에서 아래와 같이 파일을 복사 합니다.

 

httpd 컨테이너의 /usr/local/apache2/conf 디렉토리를 /home/sysdocu/httpd/ 디렉토리 아래로 복사.

# docker cp httpd:/usr/local/apache2/conf/ /home/sysdocu/httpd/

 

호스트 서버에서 httpd 에 대한 conf 설정과 logs 확인이 가능하도록 docker-compose.yml 파일을 수정합니다.

그리고 아래 SSL 인증서 사용을 위해 호스트 서버와 컨테이너의 포트 (443) 도 연결 설정을 해줍니다.

# vi docker-compose.yml

...
    httpd:
        image: httpd:2.4.54
        container_name: httpd
        restart: unless-stopped
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - /home/sysdocu/httpd/html/:/usr/local/apache2/htdocs/
            - /home/sysdocu/httpd/conf/:/usr/local/apache2/conf/
            - /home/sysdocu/httpd/logs/:/usr/local/apache2/logs/
...

 

변경된 컨테이너를 적용합니다.

# docker compose stop httpd
# docker rm -v httpd
# docker compose up -d httpd

 

 

2) PHP 연동

 

PHP 연동에 필요한 httpd 모듈을 활성화 합니다.

# vi /home/sysdocu/httpd/conf/httpd.conf

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so    # 주석 해제
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so    # 주석 해제
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so    # 주석 해제
...
# 아래 확장자는 php 컨테이너로 포워딩 처리
ProxyPassMatch ^/(.*\.html(/.*)?)$ fcgi://php:9000/var/www/html/$1    # 추가
ProxyPassMatch ^/(.*\.htm(/.*)?)$ fcgi://php:9000/var/www/html/$1    # 추가
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
    # 추가

 

설정 적용을 위해 httpd 컨테이너를 재시작 합니다.

# docker compose restart httpd

 

3) virtualhost 설정

 

아래 파일에서 virtualhost 부분을 사용할 수 있도록 주석 제거하고 virtualhost 설정 파일을 수정합니다.

# vi /home/sysdocu/httpd/conf/httpd.conf

<Directory />
    AllowOverride none
    Require all granted    # 수정
</Directory>

Include conf/extra/httpd-vhosts.conf    # 주석 해제

 

# vi /home/sysdocu/httpd/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot "/home/sysdocu/httpd/html"
    ServerName sysdocu.tistory.com
    ErrorLog "logs/sysdocu.tistory.com-error_log"
    CustomLog "logs/sysdocu.tistory.com-access_log" common
</VirtualHost>

 

컨테이너 재시작 후 웹브라우저에서 잘 출력되는지 다시 확인해봅니다.

# docker compose restart httpd

 

('403 Forbidden' 에러가 출력될 경우)

/home/sysdocu 와 같이 홈 소스 디렉토리가 있는지 확인하고 접근 권한 (퍼미션 755) 을 확인해 봅니다.

 

4) SSL 발급 및 설정

 

준비된 SSL 인증서가 없으므로 Let's encrypt 에서 발급받아 사용해 봅니다.

https://sysdocu.tistory.com/1546

 

인증서 파일을 발급 받았으면 컨테이너에서 인증서 파일 인식이 가능하도록 복사해 줍니다.

# mkdir /home/sysdocu/httpd/conf/ssl
# cp -arp /etc/letsencrypt/archive/sysdocu.tistory.com /home/sysdocu/httpd/conf/ssl/

 

httpd 설정 파일을 아래와 같이 수정합니다.

# vi /home/sysdocu/httpd/conf/httpd.conf

LoadModule ssl_module modules/mod_ssl.so    # 주석 해제
Include conf/extra/httpd-ssl.conf    # 주석 해제

 

# vi /home/sysdocu/httpd/conf/extra/httpd-ssl.conf

#SSLSessionCache        "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"    # 주석 처리
#SSLSessionCacheTimeout  300    # 주석 처리

<VirtualHost *:443>
DocumentRoot /home/sysdocu/httpd/html
ServerName sysdocu.tistory.com:443
...
SSLEngine on
SSLCertificateFile conf/ssl/sysdocu.tistory.com/cert1.pem
SSLCertificateKeyFile conf/ssl/sysdocu.tistory.com/privkey1.pem
SSLCertificateChainFile conf/ssl/sysdocu.tistory.com/fullchain1.pem
</VirtualHost>

 

설정 적용을 위해 컨테이너를 재시작하면 웹브라우저에서 https 로 접근하여 인증서 확인이 가능합니다.

# docker compose restart httpd

 

반응형

댓글()

1. Ubuntu 22.04 에서 Docker 사용하기 (APM 기본 설치)

반응형

 

[ Docker 설치 ]

1. 패키지 목록 최신화 및 업그레이드
# apt -y update

# apt -y upgrade
# apt -y install apt-transport-https ca-certificates curl gnupg lsb-release

2. Docker 공식 GPG 설치
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg |gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

3. Docker 공식 저장소 추가
# echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" |tee /etc/apt/sources.list.d/docker.list > /dev/null

4. Docker 설치 및 확인

# apt -y update
# apt -y install docker-ce docker-ce-cli containerd.io
# docker --version

5. Compose 설치 및 확인

도커 컨테이너 구동 명령시 옵션으로 환경 값을 줄 수 있는데, 이경우 명령 라인이 길어지는 불편함이 있습니다.

docker-compose 는 이런 불편함을 없애고, 미리 준비한 환경을 파일(.yml) 을 사용하며 여러 컨테이너를 한 번에 관리할 수 있습니다.

 

1) Plugin 형태로 사용할 경우 (매뉴얼 진행 형태)
# apt -y install docker-compose-plugin
# docker compose version

 

2) Standalone 형태로 사용할 경우
# curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose --version

 


[ Docker 삭제 ]

1. Docker 관련 패키지를 제거
# apt purge docker-ce docker-ce-cli containerd.io

2. 호스트의 이미지, 컨테이너, 볼륨 또는 사용자 지정 구성파일 제거 (모든 이미지, 컨테이너 및 볼륨 수동 삭제)
# rm -rf /var/lib/docker
# rm -rf /var/lib/containerd

 


[ APM 설치 ]

1. 설치 및 확인
특정 버전을 명시하지 않으면 최신 버전의 이미지가 다운로드 됩니다.
사용 예) docker pull {이미지}:{버전}
# docker pull httpd:2.4.54
# docker pull php:8.2.0-fpm
# docker pull mysql:8.0.31

 

다운로드 된 이미지 리스트를 출력합니다.

# docker images

 

(기타 명령 - 설치)

# docker search mysql    // 다운로드 가능한 이미지 출력

# docker pull mysql         // mysql:8.0.31 와 같이 특정 버전을 지정하지 않으면 최신 버전이 설치됩니다.

                                           (mysql 또는 mysql:latest)

                                           아래 URL 에서 제공하는 버전을 확인 할 수 있습니다.

                                           https://hub.docker.com/_/mysql

                                           https://hub.docker.com/_/php

                                           https://hub.docker.com/_/httpd

 

(기타 명령 - 삭제)

이미지 삭제는 컨테이너 우선 삭제 후 가능합니다.

# docker ps                                 // 컨테이너 리스트 출력

# docker rm cea0f7b8d47f          // 출력된 컨테이너 ID 로 컨테이너 삭제

# docker images                          // 이미지 리스트 출력

# docker rmi httpd                        // 이미지 삭제

* 참고

이미지 삭제시 아래와 같은 메세지가 출력되는 경우는 REPOSITORY 가 같고 버전의 차이가 없는 경우입니다.

(예 : httpd:2.4.54 와 httpd:latest 가 같은 버전일 경우)
Error response from daemon: conflict: unable to delete 157dcdf23d6c (must be forced) - image is referenced in multiple repositories

아래와 같이 -f 옵션으로 강제 삭제를 하게 되면 두개의 이미지가 동시 삭제 됩니다.

# docker rmi -f 157dcdf23d6c


2. 가동

APM 환경 파일을 컨테이너와 연결하여 생성합니다.
# vi docker-compose.yml

version: '3.9'

services:
    httpd:
        image: httpd:2.4.54
        container_name: httpd
        restart: unless-stopped # 서버 부팅시 컨테이너 가동
        ports:
            - "80:80"
        volumes:
            - /home/sysdocu/httpd/html/:/usr/local/apache2/htdocs/ # 웹 소스 파일 경로

    mysql:
        image: mysql:8.0.31
        container_name: mysql
        restart: unless-stopped
        tty: true
        ports:
            - "3306:3306"
        environment:
            MYSQL_HOST: localhost
            MYSQL_ROOT_PASSWORD: 12345678 # 초기 mysql root 비밀번호
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
            TZ: Asia/Seoul

    php:
        image: php:8.2.0-fpm
        container_name: php
        restart: unless-stopped
        ports:
            - "9000:9000"
        volumes:
            - /home/sysdocu/httpd/html/:/var/www/html/  # php 소스 코드를 사용하기 위해 필수 설정
        command:
            - /bin/sh
            - -c
            - |
              echo "security.limit_extensions = .html .htm .php" >> /usr/local/etc/php-fpm.d/www.conf  # 특정 확장자만 php 소스 코드 사용
              php-fpm

 

파일 맨 위에 compose version 은 docker 버전에 맞추어 사용해야 합니다. 아래 URL 에서 확인이 가능합니다.

https://docs.docker.com/compose/compose-file/compose-versioning/#compatibility-matrix

 

이제 컨테이너를 가동합니다.

# docker compose up -d               // 백그라운드로 전체 서비스 (컨테이너) 올리기

* 이 작업이 선행 되어야 컨테이너 별로 제어 (시작/중지) 가 가능함

 

index.html 를 만들고 브라우저로 접속하면 아래 내용 (New index) 이 출력되는것을 확인할 수 있습니다.

# echo "New index" > /home/sysdocu/httpd/html/index.html

 

그리고 변경된 내용이 httpd 컨테이너 내에도 확인됩니다.

( 실 데이터 저장 위치 : /home/sysdocu/httpd/html/ )

# docker exec -it httpd /bin/bash

root@771473b9edc0:/usr/local/apache2# cd htdocs
root@771473b9edc0:/usr/local/apache2/htdocs# cat index.html 
New index

 

현재 컨테이너 구동 상태입니다.

# docker compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
httpd               "httpd-foreground"       httpd               running             0.0.0.0:80->80/tcp, :::80->80/tcp
mysql               "docker-entrypoint.s…"   mysql               running             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
php                 "docker-php-entrypoi…"   php                 running             0.0.0.0:9000->9000/tcp, :::9000->9000/tcp

 

(기타 명령)

# docker compose images       // 올려진 서비스 (컨테이너) 가 사용중인 이미지 리스트 출력. (모든 이미지 출력 : docker images)

# docker compose ps               // 올려진 서비스 (컨테이너) 출력

# docker compose stop php     // 올려진 서비스 (컨테이너) 선택 중지

# docker compose start php     // 올려진 서비스 (컨테이너) 선택 시작

# docker rm -v php                    // 올려진 서비스 (컨테이너) 삭제
# docker compose up -d php    // 하나의 서비스 (컨테이너) 만 구동

 

모든 컨테이너를 더이상 사용하지 않을때 아래와 같이 내립니다.

# docker compose down    // 컨테이너 중지 및 삭제

 

반응형

댓글()

Ubuntu 22.04 Desktop 설치 후 한글 사용하기 외 PC 로 활용할 기본 프로그램 목록

리눅스/OS 일반|2022. 11. 15. 10:10
반응형

한글 사용하기

1. settings - Region & Language - Install / Remove Languages -> Korean 박스 체크

reboot

2. terminal - ibus-setup

3. input method - add - korean 검색 - korean - Hangul add

4. settings - input sources - + 클릭 - Korean - Korean (Hangul) add

5. 바탕화면 우측 상단에 add된 Korean(hangul) 선택

[출처] https://jay-daily.tistory.com/201

 

 

우분투 소프트웨어에서 설치

remmina, filezilla, telegram, gedit, 스크린샷

 

 

동영상 플레이어

# apt -y install smplayer

기본 프로그램 등록 : 셋팅 > 기본 응용 프로그램 > 영상 (SMPlayer) 선택

 

 

네이버 웨일 브라우저

 

 

반응형

댓글()