[카테고리:] Docker

  • Docker-Compose 설치 방법 및 확인

    Docker-Compose 설치 방법 및 확인

    먼저, 사전에 Docker는 설치되어있어야 함

    Docker-Compose 설치

    최신 버전 다운로드

    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

    실행 권한 부여

    sudo chmod +x /usr/local/bin/docker-compose

    바이너리 파일을 경로 설정

    echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc
    source ~/.bashrc

    설치 확인

    docker-compose --version
  • Nexus로 Private Docker Registry 구축기

    Nexus로 Private Docker Registry 구축기

    Private Docker registry 를 만들거나 사내 Docker 저장소 만들 목적

    📦 환경

    • 우분투 22.04 — Server 버전.
    • 도커 설치.

    📌 도커 컨테이너로 Nexus 컨테이너 실행

    docker run -d --name nexus \
    -p 8081:8081 -p 8082:8082 \
    -p 8083:8083 -p 5000:5000 \
    -v nexus-data:/nexus-data \
    sonatype/nexus3

    Nexus 웹 페이지는 http://서버IP:8081 로 접속. 최초, 어드민 계정으로 로그인

    id: admin
    pwd: cat /nexus-data/admin.password 로 명령어 쳤을 때 나오는 명렁어.

    로그인 후, 개인적인 비밀번호로 바꿀 수 있다.

    ✅ Nexus 에서 docker hosted, docker — Proxy Blob 생성

    아래와 같이 순차적으로 생성.

    • docker-hosted
    • docker-hub

    ✅ Nexus 에서 docker-hosted, docker-proxy 저장소 생성

    해당화면에서 Create repository 클릭

    ✔️ docker-hosted 선택.

    • Name은 docker-hosted
    • http 영역 체크 및 5000 입력.
    • Enable Docker V1 API 체크.
    • Blob store docker-hosted 선택.

    ✔️ docker-proxy 선택.

    • Name은 docker-hub
    • Enable Docker V1 API 체크.
    • Remote storage 에 https://registry-1.docker.io 입력.
    • Use Docker Hub 선택.

    ✅ Nexus 에서 Realms 설정.

    설정 ➡️ Realms ➡️ Docker Bearer Token Realm ➡️ Active 로 Save

    ✅ Docker 명령어 HTTP 사용 가능 설정 (v1)

    /etc/docker/daemon.json 파일 생성. 기존에 존재하지 않는 파일이라면 새로 만들어야 한다.

    cat /etc/docker/daemon.json
    
    ---
    
    {
            "insecure-registries" : ["서버IP:5000"]
    }
    
    ---
    위 내용으로 저장.
    
    systemctl restart docker # 도커 재시작.
    docker restart nexus # 넥서스 컨테이너 재시작.

    📌 Private Docker 저장소 로그인

    docker login 서버IP:5000
    
    ---
    Username: admin
    Password:
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded

    🚀 Private Docker 저장소에 Push

    docker push 서버IP:5000/도커이미지이름:태그이름

    🚀 Private Docker 저장소에 Pull

    docker pulll 서버IP:5000/도커이미지이름:태그이름

    🧷 SSL이 적용되어야 etc/docker/daemon.json 파일 생성 과정이 생략 가능.

  • Docker CLI 사용법

    Docker CLI 사용법

    컨테이너 격리 기술

    docker 컨테이너 lifecycle

    docker 컨테이너를 수동으로 생성 -> docker run = [pull] + create + start + [command]

    docker pull ubuntu:16.04
    docker images
    
    docker create -it --name myubuntu16-1 ubuntu:16.04
    docker ps -a
    
    docker start myubuntu16-1
    docker attach myubuntu16-1
    
    -----
    
    한번에 한다면?
    docker run -it --name=myubuntu16-2 ubuntu:16.04 bash

    Docker 컨테이너 CLI

    docker [container] run [option] docker_image [command]

    docker CLI 옵션

    docker top | port | stats

    # 컨테이너엣 실행 중인 프로세스 조회.
    docker top node-run
    
    # 컨테이너에 매핑된 포트 조회
    docker port node-run
    
    # 컨테이너 리소스 사용 통계에 대한 실시간 스트림 출력(스트림 통계 비활성화, --no-stream)
    docker stats node-run

    docker stats와 유사한 통계, Metric 정보를 수집하는 cadvisor

    # cadvisor 컨테이너 생성.
    
    docker run \
    --restart=always \
    --volume=/:/rootfs:ro \
    --volume=/var/run:/var/run:rw \
    --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \
    --volume=/var/lib/docker/:/var/lib/docker:ro \
    --volume=/dev/disk/:/dev/disk:ro \
    --publish=9559:8080 \
    --detech=true \
    --name=cadvisor \
    --privileged \
    --device=/dev/kmsg \
    gcr.io/cadvisor/cadvisor:latest
    
    ---
    
    docker ps -a

    docker logs

    # 컨테이너에서 발생하는 stdout(표준출력), stderr(표준에러) 출력.
    while true; do curl 192.168.56.101:6060; sleep 3; done
    
    # 다른 터미널에서.
    docker logs -f node-run
    
    # 출력되는 로그 양이 큰 경우, disk full error의 원인.
    docker info | grep -i log
    
    # 출력되는 로그 양이 큰 경우, disk full error의 원인이 되기도 함.
    sudo ls -l /var/lib/docker/containers/[CONTAINER ID]
    
    # 해당 파일 내용 비우기.
    sudo truncate -s 0 [CONTAINER ID]-json.log
    # 컨테이너에서 발생하는 log size 제한.
    
    sudo vi /etc/docker/daemon.json
    
    sudo systemctl restart docker.service
    sudo systemctl status docker.service
    
    docker run -dit -p 6062:6060 --name=node-run2 \
    -h node-run --log-driver json-file --log-opt max-size=30m --log-opt max-file=10 \
    noderun:1.0
    
    # mySQL 컨테이너 로그 확인.
    
    docker run -dit --name=mydb mysql:5.7-debian
    docker ps -a
    docker logs mydb

    docker [container] inspect

    # 컨테이너 내부 구조 정보 확인.
    
    docker container inspect node-run
  • Docker 이미지 관리: 이미지 Pull, Push 및 백업

    Docker 이미지 관리: 이미지 Pull, Push 및 백업

    Docker Image 관리

    이미지 내려 받기

    docker [image] pull [option] name:[tag] Using default tag: latest latest: Pulling from grafana/grafana 4abcf2066143: Pull complete b02b4b1ae159: Pull complete 3bb77895c022: Pull complete 06ba99fa00c6: Pull complete 105bf4eba93e: Pull complete 94aeabba6e9f: Pull complete d5ef5293514d: Pull complete 09419083b5bb: Extracting [==================================================>] 50.57MB/50.57MB 56983880012c: Download complete 4a1ff49c903a: Download complete failed to register layer: write 

    이미지 구조 확인

    docker images inspect 생성된 image의 내부 구조 정보를 JSON 형태로 제공

    docker image inspect [image명]

    이미지 Push

    • Dockerfile을 통해 생성된 이미지나 docker commit을 통해 생성된 이미지를 저장하는 곳을 registry라고 함.
    • Registry는 공개적으로 사용하는 public registry와 회사 내부에서만 접근되도록 하는 Private registry가 있음.
    • 여기서는 Docker에서 hub.docker.com을 이용해 docker push를 수행해 봄.

    docker push를 하려면

    1. docker login : hub.docker.com에 가입된 본인 ID와 암호로 현재 로컬에 계정을 등록.
    2. docker tag : hub.docker.com에 본인 계정의 Repositories에 넣기 위한 태그를 수행.

    docker login/logout

    • hub.docker.com에 회원가입 후 서버에서 docker login을 통해 본인 저장소에 업로드 함.
    • Docker는 3가지로 접근 가능.
    docker login

    docker [image] tag -> push

    docker images docker image tag mysweb:v1.0 dbguru/myweb:v1.0 docker push dbguru/myweb:v1.0

    docker [image] tag

    hub.docker.com에 push된 이미지를 다른 위치에서 pull 해보고, docker run으로 정상 이미지인지 확인

    docker pull dbguru/myweb:v1.0 docker run -d -p 8001:80 --name=myweb dbguru/myweb:v1.0 curl localhost:8001

    docker image 백업 및 이전

    • docker save 명령을 통해 Layer로 구성된 이미지를 *.tar 파일로 묶어 파일로 저장.
    • 해당 파일을 전달 받은 컴퓨터에서 docker load를 통해 이미지로 등록.
    mkdir save_lab && cd $_ docker image save phpserver:1.0 > phpserver1.tar docker image save phpserver:1.0 | gzip > phpserver1.tar.gz docker image save phpserver:1.0 | bzip > phpserver1.tar.bz2
    • docker save 명령을 통해 Layer로 구성된 이미지를 *.tar 파일로 묶어 파일로 저장.
    • 해당 파일을 전달 받은 컴퓨터에서 docker load를 통해 이미지로 등록.
    scp phpserver1.tar.gz docker@docker2:/home/docker/backup/phpserver1.tar.gz ------------------------------------- docker image load < phpserver1.tar.gz docker images docker run -itd -p 8200:80 phpserver:1.0 curl localhost:8200
  • 최신 Docker 엔진으로 성능 개선하기

    최신 Docker 엔진으로 성능 개선하기

    최신 Docker 엔진으로 성능 개선하기

    1) 기존 기능의 개선 및 new feature

    • docker는 플랫폼의 기능과 유용성을 개선하는 새로운 기능 및 개선 사항이 포함된 업데이트를 정기적으로 릴리즈하여 새로운 docker 기능을 도입 -> 모든 작업의 workflow를 단순화 할 수 있음.

    2) 버그 수정

    • docker에도 다른 소프트웨어 처럼 버그 또는 예기치 못한 버그가 발생함. 발견된 버그를 해결하여 안정성 및 성능을 개선하는 수정사항을 제공.

    3) 보안 패치

    • 널리 사용되고 있는 컨테이너화 플랫폼인 docker는 보안 취약성에 대해 지속적으로 inspect되어, 최신 버전의 docker를 사용하면 최신 보안 패치를 사용하여 잠재적 악용 위험을 최소화하고 컨테이너화 된 애플리케이션의 전반적인 보안 태세를 개선할 수 있음.

    4) 성능 개선.

    • docker 업데이트에 종종 성능 최적화가 포함되어 있기 때문에 작업을 더 빠르고 효율적으로 만듦. 이러한 개선 사항은 컨테이너 시간 단축, 네트워킹 및 I/O 성능 향상, 전반적인 리소스 활용도 향상으로 이어질 수 있음. 즉, 최신성을 갖는 docker는 컨테이너화 된 애플리케이션을 최적화할 수 있음.

    5) 최신 기술과의 호환성

    • 기술 환경은 지속적으로 발전하고 있으며 새로운 도구와 프레임워크가 새롭게 생겨나고 있음. 최신 버전의 Docker를 사용하여 최신기술과의 호환성이 보장되어 컨테이너 환경에서 새로운 최신 tool들을 활용할 수 있음.

    6) 커뮤니티 및 생태계 지원

    • docker의 발전은 주변 생태계의 발전에 영향을 줌. 인기있는 도구 및 라이브러리 들은 docker 기능 및 버전을 지원하도록 업데이트되고, 최신 버전의 docker를 사용하여 docker 기반 플러그인 및 통합을 활용해 컨테이너화 된 application을 build 및 관리하기 위한 옵션을 사용 가능.

    7) 유지 관리 및 오랜 기간 동안의 지원

    • docker는 일부 release를 장기지원(LTS) 버전으로 지정하는 관리체계를 따름. LTS 버전은 버그 수정 및 보안 패치를 포함하여 확장된 유지 관리 및 지원을 받아 중요한 프로덕션 환경에 적합하기 때문에 최신 Docker를 사용하면 장기적인 요구 사항에 대해 안정적이고 잘 지원되는 docker 환경을 보장 받을 수 있음.

    Docker 버전 업데이트 시,

    1) 기존에 실행 중이던 컨테이너들을 stop 함.
    2) 현재 사용 중인 19.x 버전의 docker엔진을 삭제함.
    3) 최신 버전의 docker 엔진을 설치.
    4)기존 버전에서 운영중 이였던 컨테이너 재기동(start)
    5) if, error 발생 시 원인 파악, 문제 해결 -> 중지되었던 컨테이너 start
    6) 필요에 따라 Ubuntu Linux도 18.04 -> 22.04로 upgrade 진행

    docker version 확인

    docker version

    사용중인 docker engine 삭제

    sudo pat -y remove docker-ce

    새로운 docker engine 설치 후 컨테이너 다시 실행

  • Docker 설치 및 설정하기: Rocky Linux 8.10 사용법

    Docker 설치 및 설정하기: Rocky Linux 8.10 사용법

    Docker 설치 및 설정하기: Rocky Linux 사용법

    패키지 업데이트

    sudo dnf update -y

    Docker 패키지 설치를 위한 기본 설정

    sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    Docker 설치

    sudo dnf install docker-ce docker-ce-cli containerd.io -y

    Docker 서비스 시작 및 부팅 시 자동 시작 설정

    sudo systemctl start docker
    sudo systemctl enable docker

    설치 확인

    docker --version

    ✅ 선택 사항

    일반 사용자로 Docker 실행

    sudo usermod -aG docker $USER
    newgrp docker

    로그아웃 후, 다시 들어오면 일반 사용자에서도 docker ps 사용 가능


    🚧 만약, 위의 방법으로 설치했을 때 오류가 난다면..

    Podman 관련 패키지 제거

    sudo dnf remove -y podman buildah containers-common

    기존의 Docker 관련 패키지 제거

    sudo dnf remove -y docker \
                    docker-client \
                    docker-client-latest \
                    docker-common \
                    docker-latest \
                    docker-latest-logrotate \
                    docker-logrotate \
                    docker-engine

    기존의 runc 제거

    sudo dnf remove -y runc

    Docker 설치를 위한 추가 작업

    sudo dnf install -y yum-utils
    
    # Docker 공식 저장소 추가.
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    Docker 설치

    sudo dnf install -y docker-ce docker-ce-cli containerd.io --allowerasing

    Docker 서비스 시작 및 활성화

    sudo systemctl start docker
    sudo systemctl enable docker

    설치 확인

    Docker가 제대로 작동하는지 확인

    docker --version
    sudo docker run hello-world
  • Nginx Container로 proxy 변경해서 Load balancer 구성하기

    Nginx Container로 proxy 변경해서 Load balancer 구성하기

    Host nginx reverse proxy

    sudo apt update
    sudo apt -y install nginx
    sudo nginx -v
    
    docker run -dit -e SERVER_PORT=5001 -p 5001:5001 -h alb-node01 -u root --name=alb-node01 dbgurum/nginxlb:1.0
    docker run -dit -e SERVER_PORT=5002 -p 5002:5002 -h alb-node02 -u root --name=alb-node02 dbgurum/nginxlb:1.0
    docker run -dit -e SERVER_PORT=5003 -p 5003:5003 -h alb-node03 -u root --name=alb-node03 dbgurum/nginxlb:1.0

    Host nginx reverse proxy 구성

    ~$ sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
    ~$ sudo vi /etc/nginx/nginx.conf
    events { worker_connections 1024; }
    http {
    	# List of application servers
        upstream backend-alb {
        	server 127.0.0.1:5001;
            server 127.0.0.1:5002;
            server 127.0.0.1:5003;
        }
        # Configuration for the server
        server {
        	# Running port
            listen 80 default_server;
            # Proxying the connections
            location / {
            	proxy_pass	http://backend-alb;
            }
        }
    }
    ~$ sudo systemctl restart nginx.service
    ~$ sudo systemctl status nginx.service

    nginx container reverse proxy 구성

    docker run -d -p 8001:80 --name=proxy-container nginx:1.25.0-alpine
    ~$ vi nginx.conf
    events { worker_connections 1024; }
    http {
    	upstream backend-alb {
        	server 192.168.56.101:5001;
    	    server 192.168.56.101:5002;
        	server 192.168.56.101:5003;
        }
        server {
        	listen 80 default_server;
    	    location / {
        		proxy_pass	http://backend-alb;
            }
        }
    }
    ~$ docker cp nginx.conf proxy-container:/etc/nginx/nginx.conf
    ~$ sudo netstat -nlp | grep 8001
    docker restart proxy-container
    docker ps | grep proxy
    curl localhost:8001
  • Docker Network 관리: 효과적인 Proxy Server 사용법

    Docker Network 관리: 효과적인 Proxy Server 사용법

    Docker Network 관리: Proxy Server 가이드

    Proxy

    • 요청자와 응답자 간의 중계역할. 즉, 통신을 대리 수행하는 서버를 proxy server라고 함
    • Proxy server의 위치에 따라 forward proxy, reverse proxy로 구분

    forward Proxy

    Reverse Proxy

    nginx

    • 기본 구성 값으로 “웹 서버”를 실행함. 동일 계열 점유율이 높음
    • 추가 구성으로 “Reverse Proxy”구현이 가능
    • kubenetes의 ingress controller로 “nginx ingress controller” 선택 가능
    • API 트래픽 처리를 고급 HTTP 처리 기능으로 사용 가능한 “API Gateway” 구성이 가능
    • MSA 트래픽 처리를 위한 MicroGateway로 사용 가능
    • 설정은 (linux기준) /etc/nginx 하위에 nginx.conf 변경을 통해 구성

    nginx Reverse Proxy

    • 클라이언트 요청이 80 포트로 들어오면 준비해둔 애플리케이션 서버의 주소로 각 서버로 트래픽을 분배
    • 기본 분배 방식(LoadBalancing)은 round-robin 방식으로 처리.
    • 요청이 적은 서버로 분배하는 least_conn 방식
    • IP당 서버를 분배하는 ip_hash 등 여러가지 부하 분산 알고리즘을 사용할 수 있음

    HAproxy

    • 하드웨어 기반의 L4/L7 스위치를 대체하기 위한 오픈 소스 소프트웨어 솔루션.
    • TCP 및 HTTP 기반 애플리케이션을 위한 고가용성, load-balancing 및 프록시 기능을 제공하는 매우 빠르고 안정적인 무료 Reverse Proxy다.
    • 주요 기능.
      1) SSL 지원
      2) Load Balancing
      3) Active health check
      4) KeepAlived (proxy 이중화)

    HAproxy, L4

    • OSI 7 계층 중 layer 4 IP를 이용한 트래픽 전달이 특징.
    • Haproxy L4 구성 시, IP와 Port를 기반으로 사용자 요청 트래픽을 전달하도록 구성
    • 요청에 대한 처리는 웹서버로 구성된 web1~3에 round-robin방식으로 부하 분산 됨

    HAproxy, L7

    • OSI 7 계층 중 Layer 은 HTTP 기반의 URI를 이용한 트래픽 전달이 특징.
    • 동일한 도메인의 하위에 존재하는 여러 웹 애플리케이션 서버를 사용할 수 있음.
    • example.com/item or example.com/basket 으로 연결
    • 사용자의 요청과 설정에 따른 부하 분산
  • NVIDIA GPU로 Docker 컨테이너 실행하기

    NVIDIA GPU로 Docker 컨테이너 실행하기

    NVIDIA GPU로 Docker 컨테이너 실행하기

    먼저 docker를 설치 한다. 블로그에 도커 설치 관련 블로그가 있다. 참고하면 된다. 도커가 설치가 되면. nvidia-gpu를 사용하기 위해서 nvidia 드라이버를 서버에 설치 해야 한다.

    nvidia 드라이버 설치 방법

    ## NVIDIA 드라이버의 최신 버전을 얻기 위해 NVIDIA PPA를 추가.
    sudo add-apt-repository ppa:graphics-drivers/ppa
    sudo apt-get update
    
    ## 설치 가능한 최신 드라이버를 확인하고 설치.
    ubuntu-drivers devices
    ## 특정 버전 설치.
    sudo apt-get install nvidia-driver-XXX
    ## 드라이버 설치가 완료되면, 시스템을 재부팅하여 드라이버를 활성화.
    sudo reboot
    ## 재부팅 후, 드라이버가 제대로 설치되었는지 확인하려면 다음 명령어.
    nvidia-smi

    버전 선택 시 참고

    서버에 nvidia-smi가 잘 떴다면,

    이제, docker-container에서 GPU를 사용할 수 있도록 nvidia-docker2를 설치해야 한다.

    ## GPG키와 저장소 추가.
    
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
       && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
       && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    ## nvidia-docker 설치.
    $ sudo apt-get update
    $ sudo apt-get install -y nvidia-docker2
    ## 컨테이너 생성 후 확인해보기.
    docker run --rm --gpus all ubuntu:18.04 nvidia-smi
  • Docker 명령어 자동완성 설정하기

    Docker 명령어 자동완성 설정하기

    Docker 명령어 자동완성 설정하기

    zsh plugin 설정

    vi ~/.zshrc
    
    ---
    plugins = ( docker docker-compose )
    ---
    # 편집완료 후 적용.
    zsh