POD?

  • Container를 표현하는 k8s API의 최소단위
  • k8s가 Pod라는 단위로 컨테이너를 묶어서 관리
    • Pod와 Container 1대 다관계

 

 

 

POD의 생명주기

https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/

 

파드 라이프사이클

이 페이지에서는 파드의 라이프사이클을 설명한다. 파드는 정의된 라이프사이클을 따른다. Pending 단계에서 시작해서, 기본 컨테이너 중 적어도 하나 이상이 OK로 시작하면 Running 단계를 통과하

kubernetes.io

  • Pending
    • K8s 시스템에 Pod를 생성하는 중인 상태
  • Running
    • 파드 안 컨테이너가 실행중인 상태
  • Succeeded
    • Pod 안의 모든 컨테이너가 정상 실행 종료된 상태
  • Failed
    • Pod 안의 모든 컨테이너 중 정상적으로 실행 종료되지 않은 컨테이너가 있는 상태
  • Unknown
    • Pod의 상태를 확인할 수 없는 상태

 

 

 

현재 동작중인 Pod 조회

pod 조회

  • # kubectl get pods
  • # kubectl get pod mypod -o wide
  • kubectl get pod mypod -o yaml
  • kubectl get pod mypod -o json

 

 

 

pod 생성(CLI명령어)

pod 생성 및 테스트

pod 생성

  • # kubectl run webserver2 --image=nginx:1.14 --port 80
    • nginx의 기본 listen port는 80

pod 조회

  • # kubectl get pods
  • # kubectl get pods -o wide
  • # kubectl get pod webserver -o yaml > test.yaml
    • yaml형식으로 test.yaml파일로 output
  • # kubectl get pod webserver -o json > test.json
    • json형식으로 test.json파일로 output
  • # kubectl get pods --all-namespaces
    • 모든 namespace에 동작중인 pod 조회

pod의 로그 출력

  • # kubectl logs webserver

테스트

  • # curl 172.16.132.2

 

 

 

POD생성(yaml) & 명령어 실행가능 상태 확인

yaml파일을 이용하여 pod 생성

  • # kuctl create -f ./nginx.yaml
  • # kubectl apply -f ./nginx.yaml

 

실행가능 상태만 확인

  • # kubectl run webserver --image=nginx --port 80 --dry-run=client

지정된 yaml파일로 출력하여 확인

  • # kubectl run webserver --image=nginx --port 80 --dry-run=client -o yaml

지정된 yaml파일에 출력하여 확인

  • # kubectl run webserver --image=nginx --port 80 --dry-run=client -o yaml > websv_create.yaml

yaml파일을 이용하여 pod 생성

  • # kubectl apply -f ./websv_create.yaml
  • # kubectl create -f ./websv_create.yaml

 

 

 

port-forwarding 테스트

port forwarding 테스트

  • # kubectl port-forward webserver 80:80

 

 

 

Static Pod?

  • kubu-apiserver를 통하지 않고 kublet데몬에 의해서 직접 실행하는 pod
  • kube-apiserver를 통해서 pod를 edit할 수 없음
  • 용도
    • 주로 시스템 pod(kube-apiserver, etcd)를 살행하는 용도로 많이 사용
  • static pod 디렉토리 구성
    • /var/lib/kubelet/config.yaml

staticPodPath의 위치

 

static pod path에 yaml파일 생성

  • static pod를 생성할 node에서 staticPodPath에 yaml파일을 저장하면 kubelet daemon에서 pod를 생성

 

  • static pod path 변경
    • # systemctl restart kubelet
      • kubelet daemon 재시작

 

  • static pod path에서 yaml파일삭제
    • 해당 yaml로 실행된 pod가 삭제됨

 

  • master node에서 구동하는 시스템 pod들은 static pod 형태로 구동됨을 확인 할 수 있다

 

 

 

POD에 CPU/Memory 메모리 자원 할당

  • Resource limits
    • pod가 사용할 수 있는  최대 리소스 양을 제한
  • Resource requests
    • pod를 실행하기 위한 최소 리소스 양 요청
  • 메모리를 초과해서 사용되는 pod는 OOM kill되며 재스케줄링 됨

  • 리소스 request, limit 설정하여 pod 생성

 

 

 

Pod 환경변수 설정

  • 외부에서 현재 pod의 환경 변수 조회
    • # kubectl exec {POD_NAME} -- env

 

  • 환경변수 설정

 

 

 

Multi Container?

  • Pod 1개에 다수 컨테이너 구조
  • 모두 노드 하나 안에서 실행
  • pod내 컨테이너들이 자원을 공유

kubernetes.io/ko/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/

 

공유 볼륨을 이용하여 동일한 파드의 컨테이너 간에 통신하기

이 페이지에서는 동일한 파드에서 실행 중인 두 개의 컨테이너 간에 통신할 때에, 어떻게 볼륨을 이용하는지 살펴본다. 컨테이너 간에 프로세스 네임스페이스 공유하기를 통해 통신할 수 있는

kubernetes.io

 

apiVersion: v1
kind: Pod
metadata:
  name: multipod
spec:
  containers:
  - name: nginx-container
    image: nginx:1.14
    ports:
    - containerPort: 80
  - name: centos-container
    image: centos:7
    command:
    - sleep
    - "100000"

multiContainer.yaml 파일

 

  • # kubectl describe pods multi-container
    • nginx-container, centos-container 2 container가 1개의 pod에서 running중임을 확인
  • # kubectl exec -it multi-container -c nginx-container -it -- /bin/bash
    • multi-container pod의 nginx-container container로 shell 접속

 

redis-server process 구동확인

  • # apt-get update && apt-get install -y procps

 

멀티컨테이너 로그 출력

  • # kubectl logs multi-container -c nginx-container
  • # kubectl delete pod --all
    • 현재 namespace의 모든 pod 삭제

 

 

 

init Container?

  • 메인 컨테이너가 구동하기전에 미리 동작시킬 컨테이너
  • 메인 컨테이너가 실행되기 전에 사전작업이 필요한 경우 사용
  • init 컨테이너를 포함한 pod는 init 컨테이너에 설정한 조건이 성공해야 메인 컨테이너를 구동시킬 수 있다.
  • init 컨테이너는 readinessProbe를 지원하지 않는다.
    • Pod가 모두 준비되기 전에 실행한 후 종료되는 컨테이너이므로(실제 서비스를 위한 컨테이너가 아니므로)

https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/

 

초기화 컨테이너

이 페이지는 초기화 컨테이너에 대한 개요를 제공한다. 초기화 컨테이너는 파드의 앱 컨테이너들이 실행되기 전에 실행되는 특수한 컨테이너이며, 앱 이미지에는 없는 유틸리티 또는 설정 스크

kubernetes.io

 

init Container 테스트

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

  • # kubectl apply -f ./init_container.yaml
  • init Container가 성공해야 메인컨테이너가 구동 할 수 있다.
    • init Container가 전부 성공할때까지 대기

 

---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377

  • # kubectl apply -f ./service.yaml
  • 각 init 컨테이너가 대기하는 2개의 service를 생성
    • 메인 컨테이너가 Running 상태로 변함을 알 수 있다.

 

 

 

infra Container(Pause)?

  • pod당 1개 생성되는 컨테이너
  • PID 1로 설정되며 다른 컨테이너의 부모 컨테이너 역할
  • 역할
    • Pod에 대한 인프라(IP, hostname등) 네트워크 리소스를 관리하고 생성

 

infra Container 테스트

  • work node에서 컨테이너 조회
    • pod가 1개 생성될때 1개의 pause 컨테이너가 같이 생성됨을 확인 할 수 있다
  • pod가 삭제될때 해당 pod의 pause 컨테이너도 같이 삭제됨을 확인 할 수 있다

'클라우드 > K8s' 카테고리의 다른 글

K8s namespaces  (0) 2022.03.17
K8s Pod 구성패턴  (0) 2022.03.17
K8s 동작원리  (0) 2022.03.17
Single Master K8s 설치 및 기본 명령어  (0) 2022.03.17
Kubernetes?  (0) 2022.03.17

K8s 동작 flow

k8s 동작 flow

 

kubernetes 애플리케이션 실행

  • 하나이상의 컨테이너 이미지들을 패키지로 레지스트리에 푸시
  • 쿠버네티스 API 서버에 애플리케이션의 디스크립션(yaml or json) 게시하여 pod를 생성수행 명령

 

 

 

마스터노드와 워커노드의 구성과 통신 구조(쿠버네티스 입문 90가지 예제로 배우는 컨테이너 관리자동화 표준 책 참고)

 

 

master node 컴포넌트

  • 역할 및 특징
    • 클러스터 관리, HA, 보통 애플리케이션을 해당 master node에서는 실행하지는 않음
  • 컴포넌트들 - 관리용 컴포넌트들은 컨네이너로 실행/ 하이퍼큐브라는 바이너리 파일로 컴파일되어있음.
    1.  kubelet
      • 마스터에 있는 Docker 관리
    2. kube-apiserver
      • K8s의 모든 통신의 중심
      • k8s API를 사용하도록 요청을 받고 요청이 유효한지 검사
      • etcd는 kube-apiserver를 통해서만 접근 할 수 있다.
    3. kube-scheduler
      • 현재 클러스터안에서 자원할당이 가능한 노드중 알맞은 노드를 선택
    4. kube-controller-manager
      • 구성요소 복제, 워커 노드추적, 노드 장애 처리등 클러스트 수준 기능을 실행
      • 파드를 관찰하며 개수를 보장
    5. kube-proxy
      • k8s의 network 동작을 관리
      • iptables
    6.  etcd
      • 클러스터 구성을 지속적으로 저장하는 안정적인 분산
      • 고가용성을 제공하는 키-값 저장소
      • worker node들의 상태정보
      • 서버당 1 프로세스만 사용가능
      • 별도의 프로세스로 실행
    7. 애드온
      1. 네트워크 애드온
        • CNI - weave, calico, flaneld 등
      2. dns 애드온
        • coreDNS
      3. 대시보드 애드온
      4. 컨테이너 자원 모니터링
        • cAdvisor
      5. 클러스터 로깅
        • ELK, EFK, DataDog

 

 

Worker node 컴포넌트

  1. kubelet
    • 모든 노드에서 실행되는 ks8 에이전트 데몬
    • cAdvisor
      • 컨테이너 모니터링 툴 
      • 컨테이너 기반의 상태정보 및 H/W 정보를 수집하여 Master node에 전달하고 해당 정보는 etcd에 저장된다
  2. kube-proxy
    • k8s의 network 동작을 관리
    • iptables
  3. container runtime
    • 컨테이너를 실행하는 엔진
    • docker or containerd or runc 등

'클라우드 > K8s' 카테고리의 다른 글

K8s namespaces  (0) 2022.03.17
K8s Pod 구성패턴  (0) 2022.03.17
POD  (0) 2022.03.17
Single Master K8s 설치 및 기본 명령어  (0) 2022.03.17
Kubernetes?  (0) 2022.03.17

설치없이 online k8s 사용방법

Katacoda

https://www.katacoda.com/courses/kubernetes/playground

 

Kubernetes Playground | Katacoda

Use Kubernetes in a hosted sandboxed interactive environment

www.katacoda.com

katacoda system

 

 

Docker playground

https://labs.play-with-k8s.com/

 

Play with Kubernetes

Play with Kubernetes is a labs site provided by Docker and created by Tutorius. Play with Kubernetes is a playground which allows users to run K8s clusters in a matter of seconds. It gives the experience of having a free Alpine Linux Virtual Machine in bro

labs.play-with-k8s.com

Docker playground

 

 

 

로컬 PC에 k8s 설치하는 방법

 

설치환경 : ubuntu 18.04 virtual-box

