본문 바로가기

BackEnd

[NaverCloud] 원격접속에서 도커 우분투에 설치

0.  네이버 클라우드로 서버 만들기

공인 IP가 필요하기때문에 서버를 먼저 생성합니다.

서버가 있다면 mac은 terminal로, window는 MobaXterm을 실행해줍니다.


1.  ssh 원격 접속하기

서버에 접속하기위해 네이버 클라우드에서 생성한 서버의 동적 IP 주소를 조회합니다.

 

2. 동적 IP 주소를 입력해서 서버에 접속합니다.

# 띄어쓰기 주의하자! ex)ssh root@223.130.135.142
ssh root@동적IP주소

 

더보기

ssh root@IP주소

The authenticity of host 'IP 주소 (IP 주소)' can't be established.

ED25519 key fingerprint is SHA256:39bKpXlSglql3j2trisE9z2MiYo5484BFYCZ4c/uCfk. (이것은 호스트 공개키)

This host key is known by the following other names/addresses:

    ~/.ssh/known_hosts:11: 223.130.135.142

    ~/.ssh/known_hosts:13: 101.79.11.115

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

 

이전에 호스트를 연결한 적이있다면, 새로운 호스트 key가 기존에 저장된 호스트 ke와 달라, ssh 클라이언트가 해당 호스트의 신원을 확인할 수 있는 정보가 없어서 계속 연결할 것인지 여부를 물어보는것으로 yes 라고 입력합니다.

 그러면 아래와같이 비밀번호를 입력하라고 뜨게되는데, 비밀번호는 클라우드에 생성한 server에 접속해서 확인 할 수 있습니다.

 

root@동적IP's password: 복사한 관리자 비밀번호 붙여넣기

 

ip 비밀번호 : 생성한 서버 탭에서 서버관리및 설정변경 클릭 -> 관리자 비밀번호 확인
서버 생성시 선택(생성)한 .pem 파일을 사용하여 인증

 

비밀번호를 붙여넣기 했을때 Permission denied, please try again. 이 뜬다면 다시 복사해서 시도해보거나 직접 타자를 치면 됩니다.

root@동적IP's password: 복사한것 붙여넣기

 

로그인에 성공하면 ncloud가 나타나거나 아래와같이  뜹니다.

Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-99-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Thu 18 Jul 2024 09:54:01 AM KST

  System load:  0.0                Processes:                137
  Usage of /:   11.8% of 48.96GB   Users logged in:          0
  Memory usage: 47%                IPv4 address for docker0: 172.17.0.1
  Swap usage:   0%                 IPv4 address for eth0:    172.16.0.6

  => There is 1 zombie process.

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

279 updates can be applied immediately.
205 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable

New release '22.04.3 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Wed Jul 17 20:51:34 2024 from 175.209.41.173

2. 도커를 우분투(가상머신)에 설치

1. 우분투 시스템 패키지를 업데이트

sudo apt-get update

2. 우분투에 필요한 패키지 설치

아래의 명령어를 입력하여 지정된 패키지 목록을 읽고 상태를 확인하여 패키지를 설치합니다.

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

 

의존성 문제로 인해 추가패키지를 설치하고 계속 설치할 것인지 물어보는데  y 를 입력해줍니다. 

더보기

 

  • apt-transport-https: HTTPS를 통해 APT 저장소에 접근할 수 있게 해주는 패키지
  • ca-certificates: CA 인증서를 설치하여 SSL 인증서를 검증할 수 있게 해주는 패키지
  • curl: 데이터를 서버로부터 또는 서버로 전송할 때 사용하는 명령줄 도구
  • gnupg-agent: GPG 키 관리를 위한 에이전트
  • software-properties-common: 추가 APT 저장소를 관리하는 유틸리티

 

3. 도커에 gpg키 추가

curl을 사용하여 Docker의 GPG키를  다운로드하고, 다운로드된 GPG 키를 APT 키 목록에 추가하여 Docker 패키지 저장소에서 패키지를 설치할 때 신뢰할 수 있도록 합니다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

