[카테고리:] DevOps

  • EC2 인스턴스 스토리지 확장 가이드

    EC2 인스턴스 스토리지 확장 가이드

    aws instance EC2의 스토리지를 확장하기 위해서는 따로 instance를 다운시키거나 할 필요가 없다.

    먼저 AWS 콘솔에서 내가 늘리고 싶은 스토리지를 볼륨 수정을 해준다.

    볼륨 수정이 되었다면, 서버에 접속해서 몇가지 작업을 해줘야 한다.

    lsblk
    
    ---
    NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0  20G  0 disk
    └─xvda1 202:1    0  10G  0 part /

    확장된 스토리지를 확인 한 후,

    • growpart로 파티션 크기 확장
    sudo growpart /dev/vda 1
    • 파일 시스템 크기 확장
    • ext4 파일 시스템:
    sudo resize2fs /dev/xvdf1
    • xfs 파일 시스템:
    sudo xfs_growfs /dev/xvdf1
    • 확장 확인
    df -h

    ✅ 파일 시스템 종류를 알아보려면..

    lsblk -f

    이렇게 치면 파일 시스템 종류가 나온다.

    📌 NHN Cloud 스토리지 확장하는 법

    growpart 명령어로 파티션 확장

    # Example.
    
    growpart 디바이스 이름 example -> /dev/vda 5

    참고 : growpart는 cloud-utils-growpart 패키지에 포함. 설치 필요할 수도 있음.

    yum install cloud-utils-growpart -y

    파일 시스템 확장

    # file system check
    lsblk -f
    
    # ext4 파일 시스템.
    
    resize2fs 디바이스 이름 example -> /dev/vda5
    
    # xfs 파일 시스템.
    
    xfs_growfs /

    변경 확인

    lsblk
    df -h
  • Jenkins와 Bitbucket 연동하기: Webhook 설정 가이드

    Jenkins와 Bitbucket 연동하기: Webhook 설정 가이드

    Jenkins와 BitBucket을 연동하려고 했을 때, Bitbucket Plugin을 설치해서 사용하려 했으나, 연동이 잘 되질 않아, Jenkins Plugin 중 Generic Webhook Trigger를 사용하였다.

    📌 구성

    로컬 PC에서 사용하고자 하는 Repo — main 브랜치에 Push할 때, Jenkins가 Push를 인지하여 자동으로 Dev 서버, Prod 서버에 소스코드 배포 되게 만들고 싶었다. (다른방법도 가능.)

    🚧 사전작업

    내가 CI/CD를 하고 싶은 Repo를 가서, Repository Setting 으로 들어간다.

    들어가면 Webhook라는 메뉴가 있는데, 여길 들어가면 Webhook를 추가 할 수 있다.

    설정해야 하는 항목

    이하 설정은 필요한 대로 설정하면 된다.

    ✅ URL 항목에 Jenkins Security 토큰 값 받는 법

    Jenkins 페이지에 들어가서, 오른쪽 상단에 닉네임을 클릭하면 아래와 같은 메뉴가 나온다.

    여기서, Security를 들어가준다.

    그러면, 밑에와 같은 API Token 값을 만들수가 있다.

    여기서 Token값을 만들면 나에게 Token값을 부여함. 해당 토큰값은 한번만 보여주니 별도로 저장해 놓자.

    📌 Jenkins에서 Generic Webhook Trigger Plugin 설치.

    Jenkins 관리 ➡️ System Configuration ➡️ Plugins 에 들어가면,

    해당 페이지가 나온다. 여기서, Available Plugins 에 들어가 Generic Webhook Trigger Plugin 을 설치해준다.

    📌 Jenkins Pipeline 작성

    위에 까지 구축해 놨으면, 이제 Pipeline Project를 작성해주면 된다.(freestyle로 작성해도 무관.)

    Pipeline과 freestyle 프로젝트 중에 원하는걸로 작성해도 되지만, CI/CD의 유연성을 위해 Pipeline으로 작성했다.

    📦 Pipeline Configure

    📌General

    이 부분은 설명할 것을 넣어주고 필요한 옵션들을 선택해주면 된다. 물론, 선택을 안해도 상관없다. (난 선택 안함..)

    📌 Trigger

    Pipeline에 Trigger를 넣어놔서 Jenkins UI에 적용시키지 않아도 적용이 된다.

    Pipeline 스크립트에 설정하면 자동으로 적용됨

    📌 Pipeline. (Pipeline Script.)

    파이프라인 스크립트로 작성했다. Trigger 부분은 위에서 선택하고 작성 부분이랑 중복될 수있다. 참고해서 보자.

    pipeline {
        agent any
        triggers {
            GenericTrigger(
                genericVariables: [
                    [key: 'branch_name', value: '$.push.changes[0].new.name']
                ],
                tokenCredentialId: '', // Bitbucket Webhook 토큰 Credential ID
                causeString: 'Triggered by Bitbucket Push to ${branch_name}',
                printContributedVariables: true,
                printPostContent: true,
                regexpFilterText: '$branch_name',
                regexpFilterExpression: '^dev$' //branch 이름.
            )
        }
        environment {
            TELEGRAM_API_URL = ""
            CHAT_ID = ""
        }
        stages {
            stage('Clone Repository') {
                steps {
                    echo 'Cloning repository...'
                    git branch: 'develop', 
                        credentialsId: '', // CredentialId 이름 넣기.
                        url: '' // bitbucket URL
                }
            }
            stage('Test & Build') {
                steps {
                    script {
                        try {
                            sh '''
                            // 실행할 CLI 명렁어.
                            '''
                            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Testing and building Success!'"
                        } catch (e) {
                            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Testing and building Failed!'"
                            throw e
                        }
                    }
                }
            }
            stage('Old Directory Remove') {
                steps {
                    script {
                        try {
                            sh '''
                            // 실행할 CLI 명렁어.
                            '''
                            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Old Directory Remove Success!'"
                        } catch (e) {
                            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Old Directory Remove Failed!'"
                            throw e
                        }
                    }
                }
            }
            stage('Deploy to Server') {
                steps {
                    script {
                        try {
                            sh '''
                            // 실행할 CLI 명렁어.
                            '''
                            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n🥷 Jenkins CICD | Step Deploy to Server Success!'"
                        } catch (e) {
                            sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Step Deploy to Server Failed!'"
                            throw e
                        }
                    }
                }
            }
        }
        post {
            always {
                echo 'Pipeline execution completed.'
            }
            failure {
                sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n❌ Jenkins CICD | Pipeline Failed!'"
            }
            success {
                sh "curl -s -X POST '${TELEGRAM_API_URL}' -d chat_id=${CHAT_ID} -d text='[Repository: ${env.JOB_NAME} Branch: ${env.branch_name}]\n✅ Jenkins CICD | Pipeline Succeeded!'"
            }
        }
    }

    🚀 code 내용

    Repo Clone (젠킨스 서버로 복제) ➡️ Repo HOST OS 로 이동 ➡️ Repo node container로 이동 ➡️ Test & Build (통과하면) ➡️ 배포할 서버에 기존 Directory 삭제 ➡️ 배포하고 싶은 서버에 배포. 순으로 Pipeline 작성

    ✅ 추가 작업 사항

    ✔️ credentialId

    credentialId을 만드는 법은 Jenkins 페이지에서 오른쪽 상단에 닉네임을 클릭하면 아래와 같은 메뉴가 나온다.

    여기서 Credentials 를 들어가,

    Add. Credentials 해준다. 그럼, 아래와 같은 화면이 나오는데,

    • Username : 비트버킷 아이디
    • password : 비트버킷에서 받은 앱 비밀번호
    • ID : Credential ID
    • Description : 설명

    비트버킷에서 받은 앱 비밀번호는 비트버켓에서 받을 수 있다.

    ✔ 비트버킷에서 앱 비밀번호 받는 법

    • Personal Bitbucket settings ➡️ 앱 비밀번호

    이곳에서 받으면 된다.

    ✔ Bitbucket_URL 가져오는 법

    비트버킷 URL을 가져오려면 비트버킷에서 Access tokens을 설정해야 한다. 비트버킷에서 Repository Setting로 들어가 Access Token 메뉴를 들어가서 token을 생성하면 URL 생성이 된다.

    ✔ Publish over SSH 설정하는 법

    해당 플러그인은 여러개의 키값을 설정할 수가 없어서 다른 플러그인을 써도 되고, 키파일을 ssh로 설정을 해서 접근을 가능하게 만들어도 된다. (원하는대로..)

  • Jenkins Docker 실행 가이드

    Jenkins Docker 실행 가이드

    Jenkins Docker 실행 가이드

    📌 Mount 할 Jenkins 디렉토리 폴더 생성 및 권한 설정

    mkdir jenkins_home
    chmod 777 jenkins_home

    📌 Jenkins 이미지 Pull

    # jenkins 이미지 띄우기.
    
    docker pull jenkins/jennkins:lts

    📌 Jenkins 컨테이너 실행

    docker run -d --name jenkins \
      -p 8080:8080 -p 50000:50000 \
      -v /your/path/jenkins_home:/var/jenkins_home \
      --restart unless-stopped \
      jenkins/jenkins:lts
    • -p 8080:8080: Jenkins 웹 인터페이스를 호스트의 8080 포트에 노출
    • -p 50000:50000: 빌드 에이전트와 통신을 위한 포트
    • -v /your/path/jenkins_home:/var/jenkins_home: Jenkins 데이터를 호스트 디렉토리에 마운트
    • restart unless-stopped: Docker 재시작 시 컨테이너 자동 실행

    📌 Jenkins 초기설정

    1. 브라우저에서 http://localhost:8080으로 접속.
    2. 초기 관리자 비밀번호는/your/path/jenkins_home/secrets/initialAdminPassword 파일에 저장.
    cat /your/path/jenkins_home/secrets/initialAdminPassword
  • Jenkins와 GitHub 연동하여 자동 배포하는 방법

    Jenkins와 GitHub 연동하여 자동 배포하는 방법

    Jenkins와 GitHub 연동하여 자동 배포하는 방법

    📌 Github Token 발급

    오른쪽 하단, Setting 메뉴에 들어간다.

    왼쪽 하단 끝에 Developer Settings 메뉴에 들어간다.

    왼쪽 하단에 Personal access tokens 메뉴에 들어간다. (Tokens (Classic))

    Token을 발급을 받는다. (repo, admin:org, admin:repo_hook를 체크.)

    📌 Jenkins 설정

    jenkins를 구축 후, 로그인하고 들어가면 아래와 같은 페이지가 나오는데 해당 페이지에서 Jenkins 관리로 들어간다.

    System Configuration ➡️ System ➡️ Github Servers 부분을 찾는다.

    다음과 같이 설정한다.

    잘 연결되는지 테스트까지 한 후, 새로운 Item 생성 (Freestyle project)

    Github project ➡️ project url 부분에 Git repo를 연결하고 자격증명은 위에서 만들었던걸로 설정해준다.

    GitHub hook trigger for GITScm polling를 체크를 체크하면 mater(main)브랜치에 업데이트가 있으면 자동으로 빌드)

  • Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    Jenkins 설치 방법: Docker, macOS, CentOS, Ubuntu

    • Docker에 설치
    ## lastest LTS version
    
    docker pull jenkins/jenkins:lts-jdk17
    • macOS에 설치
    Install the latest LTS version: brew install jenkins-lts
    Start the Jenkins service: brew services start jenkins-lts
    Restart the Jenkins service: brew services restart jenkins-lts
    Update the Jenkins version: brew upgrade jenkins-lts
    • centOS에 설치
    ## use this repository
    sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
      sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
      
    ## 설치.
    yum install fontconfig java-17-openjdk
    yum install jenkins
    • ubuntu에 설치
    sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
        https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
        
    echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
        https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
        /etc/apt/sources.list.d/jenkins.list > /dev/null
        
    sudo apt-get update
      sudo apt-get install fontconfig openjdk-17-jre
      sudo apt-get install jenkins

  • 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