설치노드

  • Master Node x 1
  • Slave Node x 2

kubernetes 설치

  1. Docker 설치

  • # apt install docker.io

2. Kubeadm 설치(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)

공식사이트 설치 명령어 실행

 

kubeadm 설치완료

  • kubeadm
    • 클러스터를 부트스트랩하는 명령
  • kubelet
    • 클러스터의 모든 시스템에서 실행되는 구성 요소로, Pod 및 컨테이너 시작과 같은 작업을 수행
  • kubectl
    • 쿠버네티스 클러스터를 제어하기 위한 커맨드라인 도구

3. Master Node 복제

복제 선택

  • MAC주소 초기화 선택

  • 완전한 복제 선택

  • 현재 머신 상태 선택

  • Master Node x1, work Node x2 설치

  • NatNetwork 추가

  • 각 Node에 위에서 생성한 NatNetwork 추가

  • Node들을 구동하여 상호 Node간 ping 확인

 

  • Master와 work node의 hostName 변경
    • 각 노드의 /etc/hostname 파일에서 hostname변경

 

kubeadm init 시도(error)

  • # kubeadm init
    • swap기능이 on상태이므로 error가 발생.
  • master노드와 work노드의 swap 기능을 전부 끈다
    • # swapoff -a (swap기능을 끔)
      • -- reboot시 swap off 유지되지는 않음.
    • # sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 
      • -- reboot시 swapoff 유지

kubeadm init 재시도

  • user권한으로 아래 3개의 명령어를 입력
    • # mkdir -p $HOME/.kube
    • # sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    • # sudo chown $(id -u):$(id -g) $HOME/.kube/config

work node join

  • work노드에서 join명령어를 실행한다.
  • # kubeadm join 192.168.35.79:6443 --token b83n95.m91axbvrm2l70inl \  --discovery-token-ca-cert-hash sha256:84d994db7cfa3cfd8eca10e2a7ab6dc6551c860cfea526d1dd720e2b8259a1d2
    • kubeadm init 명령어 성공후 맨하단에 나오는 join명령어를 실행

MasterNode에서 workNode join확인

 

CNI(Container Network Interface) 설치

  • Pod Network
  • Container간 통신을 지원하는 VxLAN
  • 다양한 종류의 플러그인이 존재

 

Weave Net 설치(www.weave.works/docs/net/latest/kubernetes/kube-addon/)

 

 

 

auto completion 적용

https://kubernetes.io/docs/reference/kubectl/cheatsheet/

 

kubectl Cheat Sheet

This page contains a list of commonly used kubectl commands and flags. Kubectl autocomplete BASH source <(kubectl completion bash) # setup autocomplete in bash into the current shell, bash-completion package should be installed first. echo "source <(kubect

kubernetes.io

 

 

 

MiniKube 설치

설치환경: virtual box(Ubuntu 18.04.2)

 

Docker 설치

  • # sudo apt install docker.io -y
  • # sudo chmod 666 /var/run/docker.sock

http://minikube.sigs.k8s.io/docs/start/

  • # curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
  • # sudo dpkg -i minikube_latest_amd64.deb
  • # minikube start --driver=docker
  • # sudo snap install kubectl --classic

 

 

 

TroubleShooting

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

https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#%EB%8F%84%EC%BB%A4

 

컨테이너 런타임

파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨테이너 런타임을 설치해야 한다. 이 페이지에서는 관련된 항목을 설명하고 노드 설정 관련 작업을 설명한다. 이 페이지에는 리눅스

kubernetes.io

 

 

 

k8s 기본명령어 테스트

k8s 버전확인

k8s 버전정보

  • # kubectl version --short

 

 

 

k8s 약어확인

k8s 명령어 약어 확인

  • # kubectl api-resources

 

 

 

K8s service API 버전확인

  • kubectl explain <service name>
    • # kubectl explain pod
    • #kubectl explain deployment

 

 

 

Deployment 생성

deployment 생성

  • # kubectl create deployment mainui --image=httpd:latest --replicas=3

 

 

 

Docker 이미지 빌드 및 deployment 생성

컨테이너 이미지 만들기

  • Docker 이미지 빌드
    • # docker build -t http go .

 

컨테이너 푸시

  • docker 이미지 태깅
    • # docker tag test-go fastwon1/test-go
  • Docker.io repository에 push
    • # docker push fastwon1/test-go

 

deployment

  • default ns의 전체 pod 정보 확인
    • # kubectl get pods
  • 이미지 디플로이먼트
    • # kubectl create deployment test-go --image=fastwon1/test-go
      • kubectl create deploy --image alpine:3.4 alpine-deploy --dry-run=client
      • kubectl create deploy --image alpine:3.4 alpine-deploy --dry-run=client -o yaml > alpine.yaml
        • yaml 파일 output
      • # kubectl create -f ./jenkinks.yaml --record=true
  • 디플로이먼트 조회
    • # kubectl get deployment
  • 레플리카셋 조회
    • # kubectl get rs
  • 서비스 조회
    • # kubectl get svc
      • # kubectl get svc -w (-w 옵션:모니터링)

 

expose
expose 확인

  • 서비스 외부노출
    • # kubectl expose deployment test-go --name test-go-svc --port=8080 --type=LoadBalancer
    • # kubectl expose deployment pod-jenkins --name srv-jenkins --dry-run=client --port 8080 -n blue -o yaml >> blue-jenkins-svc.deploy.yaml

 

deployment 및 svc 삭제

  • 디플로이먼트 삭제
    • # kubectl delete deployment test-go
  • 서비스 삭제
    • # kubectl delete svc test-go-svc

 

scaleout

  • 스케일아웃
    • # kubectl scale deploy test-go --replicas=3

 

직접 앱에 접근

  • 해당 컨테이너에 curl명령어 실행
    • # kubectl exec test-go-8677f85fb6-5pzm5 -- curl 10.4.3.228:8080 -s

 

앱 위치 및 포드정보 확인

  • 다중 Pod정보 자세히 출력
    • # kubectl get pod -o wide
  • 단일 Pod정보 자세히 출력
    • # kubectl describe pod test-go-8677f85fb6-5pzm5

 

pod bash 터미널 접속

  • 컨테이너 bash접속
    • # kubectl exec -it fastwon1-jenkins-77fc6594dd-lrclv -- bash
    • kubectl exec -it busybox-pod -- sh

 

테스트 bash

  • kubectl run -it --rm --image busybox -- bash

 

 

etcd

 

  • 명령어
    • 모든 key 조회
      • sudo ETCDCTL_API=3 ./etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key get / --prefix --keys-only
    • key put
      • sudo ETCDCTL_API=3 ./etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key put key1 value1
    • key get
      • sudo ETCDCTL_API=3 ./etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key get key1

key put/get

 

snapshot 생성 및 상태확인

 

  • 백업 명령어
    • sudo ETCDTCL_API=3 ./etcdctl --endpoints 127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key snapshot save snapshotdb
  • 복구 명령어
    • sudo ETCDTCL_API=3 ./etcdctl --endpoints=127.0.0.1:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --data-dir /var/lib/etcd-restore --initial-cluster='master=https://127.0.0.1:2380' --name=master --initial-cluster-token this-is-token --initial-advertise-peer-urls https://127.0.0.1:2380 snapshot restore ~/yaml/snapshotdb

 

  • data-dir path 수정
  • initial-cluster-token 추가

 

  • hostPath의 path 수정

'클라우드 > K8s' 카테고리의 다른 글

K8s namespaces  (0) 2022.03.17
K8s Pod 구성패턴  (0) 2022.03.17
POD  (0) 2022.03.17
K8s 동작원리  (0) 2022.03.17
Kubernetes?  (0) 2022.03.17

도커란?

 컨테이너 가상화 환경에서 애플리케이션을 관리하고 실행하기 위한 오픈소스 플랫폼

 

 

 

Kubernetes?

컨테이너 오케스트레이션 시스템

 

 

 

kubernetes는 왜 필요한가?

실제 상용서버를 운용하기에 부족한부분이 존재

  • 보통 상용서비스에서 서버 한대만 사용하지 않음
  • 여러 대 서버에 컨테이너를 배포하는 전체 과정을 수동으로 제어해야함
  • 서버에 장애가 발생했을 때 해당 서버의 컨테이너를 다른 서버로 옮기는 작업도 수동으로 해야함

k8s는 상용서버들을 클러스터로 구성하여 이러한 부분들을 자동화하므로 시스템 운영을 쉽게 한다.

 

 

 

컨테이너 계층구조

컨테이너 계층구조

 

 

 

K8s 특징?

  • 워크로드 분리
  • 어디서나 실행가능 - on-premise, public cloud(AKS, EKS, GKE등)
  • 선언적 API
    • 각 요소가 추구하는 상태를 선언하면 현재 상태와 맞는지 점검하고 그것에 맞추려고 노력하는 구조

 

 

kubernetes cluster&amp;amp;amp;amp;amp;amp;nbsp;architecture

  • 마스터 노드 : 전체 쿠버네티스 시스템을 관리하고 통제하는 쿠버네티스 컨트롤 플레인을 관장
  • 워커 노드 : 실제 배포하고자 하는 애플리케이션 실행 담당

'클라우드 > K8s' 카테고리의 다른 글

K8s namespaces  (0) 2022.03.17
K8s Pod 구성패턴  (0) 2022.03.17
POD  (0) 2022.03.17
K8s 동작원리  (0) 2022.03.17
Single Master K8s 설치 및 기본 명령어  (0) 2022.03.17

Mockito Stubbing이란?

  • 모든 Mock 객체의 행동을 조작하는 방법

샘플 클래스 구조

//Mockito.mock() 메소드로 만드는 방법
 
 @Test
    public void mokitoTeset() {
        A a = mock(A.class);
        B b = mock(B.class);
        C c = new C(a, b);
        When(c.method1()).thenReturn(10) // 숫자 10을 리턴해야함
        When(c.method2(“test”)).thenReturn(“1“) // 문자열 “1”을 리턴해야함
 }

 

@Test
public void stubbingTest() {
    Service service = mock(Service.class);
    Member member = new Member();
    member.setId(“testId”);
    member.setEmail("abcd@naver.com");
    when(memberService.findById(“testId”))
            .thenReturn(Optional.of(member))  //findById가 첫번째 불렸을때 객체 리턴
            .thenThrow(new RuntimeException()) //findById가 두번째 불렸을때 예외발생
            .thenThrow(new RuntimeException()) //findById가 세번째 불렸을때 예외발생
            .thenReturn(Optional.empty()); //findById가 네번째 불렸을때 empty 리턴

    Optional<Member> byId = service.findById(“testId”); //첫번째 불렸을때
    assertEquals("abcd@naver.com", byId.get().getEmail());
    assertThrows(RuntimeException.class, () -> {
        service.findById(“testId”); //두번째 불렸을때

    });
    assertThrows(RuntimeException.class, () -> {
        service.findById(“testId”); //세번째 불렸을때
    });
    assertEquals(Optional.empty(), service.findById("testId")); //네번째 불렸을때
}

 

@DisplayName("BDD 스타일")
@Test
public void bddTest() {
    
/////// Given
        Service service = mock(Service.class);
        Repository repository = mock(Repository.class);
        
        Manager manager = new StudyService(service, repository);
        assertNotNull(manager);
        
        Member member = new Member();
        member.setId("testId");
        member.setEmail("abcd@naver.com");
        
        Job job = new Job(1, "search");
        
        given(manager.findById("testId")).willReturn(Optional.of(member));
        given(repository.save(job)).willReturn(job);



////// When
        manager.jobSchedule(1, job);



 ////// Then
        then(manager).should(times(1)).findById("testId"); //findById라는 메소드는 한번 실행되어야한다.
        then(manager).should(times(1)).notify(job); // notify(Job) 메소드는 한번 실행되어야한다.
        then(manager).should(times(1)).notify(member); //notify(Member) 메소드는 한번 실행되어야한다.
        then(manager).shouldHaveNoMoreInteractions();  //manager객체로 더이상 interaction이 있으면 안됨
   
}