코드 설명

더보기
  • curl: URL에서 데이터를 가져오는 명령줄 도구입니다.
  • -f: 요청이 실패할 경우 curl이 아무런 출력 없이 종료되도록 합니다.
  • -s: curl이 진행률 표시줄이나 오류 메시지를 출력하지 않도록 합니다.
  • -S: 오류 메시지를 표시하되, -s 옵션과 함께 사용하여 필요한 경우에만 출력합니다.
  • -L: 요청이 리디렉션된 경우 이를 따라가도록 합니다.
  • https://download.docker.com/linux/ubuntu/gpg: Docker APT 저장소의 공개 GPG 키 파일 URL입니다.

이 명령어는 Docker APT 저장소의 GPG 키 파일을 다운로드하여 표준 출력(stdout)에 출력합니다.

  • |: 파이프라인 연산자입니다. 앞의 명령어(curl)의 출력을 뒤의 명령어(apt-key add)의 입력으로 전달합니다.
  • sudo: 루트 권한으로 명령어를 실행합니다.
  • apt-key add -: APT 키 관리 도구입니다. -는 표준 입력(stdin)으로부터 키를 읽겠다는 의미입니다.

4. 도커에 apt저장소 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

5.  시스템 업데이트

안하고 나중에해도 한번에 된다는데 저는 트틈히 update했습니다.

sudo apt-get update

 

6. 우분투시스템에 도커를 설치하는 명령어 - 패키지 세개 설치

sudo apt-get install docker-ce docker-ce-cli containerd.io

Package docker-ce is not available, but is referred to by another package. 가 뜬다면 접은글을 확인해주세요

더보기

Package docker-ce is not available, but is referred to by another package.

This may mean that the package is missing, has been obsoleted, or

is only available from another source

 

E: Package 'docker-ce' has no installation candidate

E: Unable to locate package docker-ce-cli

E: Unable to locate package containerd.io

E: Couldn't find any package by glob 'containerd.io'

E: Couldn't find any package by regex 'containerd.io'

위와 같이 뜬다면 Docker의 패키지 저장소가 시스템의 APT 목록에 추가되지 않은 것입니다.

아래의 명령어들을 입력하여 다시 설치한뒤 7.도커 실행 확인 과 같은 이미지가 나온다면 성공적으로 도커가 실행되는것입니다.

sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io

7. 도커 실행 확인

sudo systemctl status docker

 

위 이미지처럼 나온다면 도커가 잘 설치되었고 실행되는것입니다.

확인했다면 ctrl + c 로 나와줍니다.

 

---------------------------------------- 아래부터 다시 글 정리하기--------------------