' > Mockito' 카테고리의 다른 글

mokito란?  (0) 2022.03.14

 

 https://www.jetbrains.com/lp/devecosystem-2021/java/

 

  • Mock
    • 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체.
  • Mokito
    • Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다.

' > Mockito' 카테고리의 다른 글

mokito 샘플 코드  (0) 2022.03.14

기본 annotation 테스트

package hello.test;

import org.junit.jupiter.api.*;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class StudyTest {

    @Test
     @DisplayName("학생 생성 테스트") //테스트 이름 정의
     void create() {
        Study  study = new Study();
        assertNotNull(study);
        System.out.println("create1");
        assertEquals(StudyStatus.NOTHING, study.getStatus(),"초기상태 WATING");
                                 //기대값                  //현재 상태
        assertEquals(StudyStatus.NOTHING, study.getStatus(), () -> "초기값은 NOTHING 이어야 합니다.");
         //lambda 식으로 변경(lambda로 변경하는 경우 해당 수행이 실패하는 경우에만 message연산을 수행
        
        assertAll(
                () -> assertNotNull(study),
                () -> assertEquals(StudyStatus.NOTHING, study.getStatus(), () -> "초기값은 NOTHING 이어야 합니다."),
                () -> assertTrue(study.getLimit() > 0, () -> "최대 참석인원은 0 명보다 커야합니다.")
        ); //람다식으로 3개의 assert문 실행결과 확인 가능 
    }

    @Test
    @Disabled  //전체 클래스 테스트 수행시 동작하지 않도록 정의
    void create2() {
         IllegalArgumentException exception =  assertThrows(IllegalArgumentException.class, ()-> new Study(-1));
        assertEquals("Limit은 0보다 커야함.",exception.getMessage());
        //해당 excpetion의 message가 기대하는 값과 같은지 확인
    }

    @Test
    @DisplayName("생성 timeout 확인")
    void create3() {
        assertTimeout(Duration.ofSeconds(1), () -> new Study());
        //1초안에 생성자 생성
        
        assertTimeout(Duration.ofMillis(100), () -> {
            new Study();
            Thread.sleep(30000);
        }); // 30000 millisecond 이후에 실패 처리

        assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
            new Study();
            Thread.sleep(3000);
        }); // 100 millisecond가 지나면 바로 실패 처리
    }
    
     @Test
    void create4() {
        Study actual = new Study(10);
        assertThat(actual.getLimit()).isGreaterThan(0);  //3rd party assertjs
    }

    @BeforeAll  //테스트를 실행하기 전에 딱 1번 반드시 static 메소드로만 사용가능. 리턴타입 없음.
    static void BeforeAll() {
        System.out.println("BeforeALL");
    }

    @AfterAll  // 테스트를 실행한 이후 딱 1번만 수행(반드시 static 메소드로만 사용가능. 리턴타입 없음
    static void AfterAll() {  //모든 테스트가 실행된 이후에 1번만 실행
        System.out.println("AfterAll");
    }

    @BeforeEach //각 테스트 수행 전 1번 실행
    void BeforeEach() {
        System.out.println("BeforeEach");
    }

    @AfterEach // 각 테스트 수행 후 1번 실행
    void AfterEach() {
        System.out.println("AfterEach");
    }
}

 

condition에 따라서 테스트 실행

import org.junit.jupiter.api.*;

import java.time.Duration;
import java.util.function.Supplier;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeTrue;


....

    @Test
    void conditionTest() {
        assumeTrue("LOCAL".equalsIgnoreCase(System.getenv("TEST_ENV")));
        //TEST_ENV라는 환경변수가 LOCAL인 경우에만 아래 테스트가 수행됨.
        Study study = new Study();
        assertNotNull(study);
    }
    
    @Test
    void conditionTest2() {
        String env = System.getenv("TEST_ENV");
        //TEST_ENV라는 환경변수가 LOCAL인 경우에만 아래 테스트가 수행됨.
        assumingThat(("LOCAL".equalsIgnoreCase(env)),()->{
            System.out.println("succeed to test");
        });
        //TEST_ENV라는 환경변수가 LOCAL가 아닌 경우에만 아래 테스트가 수행됨.
        assumingThat(!("LOCAL".equalsIgnoreCase(env)),()->{
            System.out.println("Failed to test");
        });

        Study study = new Study();
        assertNotNull(study);
    }
    
     @Test
    @EnabledOnOs(OS.WINDOWS)  //특정 OS에 특화된 테스트시 활용
    @EnabledOnJre(JRE.JAVA_11) //자바 11버전에서만 실행
    @EnabledIfEnvironmentVariable(named= "TEST_ENV", matches = "local") //환경변수 TEST_ENV가 local인 경우에만 실행
    void conditionTest3() {
        String env = System.getenv("TEST_ENV");
        //TEST_ENV라는 환경변수가 LOCAL인 경우에만 아래 테스트가 수행됨.
        assumingThat(("LOCAL".equalsIgnoreCase(env)),()->{
            System.out.println(env);
        });
        //TEST_ENV라는 환경변수가 LOCAL가 아닌 경우에만 아래 테스트가 수행됨.
        assumingThat(!("LOCAL".equalsIgnoreCase(env)),()->{
            System.out.println(env);
        });

        Study study = new Study();
        assertNotNull(study);
    }

 

 

커스텀 테그

package hello.test;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
@Tag("slow")
public @interface SlowTest {
}

...........




//실제 사용 Test
    @SlowTest
    void conditionTest() {
        String env = System.getenv("TEST_ENV");
        assumeTrue("LOCAL".equalsIgnoreCase(env));
        //TEST_ENV라는 환경변수가 LOCAL인 경우에만 아래 테스트가 수행됨.
        assumingThat(("LOCAL".equalsIgnoreCase(env)),()->{
            System.out.println("succeed to test");
        });
        assumingThat(!("LOCAL".equalsIgnoreCase(env)),()->{
            System.out.println("succeed to test");
        });

        Study study = new Study();
        assertNotNull(study);
    }

 

 

테스트 반복 실행

package hello.test;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.aggregator.AggregateWith;
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
import org.junit.jupiter.params.aggregator.ArgumentsAggregationException;
import org.junit.jupiter.params.aggregator.ArgumentsAggregator;
import org.junit.jupiter.params.converter.ArgumentConversionException;
import org.junit.jupiter.params.converter.ConvertWith;
import org.junit.jupiter.params.converter.SimpleArgumentConverter;
import org.junit.jupiter.params.provider.*;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class OtherTest {
    @RepeatedTest(10)
    @DisplayName("반복 테스트1")
    public void test1() {
        System.out.println("repeat test");
    }

    @DisplayName("반복 테스트 2")
    @RepeatedTest(value = 10, name= "{displayName},{currentRepetition}/{totalRepetitions}")
    public void ParameterizedTest1(RepetitionInfo repetitionInfo) {
        System.out.println("count:"+ repetitionInfo.getCurrentRepetition() +"total:"
        + repetitionInfo.getTotalRepetitions());
    }

    @DisplayName("파라미터 출력")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @ValueSource(strings = {"1","2","3","4"})
    @EmptySource
    @NullSource
    @NullAndEmptySource //empty와 null을 동시에 파라미터로 넘김
    void ParameterizedTest2(String str) {
        System.out.println(str);
    }

    @DisplayName("파라미터 출력1")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @ValueSource(ints ={10, 20, 30})
    void ParameterizedTest3(@ConvertWith(ArgumentConvert.class) Study study) {
        System.out.println(study.getLimit());
    }

    @DisplayName("파라미터 출력2")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @CsvSource({"10, '자바 테스트1'" ,"20, '파이썬 테스트1'"})
    void ParameterizedTest4(Integer limit, String name) {
        System.out.println(new Study(limit,name));
    }


    static class ArgumentConvert extends SimpleArgumentConverter { //1개의 argument에 사용
        @Override
        protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
            assertEquals(Study.class, targetType,"can only covert to Study" );
            return new Study(Integer.parseInt(source.toString()));
        }
    }

    @DisplayName("파라미터 출력3")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @CsvSource({"30, '자바 테스트2'" ,"40, '파이썬 테스트2'"})
    void ParameterizedTest5(ArgumentsAccessor argumentsAccessor) {
        System.out.println(new Study(argumentsAccessor.getInteger(0),argumentsAccessor.getString(1)));
    }

    @DisplayName("파라미터 출력4")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @CsvSource({"50, '자바 테스트3'", "60, '파이썬 테스트3'"})
    void ParameterizedTest6(@AggregateWith(Aggregator.class) Study study) {
        System.out.println(study.getLimit()+" "+ study.getName());
        System.out.println(study);
    }

     static class Aggregator implements ArgumentsAggregator {
        @Override
        public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException {
            Study study = new Study(accessor.getInteger(0),accessor.getString(1));
            return study;
        }
    }
}

 

 

테스트 인스턴스

package hello.test;

import org.hibernate.resource.transaction.spi.DdlTransactionIsolator;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.RegisterExtension;

//@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
//@TestInstance(TestInstance.Lifecycle.PER_CLASS)  //테스트클래스의 테스트메소드간 인스턴스 공유
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)  //테스트 순서 지정
//@ExtendWith(TestExtension.class) // extension 을 선언적으로 등록하는 방법
public class InstanceTest {

    int value = 1;

    @RegisterExtension //extension 을 프로그래밍하여 등록하는 방법
    static TestExtension testExtension = new TestExtension(500L);

    @DisplayName("인스턴스 테스트")
    @Test
    @Order(2) //2번째로 실행
    void instance_Test1() {
        System.out.println("instance test1:" + value++);
    }

    @DisplayName("인스턴스 테스트")
    @Test
    @Order(1) //첫번째로 실행
    @Disabled
    void instance_Test2() {
        System.out.println("instance test2:" + value++);
    }

    @Test
    @Order(3) //세번째로 실행
    void instance_Test3() {
        System.out.println("instance test3:" + value);
    }

    @BeforeAll
    void beforeAll() {
        System.out.println("beforeAll");
    }

    @AfterAll
    void afterAll() {
        System.out.println("afterAll");
    }

    @Test
    void create_new() {
        try {
            Thread.sleep(1005L);
            System.out.println(this);
            System.out.println("test");
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

 

Extension 클래스

package hello.test;

import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
import org.junit.jupiter.api.extension.ExtensionContext;

import java.lang.reflect.Method;

public class TestExtension implements BeforeTestExecutionCallback, AfterTestExecutionCallback {

    private long THRESHOLD;

    public TestExtension(long THRESHOLD) {
        this.THRESHOLD = THRESHOLD;
    }

    @Override
    public void beforeTestExecution(ExtensionContext context) throws Exception {
        ExtensionContext.Store store = getStore(context);
        store.put("startTime", System.currentTimeMillis());
    }

    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception {
        Method requiredTestMethod = context.getRequiredTestMethod();
        SlowTest annotation = requiredTestMethod.getAnnotation(SlowTest.class);
        String testMethodName = requiredTestMethod.getName();
        ExtensionContext.Store store = getStore(context);
        long start_time = store.remove("startTime", long.class);
        long duration = System.currentTimeMillis() - start_time;
        if (duration > THRESHOLD && annotation == null) {
            System.out.printf("please consider mark method [%s] with @SlowTest.\n", testMethodName);
        }
    }

    private ExtensionContext.Store getStore(ExtensionContext context) {
        String testClassName = context.getRequiredTestClass().getName();
        String testMethodName = context.getRequiredTestMethod().getName();
        ExtensionContext.Store store = context.getStore(ExtensionContext.Namespace.create(testClassName, testMethodName));
        return store;
    }
}

' > JUnit5' 카테고리의 다른 글

JUnit5  (0) 2022.02.27

JUnit5 란?

자바 개발자가 단위테스트 작성시 가장 많이 사용하는 테스트 프레임워크

https://junit.org/junit5/docs/current/user-guide/#overview-what-is-junit-5

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

JUnit5 구조

  • JUnit Platform
    • JVM에서 테스트 프레임워크를 시작하기 위한 기반 역할
  • Vintage
    • JUnit3, JUnit4 지원하기 위한 TestEngine
  • Jupiter
    • JUnit5를 제공

' > JUnit5' 카테고리의 다른 글

샘플 테스트  (0) 2022.02.27

리펙토링 Extract

  windows/Linux : Ctrl + Alt + v

 

디렉토리, 패키지, 클래스 생성목록 확인

  windows/Linux: Ctrl + insert

 

생성자/setter/getter 생성

  windows/Linux: Alt + insert

 

패키지 import  // lambda식으로 변경

  windows/Linux: Alt + Enter

 

파일 생성

  windows/Linux: Ctrl + Alt + Insert

 

자동정렬

  windows/Linux: Ctrl + Alt + L

 

소스코드 뒤로가기/앞으로 가기

  windows/Linux: Ctrl + Alt + <ㅡ or ㅡ>

 

Refator this

  windows/Linux: Ctrl + Alt + Shift + T

 

특정 문자 찾기

  windows/Linux: Ctrl + Shift + F

 

undo / do

  windows/Linux: Ctrl + z / Ctrl + Shift + z

  • # systemctl status mongod
    • mongo daemon 실행확인
  • # mongo
    • mongo shell 접속
  • # show dbs
    • 현재 db 조회
  • # use mydb
    • database 선택(없으면 생성)

 

  • #db
    • 현재 database 조회
  • # show collections
    • 현재사용중인 database의 collection들을 조회
  • #db.createCollection("XXX")
    • 현재 database에 collection 생성

 

  • collection생성시 capped 설정 - 생성시 제한된 크기로 생성된 공간에서만 데이터를 저장하는 설정 (고성능, 저장공간 차면 기존 공간 재사용)
    • # db.createCollection("capped_t", {capped:true, size:10000})
      • collection생성 및 capped 설정
    • # db.capped_t.isCapped()
      • collection이 capped 여부 조회

  • 이미 생성된 collection에 capped 설정
    • db.runCommand( { convertToCapped: "noCapped", size: 1024 } )

 

  • # db.cafe.insertOne({subject:"coffee", author:"jaon", views: 50 } )
    • collection에 1개의 document를 추가(만약 cafe라는 collection이 없다면 자동으로 생성해서 추가됨)

'데이터베이스 > mongodb' 카테고리의 다른 글

mongodb 설치  (0) 2021.10.20

mongodb 설치

설치환경: AWS Ubuntu 20.04.3 LTS

 

:~# wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
:~# echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
:~# sudo apt-get update
:~# sudo apt-get install -y mongodb-org
:~# sudo service mongod start
:~# systemctl enable mongod.service
  • 기본으로 27017 port를 사용한다

 

 

 

Robomongo 설치

  •  mongodb GUI tool

https://robomongo.org/download

 

Robomongo

Robo 3T: the hobbyist GUI Robo 3T 1.4 brings support for MongoDB 4.2, and a mongo shell upgrade from 4.0 to 4.2, with the ability to manually specify visible databases.   Download Robo 3T

robomongo.org

 

'데이터베이스 > mongodb' 카테고리의 다른 글

mongo 기본명령어  (0) 2021.10.24

Shell script?

  • 리눅스 command들을 단계적으로 수행하는것
  • 리눅스 command들을 모아 놓은 ASCII Text 파일
  • 특징
    • 실행 권한을 할당해야 실행가능
    • shell 구문은 기본 top-down 방식으로 해석해서 실행
    • # : 주석
    • #! /bin/bash : 셔뱅.해시뱅. 스크립트를 실행할 sub shell 이름
      • shell script를 만드는데 해당 sub shell로 실행
      • 해당 셔뱅을 넣지 않으면 login shell과 동일한 sub shell로 실행

sub shell? 

fastwon1@docker-ubuntu:~$ /bin/bash   // sub shell 실행
fastwon1@docker-ubuntu:~$ name=jaon   // 변수생성
fastwon1@docker-ubuntu:~$ echo $name  // 조회
jaon
fastwon1@docker-ubuntu:~$ exit // sub shell 종료
exit
fastwon1@docker-ubuntu:~$ echo $name // sub shell에서 생성한 변수 조회

fastwon1@docker-ubuntu:~$ exit
fastwon1@docker-ubuntu:~/ta$ export TEST=1    // parent shell에서 환경변수 설정
fastwon1@docker-ubuntu:~/ta$ env | grep TEST  // 환경변수 조회
TEST=1
fastwon1@docker-ubuntu:~/ta$ /bin/bash // sub shell 실행
fastwon1@docker-ubuntu:~/ta$ env | grep TEST // parent shell에서 설정한 환경변수 조회
TEST=1
fastwon1@docker-ubuntu:~$ export TEST4=1     // sub shell에서 환경변수 설정
fastwon1@docker-ubuntu:~$ env | grep TEST4   // sub shell에서 조회
TEST4=1
fastwon1@docker-ubuntu:~$ exit
exit
fastwon1@docker-ubuntu:~$ env | grep TEST4   // parent shell에서 환경변수 조회
fastwon1@docker-ubuntu:~$
fastwon1@docker-ubuntu:~$ cat > test.sh  //shift+insert ctrl+d
  • sub shell에서 생성한 변수는 sub shell 종료 후 조회할 수 없다.
  • parent shell에서 만든 환경변수는 sub shell에서 조회할 수 있다.
  • sub shell에서 만든 환경변수는 parent shell에서 조회할 수 없다.

 

Positional Parameters(위치 매개변수)

  • 입력하는 argument들을 $0, $1, $2와 같은 변수에 저장되어 스크립트로 전달
  • $0 : 스크립트 이름
  • $1 , $2 : 첫번째, 두번째 argument
  • $# : argument 수
  • $@ , $* : argument 파라미터 리스트
  • $$ : 로그인 shell의 process ID
  • $PWD : 현재 작업 디렉토리
  • $PPID : parent process ID
fastwon1@docker-ubuntu:~$ test.sh arg1 arg2 arg3 ....  \
>                          $0      $1   $2   $3 ..... $9 ${10}  //해당변수로 채워져서 스크립트로 전달
fastwon1@docker-ubuntu:~$ ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
fastwon1    7953    7952  0  8월31 pts/0  00:00:00 -bash
fastwon1   14551    7953  0 03:10 pts/0    00:00:00 ps -f
fastwon1@docker-ubuntu:~$ echo $$
7953  //현재 shell의 process ID
fastwon1@docker-ubuntu:~$ echo $PWD  
/home/fastwon1
fastwon1@docker-ubuntu:~$ echo $PPID
7952  //현재 shell의 parent process ID
fastwon1@docker-ubuntu:~$
fastwon1@docker-ubuntu:~$
fastwon1@docker-ubuntu:~$


.....샘플테스트1
fastwon1@docker-ubuntu:~/test2$ cat parm_exam.sh -n
     1	#! /bin/bash
     2	
     3	echo "This script name : $0"
     4	echo "This first argument: $1"
     5	echo "This second argument: $2"
     6	echo "This third argument: $3"
     7	echo "This number of argument: $#"
     8	echo "This list of arguments: $@"
     9	echo "THis list of argument : $*"
    10	
fastwon1@docker-ubuntu:~/test2$ ./parm_exam.sh arg1 arg2 arg3
This script name : ./parm_exam.sh
This first argument: arg1
This second argument: arg2
This third argument: arg3
This number of argument: 3
This list of arguments: arg1 arg2 arg3
THis list of argument : arg1 arg2 arg3
fastwon1@docker-ubuntu:~/test2$


......샘플테스트2
fastwon1@docker-ubuntu:~/test2$ 
fastwon1@docker-ubuntu:~/test2$ cat ./parm_exam2.sh -n
     1	#! /bin/bash
     2	
     3	echo "[$1 directory]"
     4	echo $(date +%c)
     5	du -sh $1 2> /dev/null
     6	echo
fastwon1@docker-ubuntu:~/test2$ ./parm_exam2.sh /var/
[/var/ directory]
2021년 09월 01일 (수) 오전 03시 30분 02초
2.2G	/var/

fastwon1@docker-ubuntu:~/test2$


ls -la /usr/bin | grep "^-" | awk '{print $9}'




....echo 테스트
fastwon1@docker-ubuntu:~$ echo "hello"
hello
fastwon1@docker-ubuntu:~$ echo "hello\nworld"
hello\nworld
fastwon1@docker-ubuntu:~$ echo -e "hello\nworld"
hello
world
fastwon1@docker-ubuntu:~$ echo -e "hello\tworld"
hello	world
fastwon1@docker-ubuntu:~$ echo -e "hello\aworld"
helloworld
fastwon1@docker-ubuntu:~$ echo -e "hello\aworld"
helloworld
fastwon1@docker-ubuntu:~$ echo -n "hello"  //echo출력을 개행하지 않음.
hellofastwon1@docker-ubuntu:~$



....read 테스트
fastwon1@docker-ubuntu:~$ read tmp
1234
fastwon1@docker-ubuntu:~$ echo $tmp
1234
fastwon1@docker-ubuntu:~$ 
fastwon1@docker-ubuntu:~$ read name score
jaon 80
fastwon1@docker-ubuntu:~$ echo $name $score
jaon 80
fastwon1@docker-ubuntu:~$ read name score
jaon 80 classA
fastwon1@docker-ubuntu:~$ echo $score
80 classA
fastwon1@docker-ubuntu:~$ read -t10 -n8 passwd  //10초동안 8글자만 입력받음
fastwon1@docker-ubuntu:~$ read -t10 -n8 passwd  
12345678fastwon1@docker-ubuntu:~$ echo $passwd 
12345678
fastwon1@docker-ubuntu:~$ read -t10 -s passwd //10초동안 silent mode(입력받은 글자가 shell에 보이지 않음)로 입력받음
fastwon1@docker-ubuntu:~$ echo $passwd
123456789  
fastwon1@docker-ubuntu:~$ echo -n "name: "; read name
name: jaon
fastwon1@docker-ubuntu:~$ echo $name
jaon

 

printf

  • format
    • %d or %i : 숫자
    • %s : 문자
    • %f  : 실수
fastwon1@docker-ubuntu:~$ printf "hello linux shell\n"
hello linux shell
fastwon1@docker-ubuntu:~$ printf "Name: %s\tScore: %i\n" 
Name: 	Score: 0
fastwon1@docker-ubuntu:~$ printf "Name: %s\tScore: %i\n" JAON 80
Name: JAON	Score: 80
fastwon1@docker-ubuntu:~$ echo $NAME $Score

fastwon1@docker-ubuntu:~$ today=`date +%y-%m-%d-%H-%M-%S`
fastwon1@docker-ubuntu:~$ printf "Today is %s\n" $today
Today is 21-09-01-06-19-32
fastwon1@docker-ubuntu:~$ printf "|%10s|%10s|%10.2f|\n" ubuntu jaon 10  
|    ubuntu|      jaon|     10.00| //오른쪽 정렬되서 10글자까지 출력
fastwon1@docker-ubuntu:~$ 
fastwon1@docker-ubuntu:~$ printf "|%-10s|%-10s|%-10.2f|\n" ubuntu jaon 10
|ubuntu    |jaon      |10.00     |  //왼쪽 정렬되서 10글자까지 출력
fastwon1@docker-ubuntu:~$

 

 

exit

  • 0 : 프로그램 또는 명령이 성공으로 종료했음을 의미
  • 1 - 255
    • 1 : 일반 에러
    • 2: syntax error
    • 126 : 명령을 실행할 수 없음
    • 127 : 명령(파일) 이 존재하지 않음
    • 128 + N : 종료시그널 + N(kill -9 PID로 종료시 128 + 9 137)
  • $? : 종료 값 출력
fastwon1@docker-ubuntu:~$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	
fastwon1@docker-ubuntu:~$ date
2021. 09. 02. (목) 03:30:15 KST
fastwon1@docker-ubuntu:~$ date > /dev/null
fastwon1@docker-ubuntu:~$ echo $?  //직전에 수행한 프로그램의 종료 코드값을 출력
0
fastwon1@docker-ubuntu:~$ date i
date: 잘못된 `i' 날짜
fastwon1@docker-ubuntu:~$ echo $?
1
fastwon1@docker-ubuntu:~$ 
fastwon1@docker-ubuntu:~$ data

명령어 'data' 을(를) 찾을 수 없습니다. 다음 명령어로 시도하시겠습니까:

  deb datliballegro4-dev의 명령어 ' (2:4.4.3.1-1)'
  deb datecoreutils의 명령어 ' (8.30-3ubuntu2)'

Try: sudo apt install <deb name>

fastwon1@docker-ubuntu:~$ echo $?
127  //명령이 존재하지 않음
fastwon1@docker-ubuntu:~$
fastwon1@docker-ubuntu:~$ sleep 1000
^C  //ctrl+c
fastwon1@docker-ubuntu:~$ echo $?
130  //SIGINT
fastwon1@docker-ubuntu:~$

 

비교 연산자

연산자 설명
x -eq y x값과 y값이 같으면 true 리턴
x -gt y x값이 y값보다 크면 true 리턴
x -ge y x값이 y값보다 크거나 같으면 true 리턴
x -lt y x값이 y값보다 작으면 true 리턴
x -le y x값이 y값보다 작거나 같으면 true 리턴
x -ne x값과 y값이 같지 않으면 true 리턴
-e file 파일이 존재하면 true 리턴
-d file 파일이 디렉토리이면 true 리턴
-f file 파일이면 true 리턴
-x file 파일이 실행가능하면 true 리턴
fastwon1@docker-ubuntu:~$ x=10
fastwon1@docker-ubuntu:~$ test $x -lt 5
fastwon1@docker-ubuntu:~$ echo $?
1
fastwon1@docker-ubuntu:~$ test $x -gt 5
fastwon1@docker-ubuntu:~$ echo $?
0
fastwon1@docker-ubuntu:~$ test -e /etc/passwd
fastwon1@docker-ubuntu:~$ echo $?
0
fastwon1@docker-ubuntu:~$ test -e /etc/passw
fastwon1@docker-ubuntu:~$ echo $?
1
fastwon1@docker-ubuntu:~$ test -d /tmp
fastwon1@docker-ubuntu:~$ echo $?
0
fastwon1@docker-ubuntu:~$ test -f /tmp
fastwon1@docker-ubuntu:~$ echo $?
1
fastwon1@docker-ubuntu:~$ 
fastwon1@docker-ubuntu:~$ [ $x -lt 5 ]
fastwon1@docker-ubuntu:~$ echo $?
1
fastwon1@docker-ubuntu:~$ [ $x -gt 5 ]
fastwon1@docker-ubuntu:~$ echo $?
0
fastwon1@docker-ubuntu:~$



fastwon1@docker-ubuntu:~$ a=`expr $a + \( 10 \* 10 \)`
fastwon1@docker-ubuntu:~$ echo $a
111
fastwon1@docker-ubuntu:~$

 

if ~ fi 

fastwon1@docker-ubuntu:~$ cat -n ./a.sh 
     1	#! /bin/bash
     2	
     3	echo -n "input number: "
     4	read x
     5	if [ $x -gt 5 ]
     6	then
     7		echo "$x is grater than 5"
     8	fi
     9	
    10	echo -n "input filePath: "
    11	read filePath
    12	
    13	if [ -e $filePath ]
    14	then
    15		ls -l /etc/passwd
    16	else
    17		echo "$filePath file does not exists"
    18	fi
    19	
fastwon1@docker-ubuntu:~$ ./a.sh 
input number: 10
10 is grater than 5
input filePath: /etc/passwd
-rw-r--r-- 1 root root 2849  8월 30 06:45 /etc/passwd
fastwon1@docker-ubuntu:~$

 

case in    )  )  ;; esc

.......테스트1
fastwon1@docker-ubuntu:~$ cat ./test.sh 
#! /bin/bash

echo -n "Do you want restart(yes/no)? "
read answer
case $answer in
	[yY]es) echo "System restart.";;
	[nN]o) echo "nothing to do.";;
	*) echo "entered incorrectly.";;
esac
fastwon1@docker-ubuntu:~$ ./test.sh 
Do you want restart(yes/no)? yes
System restart.
fastwon1@docker-ubuntu:~$ ./test.sh 
Do you want restart(yes/no)? Yes
System restart.
fastwon1@docker-ubuntu:~$ ./test.sh 
Do you want restart(yes/no)? no
nothing to do.
fastwon1@docker-ubuntu:~$ ./test.sh 
Do you want restart(yes/no)? No
nothing to do.
fastwon1@docker-ubuntu:~$ ./test.sh 
Do you want restart(yes/no)? y
entered incorrectly.
fastwon1@docker-ubuntu:~$


.......테스트2
fastwon1@docker-ubuntu:~$ cat -n ./case-exam.sh 
     1	#! /bin/bash
     2	
     3	cat << END
     4	-----------------------------
     5	1: Check disk usage
     6	2: Check the login user list
     7	------------------------------
     8	END
     9	echo -n "number:"
    10	read number
    11	case $number in
    12	1) df -h ;;
    13	2) who ;;
    14	*) echo "Bad choise!"
    15		exit 1 ;;
    16	esac
    17	exit 0
fastwon1@docker-ubuntu:~$ ./case-exam.sh 
-----------------------------
1: Check disk usage
2: Check the login user list
------------------------------
number:2
fastwon1 pts/0        2021-09-02 03:29 (10.100.0.2)
fastwon1@docker-ubuntu:~$ ./case-exam.sh 
-----------------------------
1: Check disk usage
2: Check the login user list
------------------------------
number:3
Bad choise!
fastwon1@docker-ubuntu:~$

 

 

expr

  • expr
    • 정수형 산술연산(+, -, *, /, % ), 논리연산(|, &), 관계연산(=, !=, >, >=, <, <=)
    • expr 사용시 제약사항
      1. 전체 문장은 ` 로 묶여야 한다.
      2.  * 와 ( ) 는 특수기호로 인식되므로 연산자로 인식하기 위해서는 \ 를 앞에 붙여야 한다. 또는 "" ''
      3. 연산에 들어간 모든 변수, 숫자, 기호 사이에는 공백이 있어야 한다.
      4. = 에는 공백이 없어야 한다.
fastwon1@docker-ubuntu:~$ 
fastwon1@docker-ubuntu:~$ type expr   // expr은 bash shell에 종속적이지 않다.
expr 는 /usr/bin/expr 임
..........expr 테스트
fastwon1@docker-ubuntu:~$ a=10
fastwon1@docker-ubuntu:~$ echo $a
10
fastwon1@docker-ubuntu:~$ a=`expr $a + 1`
fastwon1@docker-ubuntu:~$ echo $a
11
fastwon1@docker-ubuntu:~$ expr 5 + 5
10
fastwon1@docker-ubuntu:~$ x=10
fastwon1@docker-ubuntu:~$ expr $x - 10
0
fastwon1@docker-ubuntu:~$ expr $x '*' 2
20
fastwon1@docker-ubuntu:~$ expr $x '/' 2
5
fastwon1@docker-ubuntu:~$ expr $x '%' 2
0
fastwon1@docker-ubuntu:~$ x=10
fastwon1@docker-ubuntu:~$ x=$(expr $x + 1)
fastwon1@docker-ubuntu:~$ echo $x
11
fastwon1@docker-ubuntu:~$ x=$(expr $x + 1)
fastwon1@docker-ubuntu:~$ echo $x
12
fastwon1@docker-ubuntu:~$
fastwon1@docker-ubuntu:~$ x=10; y=20; z=$(expr $x '|' $y); echo $z
10
fastwon1@docker-ubuntu:~$ x=10; y=20; z=$(expr $x '&' $y); echo $z
10
fastwon1@docker-ubuntu:~$ x=10; y=20; z=$(expr $x '==' $y); echo $z
0
fastwon1@docker-ubuntu:~$ x=10; y=20; z=$(expr $x '!=' $y); echo $z
1
fastwon1@docker-ubuntu:~$ x=10; y=20; z=$(expr $x '<=' $y); echo $z
1
fastwon1@docker-ubuntu:~$ x=10; y=20; z=$(expr $x '>=' $y); echo $z
0
fastwon1@docker-ubuntu:~$

 

let

  • 정수형 산술연산, bit연산(<<, >>, &, |), 논리연산(&&, ||), 단항연산(++, +=, -=)
fastwon1@docker-ubuntu:~$ type let    // let은 bash shell에 종속된command이다.
let 는 쉘 내장임
fastwon1@docker-ubuntu:~$
........let 테스트
fastwon1@docker-ubuntu:~$ let sum=5+5
fastwon1@docker-ubuntu:~$ echo $sum
10
fastwon1@docker-ubuntu:~$ let sum=5*5
fastwon1@docker-ubuntu:~$ echo $sum
25
fastwon1@docker-ubuntu:~$  //let은 산술연산을 수행하는 command(+ - * /)

fastwon1@docker-ubuntu:~$ x=1
fastwon1@docker-ubuntu:~$ let x=x+1
fastwon1@docker-ubuntu:~$ echo $x
2
fastwon1@docker-ubuntu:~$ let x++
fastwon1@docker-ubuntu:~$ echo $x
3
fastwon1@docker-ubuntu:~$ let x+=1
fastwon1@docker-ubuntu:~$ echo $x
4
fastwon1@docker-ubuntu:~$ let x+=2
fastwon1@docker-ubuntu:~$ echo $x
6
fastwon1@docker-ubuntu:~$ x=1
fastwon1@docker-ubuntu:~$ ((x=x+1))
fastwon1@docker-ubuntu:~$ echo $x
2
fastwon1@docker-ubuntu:~$ ((x++))
fastwon1@docker-ubuntu:~$ echo $x
3
fastwon1@docker-ubuntu:~$

 

While

  • While 다음의 조건이 성공하는 동안 do~done 사이의 명령어 반복
fastwon1@docker-ubuntu:~$ cat -n ./while-exam.sh 
     1	#! /bin/bash
     2	
     3	num=10
     4	while [ $num -le 20 ]
     5	do 
     6		echo Number: $num
     7		((num++))
     8	done
     9	
fastwon1@docker-ubuntu:~$ ./while-exam.sh 
Number: 10
Number: 11
Number: 12
Number: 13
Number: 14
Number: 15
Number: 16
Number: 17
Number: 18
Number: 19
Number: 20
fastwon1@docker-ubuntu:~$

 

until

  • until 다음의 조건이 성공할때까지 동안 do~done 사이의 명령어 반복
fastwon1@docker-ubuntu:~$ cat -n ./until-exam.sh 
     1	#! /bin/bash
     2	
     3	x=10
     4	until [ $x -gt 20 ]
     5	do
     6		echo Number: $x
     7		((x++))
     8	done	
fastwon1@docker-ubuntu:~$ ./until-exam.sh 
Number: 10
Number: 11
Number: 12
Number: 13
Number: 14
Number: 15
Number: 16
Number: 17
Number: 18
Number: 19
Number: 20
fastwon1@docker-ubuntu:~$

 

 

Test

fastwon1@docker-ubuntu:~/test4$ cat -n ./add_user.sh 
     1	#! /bin/bash
     2	
     3	echo -n "New userName: "
     4	read userName
     5	while getent passwd $userName &> /dev/null #유저가 존재하지 않을때까지
     6	do
     7		echo "Sorry that account $userName is already taken, Please pick a different username."
     8		echo -n "New userName: "
     9		read userName
    10	done
    11	sudo useradd -m -s /bin/bash $userName
    12	echo $(id $userName)
fastwon1@docker-ubuntu:~/test4$

유저생성

 

fastwon1@docker-ubuntu:~/test4$ cat -n ./delete_user.sh 
     1	#! /bin/bash
     2	
     3	echo -n "Enter userName for delete: "
     4	read userName
     5	until getent passwd $userName &> /dev/null #유저가 존재할때까지
     6	do
     7		echo "Sorry that account $userName not exists"
     8		echo -n "Enter userName for delete: "
     9		read userName
    10	done
    11	sudo userdel -r $userName > /dev/null 2>&1
    12	result=$?
    13	if [ $result -eq 0 ] 
    14	then
    15		echo "Succeed to delete $userName"
    16	else
    17		echo "Failed to delete $userName"
    18	fi
fastwon1@docker-ubuntu:~/test4$

유저삭제

fastwon1@docker-ubuntu:~/test4$ cat -n ./whileif.sh 
     1	#! /bin/bash
     2	
     3	num=0
     4	while [ $num -lt 5 ]
     5	do
     6		echo "Number: $num"
     7		((num++))
     8		if [ "$num" == '2' ];then
     9		break 
    10		fi
    11	done
fastwon1@docker-ubuntu:~/test4$

 

 

for

  • 주어진 list만큼 do~done사이의 command를 반복실행
//////////////////////////////////////////////////////////////////////////
fastwon1@docker-ubuntu:~/test4$ cat -n ./for.sh 
     1	for NUM in $(seq 5)
     2	do 
     3		echo $NUM; done
     4	
fastwon1@docker-ubuntu:~/test4$
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
fastwon1@docker-ubuntu:~/test4$ ls 
delete_user.sh  for.sh  for2.sh  result  test.sh  whileif.sh
fastwon1@docker-ubuntu:~/test4$ cat -n ./for2.sh 
     1	for file in *
     2	do
     3	ls $file
     4	done
fastwon1@docker-ubuntu:~/test4$ ./for2.sh 
delete_user.sh
for.sh
for2.sh
result
test.sh
whileif.sh
fastwon1@docker-ubuntu:~/test4$
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
     1	#! /bin/bash
     2	arr=(9 8 7)
     3	arr2=("test1" "test2" "test3")
     4	for item in ${arr[@]};
     5	do
     6		echo $item
     7	done
     8	for item in ${arr2[@]};
     9	do
    10		echo $item
    11	done
fastwon1@docker-ubuntu:~/test4$ 
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
fastwon1@docker-ubuntu:~/test4$ cat -n ./directory.sh 
     1	#! /bin/bash
     2	
     3	if [ ! -d ~/bachup ] 
     4	then
     5		mkdir ~/backup > /dev/null 2>&1
     6	fi
     7	for FILE in *
     8	do
     9		cp $FILE ~/backup/$FILE.old
    10	done
fastwon1@docker-ubuntu:~/test4$ 
//////////////////////////////////////////////////////////////////////////

 

fastwon1@docker-ubuntu:~/test4$ cat -n ./directory.sh 
     1	#! /bin/bash
     2	
     3	echo -n "enter directory path: "
     4	read path
     5	diCnt=0
     6	fiCnt=0
     7	echo $path
     8	for file in $path/*
     9	do
    10		if [ -d $file ];then
    11			((diCnt++))
    12		else
    13			((fiCnt++))
    14		fi
    15	done
    16	echo "directory count:" $diCnt
    17	echo "file count:" $fiCnt
fastwon1@docker-ubuntu:~/test4$ ./directory.sh 
enter directory path: /var/log
/var/log
directory count: 11
file count: 48
fastwon1@docker-ubuntu:~/test4$ ls -l /var/log | grep ^d | wc -l  //directory갯수 출력
11
fastwon1@docker-ubuntu:~/test4$ ls -l /var/log | grep ^- | wc -l //파일수 출력
48
fastwon1@docker-ubuntu:~/test4$

 

Shell

  • 사용자 명령어 해석기
  • 사용자가 입력한 명령어를 해석하여 Linux kernel에 전달

 

Shell 종류

종류 의미
Bourne shell(sh) AT&T 벨 연구소에서 개발한 Original shell
C shell(csh, tcsh) C언어 문법을 적용하여 만든 shell
History, aliases, job control, vi command edting and completetion 기능을 포함
korn shell(ksh) 기존 bourne shell에 C shell의 기능을 포함
Bourne-again shell(bash) GNU project로 만들어졌으며 csh, ksh이 가진 기능 포함하고있으며 bourne shell과 호환성이 높인 shell
MAC OS 기본 shell

 

 

fastwon1@docker-ubuntu:~$ cat /etc/shells         //현재 시스템에서 사용가능한 shell목록 출력
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
fastwon1@docker-ubuntu:~$ echo $SHELL              //현재 user의 shell 조회
/bin/bash
fastwon1@docker-ubuntu:~$ sudo chsh fastwon1       //shell변경
[sudo] fastwon1의 암호: 
fastwon1의 로그인 쉘을 변경하고 있습니다
새로운 값을 넣거나, 기본값을 원하시면 엔터를 치세요
	로그인 쉘 [/bin/bash]: /bin/sh
fastwon1@docker-ubuntu:~$ sudo grep fastwon1 /etc/passwd
fastwon1:x:1000:1000:fastwon1,,,:/home/fastwon1:/bin/sh
fastwon1@docker-ubuntu:~$

기본 조회

 

 

Shell의 변수?

  • 데이터를 담는 그릇
  • 선언할 필요없이 사용가능
  • 변수명: 문자, 숫사, _로 구성, 시작은 반드시 문자나 _로 시작
fastwon1@docker-ubuntu:~$ 
fastwon1@docker-ubuntu:~$ name=jh                    //변수 선언
fastwon1@docker-ubuntu:~$ echo $name                 //변수 조회
jh
fastwon1@docker-ubuntu:~$ set | grep name            // 변수 조회(현재 시스템에 존재하는 변수조회)
name=jh
        __git_eread "$g/rebase-merge/head-name" b;
                __git_eread "$g/rebase-apply/head-name" b;
        __git_ps1_branch_name=$b;
        b="\${__git_ps1_branch_name}";
    local upstream=git legacy="" verbose="" name="";
            name)
                name=1
        if [[ -n "$count" && -n "$name" ]]; then
            __git_ps1_upstream_name=$(git rev-parse 				--abbrev-ref "$upstream" 2>/dev/null);
                p="$p \${__git_ps1_upstream_name}";
                p="$p ${__git_ps1_upstream_name}";
                unset __git_ps1_upstream_name;
            COMPREPLY=($( apt-cache pkgnames $cur 2> /dev/null ))
    param="$dashoptions            $( apt-cache pkgnames $cur 2> /dev/null )            $( command ps axo pid | sed 1d )            $( _apport_symptoms )            $( compgen -G "${cur}*" )";
    compopt -o filenames;
        compopt -o filenames;
        compopt -o filenames 2> /dev/null;
        compopt -o filenames;
        COMPREPLY+=($(compgen -A hostname -P "$prefix$user" -S "$suffix" -- "$cur"));
_pnames () 
        [[ $result -gt 0 ]] && compopt -o filenames 2> /dev/null;
        echo "bash_completion: $FUNCNAME: usage: $FUNCNAME" "[-v varname value] | [-aN varname [value ...]] ..." 1>&2;
    local userland=$(uname -s);
fastwon1@docker-ubuntu:~$ unset name                               //변수 제거
fastwon1@docker-ubuntu:~$ echo $name

fastwon1@docker-ubuntu:~$

변수 선언 조회 제거

 

 

Shell의 환경변수?

  • 동작 되는 프로그램에게 영향을 주는 변수
  • 실행되는 애플리케이션에서 전달

환경변수 선언

  • export valName=value
fastwon1@docker-ubuntu:~$ export NAME=jh                   //환경변수 설정
fastwon1@docker-ubuntu:~$ echo $NAME                       //환경변수 조회
jh
fastwon1@docker-ubuntu:~$ env | grep NAME                  //환경변수 조회
NAME=jh
LOGNAME=fastwon1
fastwon1@docker-ubuntu:~$ echo $HOME
/home/fastwon1
fastwon1@docker-ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
fastwon1@docker-ubuntu:~$ echo $USER
fastwon1
fastwon1@docker-ubuntu:~$ echo $SHELL
/bin/bash
fastwon1@docker-ubuntu:~$

환경변수 설정 및 조회

 

 

Metacharacters

  • Shell에서 특별히 의미를 정해 놓은 문자들
Metacharacters 의미
&&  || AND, OR 문자
< > >> redirection 문자
* ? [ ] {} glob 문자

[] : 집합
"" '' \ Quoting 문자 : 메타문자의 의미를 제거하고 단순 문자로 변경

Double Quotes("") : "" 내의 모든 메타문자의 의미를 제거, 단 $, ``는 제외
Single Quotes('')'' 내의 모든 메타문자의 의미를 제거
Bachslash(\) : \ 바로 뒤에오는 메타 문자의 의미를 제거
() nesting command

$(command)
`command`

$ echo "Today is $(date)"
$ echo "Today is `date`"
alias shell 명령어에 새로운 이름을 부여
명령들을 조합하여 새로운 이름의 명령생성

alias 등록: alias name='command'
alias 확인: alias or alias name
alias 삭제: unalias name
root@docker-ubuntu:/home/fastwon1/tmp# echo *          //모든 파일이름 출력
abc test1 test2 test3 test4 test5 tt
root@docker-ubuntu:/home/fastwon1/tmp# echo a*         //a로 시작하는 파일이름 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# echo ab*        //ab로 시작하는 파일이름 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# echo ?          // 파일이름의 길이가 1인 파일 출력
?
root@docker-ubuntu:/home/fastwon1/tmp# echo ???        // 파일이름의 길이가 3인 파일 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# echo ????       // 파일이름의 길이가 4인 파일 출력
????
root@docker-ubuntu:/home/fastwon1/tmp# echo ?????      // 파일이름의 길이가 5인 파일 출력
test1 test2 test3 test4 test5
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc  test1  test2  test3  test4  test5  tt
root@docker-ubuntu:/home/fastwon1/tmp# touch sequenceFileName{1..10} //파일이름에 1~10까지의 순서를 붙여서 파일생성 
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc                sequenceFileName10  sequenceFileName3  sequenceFileName5  sequenceFileName7  sequenceFileName9  test2  test4  tt
sequenceFileName1  sequenceFileName2   sequenceFileName4  sequenceFileName6  sequenceFileName8  test1              test3  test5
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc                sequenceFileName10  sequenceFileName3  sequenceFileName5  sequenceFileName7  sequenceFileName9  test2  test4  tt
sequenceFileName1  sequenceFileName2   sequenceFileName4  sequenceFileName6  sequenceFileName8  test1              test3  test5
root@docker-ubuntu:/home/fastwon1/tmp# ls [a-z]*   // a~z까지 문자 중 하나를 가지는 파일 출력
abc                sequenceFileName10  sequenceFileName3  sequenceFileName5  sequenceFileName7  sequenceFileName9  test2  test4  tt
sequenceFileName1  sequenceFileName2   sequenceFileName4  sequenceFileName6  sequenceFileName8  test1              test3  test5
root@docker-ubuntu:/home/fastwon1/tmp# ls [s-z]*  // s~z까지 문자 중 하나를 가지는 파일 출력
sequenceFileName1   sequenceFileName2  sequenceFileName4  sequenceFileName6  sequenceFileName8  test1  test3  test5
sequenceFileName10  sequenceFileName3  sequenceFileName5  sequenceFileName7  sequenceFileName9  test2  test4  tt
root@docker-ubuntu:/home/fastwon1/tmp# ls [t-z]* // t-z까지 문자중 하나를 가지는 파일 출력
test1  test2  test3  test4  test5  tt
root@docker-ubuntu:/home/fastwon1/tmp# ls
abc                sequenceFileName10  sequenceFileName3  sequenceFileName5  sequenceFileName7  sequenceFileName9  test2  test4  tt
sequenceFileName1  sequenceFileName2   sequenceFileName4  sequenceFileName6  sequenceFileName8  test1              test3  test5
root@docker-ubuntu:/home/fastwon1/tmp# ls [^s]*  // s로 시작하는 파일이름 제외하여 출력
abc  test1  test2  test3  test4  test5  tt
root@docker-ubuntu:/home/fastwon1/tmp# ls [^s-t]* // s~t까지로 시작하는 파일이름 제외하여 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# ls [s^]* // s로 시작하는 파일만 출력
sequenceFileName1   sequenceFileName2  sequenceFileName4  sequenceFileName6  sequenceFileName8
sequenceFileName10  sequenceFileName3  sequenceFileName5  sequenceFileName7  sequenceFileName9
root@docker-ubuntu:/home/fastwon1/tmp# ls [^s^t]* //s , t로 시작하는 파일을 제외하여 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# ls [a^]* // a로 시작하는 파일만 출력
abc
root@docker-ubuntu:/home/fastwon1/tmp# date     // 현재시간 출력
2021. 08. 27. (금) 04:09:00 KST
root@docker-ubuntu:/home/fastwon1/tmp# 
root@docker-ubuntu:/home/fastwon1/tmp# echo 'Today is date' // 현재시간 출력 실패
Today is date
root@docker-ubuntu:/home/fastwon1/tmp# echo 'Today is $(date)' //현재시간 출력 실패
Today is $(date)
root@docker-ubuntu:/home/fastwon1/tmp# echo "Today is $(date)" //현재 시간 출력
Today is 2021. 08. 27. (금) 04:09:19 KST
root@docker-ubuntu:/home/fastwon1/tmp# echo "Today is `date`" // $(date)와 동일하게 출력
Today is 2021. 08. 27. (금) 04:10:57 KST
root@docker-ubuntu:/home/fastwon1/tmp# date +%Y-%d-%m-%H-%M-%S  //date를 formatting하여 출력
2021-27-08-04-16-25
root@docker-ubuntu:/home/fastwon1/tmp# touch report-$(date  +%Y-%d-%m-%H-%M-%S) //formatting한 문자로 파일생성
root@docker-ubuntu:/home/fastwon1/tmp# ls
report-2021-27-08-04-16-41
root@docker-ubuntu:/home/fastwon1/tmp# touch report-`date  +%Y-%d-%m-%H-%M-%S` //formatting한 문자로 파일생성
root@docker-ubuntu:/home/fastwon1/tmp# ls
report-2021-27-08-04-16-41  report-2021-27-08-04-16-54
root@docker-ubuntu:/home/fastwon1/tmp#

metacharacter 테스트

 

root@docker-ubuntu:/home/fastwon1/tmp# alias c=clear    //alias 설정
root@docker-ubuntu:/home/fastwon1/tmp# alias
alias c='clear'  //확인
alias comp='docker-compose'
alias cri='docker rmi -f `docker images -a -q`'
alias crm='docker rm -f `docker ps -a -q`'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias h='history'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias rm='rm -i'
root@docker-ubuntu:/home/fastwon1/tmp# unalias c        //alias 삭제
root@docker-ubuntu:/home/fastwon1/tmp# alias
alias comp='docker-compose'
alias cri='docker rmi -f `docker images -a -q`'
alias crm='docker rm -f `docker ps -a -q`'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias h='history'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias rm='rm -i'
root@docker-ubuntu:/home/fastwon1/tmp#

alias 등록 삭제

 

Shell Prompt란?

  • PS1 변수를 이용해 shell의 기본 프롬프트 모양을 설정
특수문자 의미
\h 호스트이름
\u 사용자 이름
\w 절대경로 작업디렉토리
\W 상대경로 작업디렉토리
\d 오늘날짜
\t 현재시간
\$ $또는 # 프롬프트 모양

 

 

Redirection

Communication Channels Redirection
characters
의 미
STDIN 0< 0<< 입력을 키보드가 아닌 파일을 통해 받음
STDOUT 1> 1>> 표준 출력을 터미널이 아닌 파일로 출력
STDERR 2> 2>> 표준 에러 출력을 터미널이 아닌 파일로 출력
&     1>과 2>을 동시에 의미

program &> result.txt
==
program >> result.txt 2>&1


cat /etc/error.txt > /dev/null 2>&1


2>&1  : STDERR을 STDOUT으로 출력

fastwon1@docker-ubuntu:~/ta$ date > date.out   //date명령어를 date.out로 출력
fastwon1@docker-ubuntu:~/ta$ cat date.out 
2021. 08. 30. (월) 06:59:24 KST
fastwon1@docker-ubuntu:~/ta$ date >> date.out //date명령어를 date.out 파일에 append
fastwon1@docker-ubuntu:~/ta$ cat date.out 
2021. 08. 30. (월) 06:59:24 KST
2021. 08. 30. (월) 06:59:36 KST
fastwon1@docker-ubuntu:~/ta$ ls
date.out
fastwon1@docker-ubuntu:~/ta$ ls date.out date.out2
ls: 'date.out2'에 접근할 수 없습니다: 그런 파일이나 디렉터리가 없습니다
date.out
fastwon1@docker-ubuntu:~/ta$ ls date.out date.out2 2> /dev/null  //error메시지를 /dev/null로 버림
date.out  //정상조회만 출력

Redirection

 

 

Pileline

fastwon1@docker-ubuntu:~$ ls -l | wc -l  //현재파일의 수를 출력
31
fastwon1@docker-ubuntu:~$ 
fastwon1@docker-ubuntu:/etc$ cat passwd | cut -d: -f 1 | sort | wc -l //passwd파일을 : 기준으로 나누고 
//첫번째 field를 정렬하여 유저의 수를 출력 
48
fastwon1@docker-ubuntu:/etc$

 

https://docs.docker.com/compose/

 

Overview of Docker Compose

 

docs.docker.com

Docker Compose란?

  • 여러 Container를 일괄적으로 정의하고 실행할 수 있는 툴
    • Container들을 서비스단위로 묶어서 관리

 

Docker Compose 설치

https://docs.docker.com/compose/install/

 

Install Docker Compose

 

docs.docker.com

 

 

Docker compose yml 파일내 명령어

Docker Compose 명령어 사용예)
version
  compose 버전, 버전에 따라 지원 문법이 다름
version: "2"
services
  컴포즈를 이용해서 실행할 Container 옵션 정의
service:
  webserver:
    image: nginx
  db:
    image: redis
build
  컨테이너 빌드
web:
  build: .
image
  compose를 통해 실행할 이미지를 지정
redis:
  image: redis
command
  Container에서 실행될 명령어 지정
 web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
port
  Container가 공개하는 포트를 나열
 ports:
      - "3000:3000"
link
  다른 Container와 연계할 Container지정
webserver:
  image: wordpress
    link:
      db: mysql
expose
  포트를 링크로 연계된 Container에게만 공개할 포트
services:
  nginx:
    build: .
    expose:
      - "8080"
volumes
  Container 볼륨 마운트지정
services:
  db:
    image: postgres
    volumes:
      - /db:/var/lib/postgresql/data
environment
  환경변수 설정
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
restart
  
Container가 종료될 때 적용할 restart 정책
  no: 재시작 되지 않음
  always: Container를 수동으로 끄기 전까지 항상 재시작
  no-failure: 오류가 있을 시에 재시작
    volumes:
      - db_data:/var/lib/mysql
    restart: always
depends_on
  Container 간의 종속성을 정의
  Container간 동작 순서 지정
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db

 

Docker Compose 실행명령어

https://docs.docker.com/compose/reference/

 

Overview of docker-compose CLI

 

docs.docker.com

 

'클라우드 > Docker' 카테고리의 다른 글

Docker network  (0) 2021.08.17
Container volume  (0) 2021.08.15
Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11

Docker Host내 통신

 docker0

  • virtual eth bridge: 172.17.0.0/16
  • L2 network
  • Container 생성시 veth 인터페이스 생성(sandbox)
    • 172.17.X.Y로 IP주소 할당
  • 모든 Container의 gateway역할을 수행
  • container running 시 172.17.X.Y로 IP 주소할당

 

 

 

port-forwarding

https://linux.die.net/man/8/iptables

 

iptables(8) - Linux man page

iptables(8) - Linux man page Name iptables - administration tool for IPv4 packet filtering and NAT Synopsis iptables [-t table] -[AD] chain rule-specification [options] iptables [-t table] -I chain [rulenum] rule-specification [options] iptables [-t table]

linux.die.net

  • port-forwarding 실행
    • -p [sourcePort:destPort] 
      • # docker run --name web1 -d -p 80:80 nginx
    • -p [destPort]
      • random sourcePort가 할당된다.
        • # docker run --name web2 -d -p 80 nginx
    • -P
      •  random sourcePort가 할당되고 해당 container의 dockerfile의 EXPOSE port가 destPort로 지정된다.
        • # docer run --name web3 -P nginx

 

 

 

user defined bridge network 생성

User define bridge network 생성 및 조회

  • network 조회
    • # docker network ls

user define netwrok를 사용하여 container 생성

  • User define bridge network 생성
    • # docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 userdefineNet
  • User define network를 사용하여 container생성
    • # docker run -d --net userdefineNet --ip 192.168.100.2 -p 8888:80 --name webserver3 nginx

 

 

 

Docker Host내 Container간 통신

  • MySQL Container 생성
    • # docker run -d -v /database:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=rootPass -e MYSQL_PASSWORD=wordpressPass mysql:5.7
  • Wordpress Container 생성
    • # docker run -d --name wordpress --link mysql:db -e WORDPRESS_DB_PASSWORD=wordpressPass -p 80:80 wordpress:4

'클라우드 > Docker' 카테고리의 다른 글

Docker Compose  (0) 2021.08.18
Container volume  (0) 2021.08.15
Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11

Volume 옵션을 사용하여 Docker host에 vloume mount를 활용하여 data 영구보존

방식 사용예시
DockerHost <-> Container
-> DockerHost의 volume Mount path 지정
# docker run -d --name db -v /dbdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql
  -> Dockerhost의 /dbdata 폴더를 volume mount하여 Container와 연결
DockerHost <-> Container
-> DockerHost의 vloume Mount path 미지정

# docker run -d --name db -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 mysql
  -> /var/lib/docker/volumes/{UUID}/_data 위치에 volume mount
DockerHost <-> Container
-> Container path ro(read only) 지정
# docker run -v /webdata:/usr/share/nginx/html:ro -d --name web -p 80:80 nginx
  -> Container안에서는 write 불가

 

 

볼륨 마운트를 사용하여 호스트와 Container간 파일공유

  • # docker run -d -p 80:80 --name nginx -v /var/mountTest:/home:ro nginx
    • 호스트의 /var/mountTest/ 디렉토리와 Container /home/ 디렉토리를 readyOnly로 볼륨마운트 지정
      • Container의 home 디렉토리에 w 불가능
      • DockerHost의 /var/mountTest에는 rw 가능
    • rw: 읽기 및 쓰기

'클라우드 > Docker' 카테고리의 다른 글

Docker Compose  (0) 2021.08.18
Docker network  (0) 2021.08.17
Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11

memory관련 옵션

옵션(단위: bytes) 의미
-m, --memory  메모리 제한 # docker run -d -m 256m nginx
--memory-swap  컨테이너의 swap 메모리 설정
memory + swap
default: 기본 메모리 == 메모리의 2배 설정
#docker run -d -m 300m --memory-swap 500m nginx
실제 swap은 200m까지 가능
--memory-reservation 최소 xxx bytes까지는 보장  #docker run -d -m 1g --memory-reservation 300m nginx
--oom-killi-disable 프로세스가 OOM상태에서 프로세스를 kill하지 못하도록 함 #docker run -d -m 200m --oom-kill-disable nginx

 

 

CPU 제한

옵션(단위: core) 의미
--cpus 컨테이너에 할달할 CPU core수 지정 #docker run -d --cpus=".5" nginx
--cpuset-cpus 컨테이너가 사용할 수 있는 CPU core할당
해당 core range에서 동작할 수 있게 지정
#docker run -d --cpuset-cpus 0-3 nginx
--cpu-share 전체 CPU에서 비중을 지정
default: 1024
#docker run -d --cpu-share 2048 nginx

 

 

Block IO 제한

옵션 의미
--blkio-weight
--blkio-weight-device
block IP weight를 지정(10~1000)
default: 500
#docker run -it --rm --blkio-weight 100 ubunbu /bin/bash
--device-read-bps
--device-write-bps
초당 read/write 설정

#docker run -it --rm --device-read-bps /dev/vda:1mb ubunbtu /bin/bash
#docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu /bin/bash
--device-read-iops
--device-write-iops
컨테이너의 read/write 속도 쿼터 설정 #docker run -it --rm --device-read-iops /dev/vda:10 ubuntu /bin/bash
#docker run -it --rm --device-write-iops /dev/vda:10 ubuntu /bin/bash

 

 

docker host에서 container 리소스 확인

  • 위치 /sys/fs/cgroup/memory/docker/container hash값/

 

 

docker stats

  • # docker stats

 

cAdvisor를 통한 리소스모니터링

https://github.com/google/cadvisor

 

GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

Analyzes resource usage and performance characteristics of running containers. - GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

github.com

 

'클라우드 > Docker' 카테고리의 다른 글

Docker network  (0) 2021.08.17
Container volume  (0) 2021.08.15
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11

Registry

  • Container 이미지를 저장하는 저장소

Docker Hub(https://hub.docker.com/)

  • 외부에 공유가능한 Container 저장소
  • Official imagaes, Verified Publisher container images
  • #docker search "docker hub image"

Private Registry

  • 사내 또는 개인 Container 저장소

 

 

Private registry 구현 및 사용

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

  • Docker hub에서 제공하는 official registry image를 통해서 private registry를 구성하고 관리할 수 있다.

 

Private registry 생성

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

Private registry에 push한 image tag변경

  • # docker tag fastwon1/docker-test 127.0.0.1:5000/docker-test

Private registry에 image push

  • # docker push 127.0.0.1:5000/docker-test

단일 [이미지 or 컨테이너] 세부내용 조회

  • docker inspect httpd
    • ex) docker inspect --format '{{.NetworkSettings.Networks.bridge.NetworkID}}' httpd

존재하는 Docker image 전체 삭제

  • # docker rmi `docker images -q -a` -f

앞단계에서 push했던 이미지를 pull하여 확인

  • # docker pull 127.0.0.1:5000/docker-test

 

Private registry에 저장된 이미지 확인

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

이미지의 태그정보확인

  • # curl -X GET http://localhost:5000/v2/docker-test/tags/list

 

 

 

 

'클라우드 > Docker' 카테고리의 다른 글

Container volume  (0) 2021.08.15
Docker resource 관리  (0) 2021.08.14
Docker image 생성 및 테스트  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11
Docker?  (0) 2020.12.27

Dockerfile이란?

  • Container를 만들 수 있도록 하는 명령어들의 집합

ref: docs.docker.com/engine/reference/builder/

 

Dockerfile reference

 

docs.docker.com

 

 

 

Dockerfile 인스트럭션

인스트럭션 설명 형식
FROM 우분투와 같은 운영체제 이름이나 필요한 애플리케이션 이름을 지정 FROM ubuntu:14.04
MAINTANER 이미지를 생성한 사람의 이름 및 정보  
RUN 컨테이너가 빌드될 때 실행할 명령어 RUN ["mv", "1234", "5678"]
EXPOSE 컨테이너 외부에 노출할 포트 지정 EXPOSE 8080
ENV 환경변수 이름지정 ENV abc tmp
echo ${abc}
CMD 컨테이너가 시작될 때 실행할 명령어 CMD ["echo", "1234"]
CMD ["node", "/hello.js"]
ENTRYPOINT 컨테이너가 실행될 때 기본 명령어 지정
(CMD 와 달리 옵션을 넘길 수 있음)
ENTRYPOINT ["python"]
...
$
sudo docker run t 이미지 -c "print('1234')"
WORKDIR 작업할 디렉토리를 세팅 WORKDIR /project
USER 도커 실행 시 사용할 유저 이름 또는 uid 를 지정
설정하지 않으면 기본 root으로 실행
USER user 또는 USER user:group
VOLUME 호스트의 디렉토리를 도커에 연결
커밋 없이 사용 가능하며 주로 로그 수집이나 데이터 저장용도로 사용
VOLUME [/"tmp"]
COPY 컨테이너 빌드시 호스트의 파일이나 디렉토리를 복사할때 사용 COPY file /copy/to/path

ADD 컨터이너 빌드시 호스트의 파일(tar,url포함)을 컨테이너로 복사할때 사용 ADD http://example.com/big.tar.xz /usr/src/things/
ADD rootfs.tar.gz /
ARG    
SHELL 원하는 타입의 쉘을 사용 SHELL ["/ sh ", c"]
SHELL [" cmd ", "/S", "/]
# comment  

 

 

nginx image생성 및 dockerhub push test

  • # docker build -t fastwon1/docker-test .
    • Docker이미지 빌드
  • # docker push fastwon1/docker-test
    • image이름을 [계정/image이름] 형식으로 변경이 필요한경우
      • # docker tag docker-test fastwon1/docker-test
    • Private repository에 push
    • 이미지의 namespace와 자신의 아이디가 일치해야한다
      • # docker tag foo/sample_image:latest username/sample_image:latest
        • namespace가 일치하지 않는다며 태그명 변경으로 해결할 수 있다
    • 에러시 https://hub.docker.com의 id/pass로 docker login이 필요

 

 

Docker history 확인

  • # docker history nginx
    • Docker이미지를 생성하면서 발생한 명령어들을 확인할 수 있다

 

 

Dockerfile 작성 및 apache2 container 생성 테스트

FROM ubuntu:18.04  
LABEL maintainer="jaehwan.jaon <fastwon1@gamil.com>"
RUN apt-get update \
    && apt-get install -y apache2 \
    && apt-get install -y --no-install-recommends apt-utils
RUN echo "apache2 start test" > /var/www/html/index.html
EXPOSE 80
CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"]

 

dockerfile을 이용하여 container 생성

# docker build -t fastwon1/apathc2-test:v1 .

생성한 Docker image로 container 생성
web 접속

 

 

기타

명령어 설명
sudo docker container prune 중지 된 모든 컨테이너를 제거
sudo docker image prune 태그가 없는 모든 이미지 파기
sudo docker system prune 사용하지 않는 모든 데이터 삭제 이미지 , 컨테이너 , 볼륨 , 네트워크등
sudo docker container stats 컨테이너 사용 현황 출력

'클라우드 > Docker' 카테고리의 다른 글

Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker 명령어 테스트  (0) 2021.08.11
Docker?  (0) 2020.12.27
Docker 설치  (0) 2020.12.27

 

1. local repository에서 docker이미지 검색

  • # docker serach tomcat

 

2. Dockerhub에서 container image pull

 

Docker Hub

Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your teams' container applications.

hub.docker.com

 

3. Container create/start

  • mysql Container create
    • # docker create -p 9876:3306 --name mysql-test -e MYSQL_ROOT_PASSWORD=password mysql
      • 컨테이너 생성
      • -e option: 환경변수 설정
    • # docker start mysql-test
      • Dockerhost에서 mysql 접속
        • docker exec -it db mysql -u root -p

 

4. Container 실행

컨테이너 실행
실행결과(virtualbox에서 실행중이라면,, 네트워크 port-forwarding 설정필요)

  • # docker run -d -p 8080:8080 --name run-test consol/tomcat-7.0
    • run명령어는 컨테이너 create와 start를 동시에 실행
      • 만약 이미지가 pulling이 되어있지 않은 경우 pull을 실행하고 create/start를 진행한다
    • consol/tomcat-7.0 docker 이미지를 데몬으로 portforwarding 8080으로 실행
  • # docker run -d -p 8080:8080 --rm --name run-test2 consol/tomcat-7.0
    • rm옵션을 주면 Container가 중지되면 바로 삭제되는 임시컨테이너를 생성할 수 있다
  • # docker ps -a
    • 컨테이너 확인

 

5. Container 시작/중지/삭제

  • # docker stop a76e5848164a
    •  컨테이너 중지
  • # docker start a76e5848164a
    • 컨테이너 시작
  • # docker rm a76e5848164a
    • 컨테이너 삭제
      • 컨테이너 중지후 삭제가 가능

 

6. Container 전체 중지/시작/삭제

  • # docker stop `docker container ls -a -q`
    • 전체 중지
  • # docker start `docker container ls -a -q`
    • 전체 시작
  • # docker rm `docker container ls -a -q`
    • 전체 삭제

 

7. Docker 이미지 전체삭제

  • # docker rmi `docker images -a -q`

 

8. Container bash 접속

Container bash 접속

  • # docker exec -it [CONTAINER ID or NAMES]  /bin/bash

 

9. Container 로그확인

  • # docker logs run-test 
    • stdout

10. Container내 기타조회

  • Container내의 프로세스 조회
    • # docker top [CONTAINER ID or NANES]
  • Container내의 log 조회
    • docker logs [CONTAINER ID or NANES]
      • ex) docker logs -f nginx_test
        • 실시간 발생로그 확인

 

11. Docker host와 Container간 파일복사

  • Docker host 파일을 Container로 복사
    • docker cp [docker host의 파일 source file path] [container의 dest path]
      • # docker cp ./cpTest.txt 60dbe0c2f189:/home/ 
  • Container의 파일을 Docker host로 복사
    • docker cp [Container내의 파일 source path] [Dcoker dest path] 
      • # docker cp 60dbe0c2f189:/home/cpTest.txt ./

'클라우드 > Docker' 카테고리의 다른 글

Docker resource 관리  (0) 2021.08.14
Docker registry  (0) 2021.08.11
Docker image 생성 및 테스트  (0) 2021.08.11
Docker?  (0) 2020.12.27
Docker 설치  (0) 2020.12.27

+ Recent posts