pipeline {
    agent any

    tools {
        jdk 'openjdk-17-jdk'
    }

    stages {
        stage('Prepare') {
            steps {
                git branch: 'main',
                    credentialsId: 'dockertest',
                    url: 'https://github.com/harrykang0805/dockertest.git'
            }

            post {
                success { 
                    sh 'echo "Successfully Cloned Repository"'
                }
                failure {
                    sh 'echo "Fail Cloned Repository"'
                }
            }    
        }

        stage('Build Gradle Test') {

            steps {
                sh (script:'''
                    echo "Build Gradle Test Start"
                ''')

                dir('.') {
                    sh """
                    chmod +x gradlew
                    """
                }

                dir('.') {
                    sh """
                    ./gradlew clean build
                    """
                }
            }

            post {
                success { 
                    sh 'echo "Successfully Build Gradle Test"'
                }
                 failure {
                    sh 'echo "Fail Build Gradle Test"'
                }
            }    
        }

        stage('Docker Rm') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker stop timecapsule
                docker rm -f timecapsule
                docker rmi -f timecapsule
                """
            }

            post {
                success { 
                    sh 'echo "Docker Rm Success"'
                }
                failure {
                    sh 'echo "Docker Rm Fail"'
                }
            }
        }

        stage('Bulid Docker Image') {
            steps {
                sh 'echo " Image Bulid Start"'
                sh """
                docker build -t timecapsule .
                """
            }

            post {
                success {
                    sh 'echo "Bulid Docker Image Success"'
                }

                failure {
                    sh 'echo "Bulid Docker Image Fail"'
                }
            }
        }

        stage('Docker Run') {
            steps {
                sh 'echo "Docker Run Start"'
                sh """
                docker run \
                  --name=timecapsule \
                  -p 80:8080 \
                  -v /docker_projects/aaaaa/volumes/gen:/gen \
                  --restart unless-stopped \
                  -e TZ=Asia/Seoul \
                  -d \
                  timecapsule
                """
            }

            post {
                success {
                    sh 'echo "Docker Run Success"'
                }

                failure {
                    sh 'echo "Docker Run Fail"'
                }
            }
        }
    }
}
pipeline {
    agent any

    tools {
        jdk 'openjdk-17-jdk'
    }

    stages {
        stage('Prepare') {
            steps {
                git branch: 'main', credentialsId: 'dockertest', url: 'https://github.com/harrykang0805/dockertest.git'
            }

            post {
                success {
                    sh 'echo "Successfully Cloned Repository"'
                }
                failure {
                    sh 'echo "Fail Cloned Repository"'
                }
            }
        }

        stage('Build Gradle Test') {
            steps {
                sh (script: '''
                    echo "Build Gradle Test Start"
                ''')

                dir('.') {
                    sh '''
                    chmod +x gradlew
                    ./gradlew clean build -Dorg.gradle.jvmargs="-Xmx1024m -XX:+HeapDumpOnOutOfMemoryError"
                    '''
                }
            }

            post {
                success {
                    sh 'echo "Successfully Build Gradle Test"'
                }
                failure {
                    sh 'echo "Fail Build Gradle Test"'
                }
            }
        }

        stage('Docker Rm') {
            steps {
                sh 'echo "Docker Run Start"'
                script {
                    def containerExists = sh(script: "docker ps -a --format '{{.Names}}' | grep -w timecapsule", returnStatus: true) == 0
                    if (containerExists) {
                        sh '''
                        docker stop timecapsule
                        docker rm -f timecapsule
                        '''
                    } else {
                        sh 'echo "No such container: timecapsule"'
                    }
                }
            }

            post {
                success {
                    sh 'echo "Docker Rm Success"'
                }
                failure {
                    sh 'echo "Docker Rm Fail"'
                }
            }
        }

        stage('Build Docker Image') {
            steps {
                sh 'echo " Image Build Start"'
                sh '''
                docker build -t timecapsule .
                '''
            }

            post {
                success {
                    sh 'echo "Build Docker Image Success"'
                }
                failure {
                    sh 'echo "Build Docker Image Fail"'
                }
            }
        }

        stage('Docker Run') {
            steps {
                sh 'echo "Docker Run Start"'
                script {
                    def containerExists = sh(script: "docker ps -a --format '{{.Names}}' | grep -w timecapsule", returnStatus: true) == 0
                    if (containerExists) {
                        sh '''
                        docker stop timecapsule
                        docker rm -f timecapsule
                        '''
                    }
                }
                sh '''
                docker run \
                  --name=timecapsule \
                  -p 80:8080 \
                  -v /docker_projects/aaaaa/volumes/gen:/gen \
                  --restart unless-stopped \
                  -e TZ=Asia/Seoul \
                  -d \
                  timecapsule
                '''
            }

            post {
                success {
                    sh 'echo "Docker Run Success"'
                }
                failure {
                    sh 'echo "Docker Run Fail"'
                }
            }
        }
    }
}
docker run \
  --name=timecapsule \
  -p 8080:8080 \
  -v /docker_projects/aaaaa/volumes/gen:/gen \
  --restart unless-stopped \
  -e TZ=Asia/Seoul \
  -d \
  timecapsule