본문 바로가기
기억 저장소

Docker + nCloud 환경 구성

by halls99 2022. 10. 28.

🔶 결과

 

 

내 로컬 개발 환경Dockerfile로 작성 후 이미지로 build 한 것을 Docker Hub에 업로드

 

nCloud 서버를 열고 Docker를 설치한 뒤, Docker Hub로부터 이미지를 받아와 내 로컬 환경을 컨테이너로 구성

 

 

 


 

🔶 과정

 

🔹 Docker 이미지를 저장할 Docker Hub에 계정 생성

 

Docker Hub Container Image Library | App Containerization

 

Docker Hub Container Image Library | App Containerization

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

hub.docker.com

 

 

🔹 레포지토리 생성

 

이제 여기에 Docker 이미지를 Public 하게 저장한다.

만약 회사 내에서 Docker를 사용하면 Private 하게 저장해야하는데,

이때는 AWS, nCloud Object Registry 등을 사용하면 된다.

 

 

 

🔹 프로젝트 생성 후 Dockerfile 작성

 

아래와 같이 간단한 파일 구조로 구성 후 Dockerfile 작성

 

FROM

  • 어떤 이미지를 Docker Hub에서 받아와서 기반으로 쓸건지 (node, python, mysql, …)

WORKDIR

  • 이미지로 만든 컨테이너 안의 어떤 폴더에 결과물들을 뱉을지

COPY

  • WORKDIR 안에 어떤 파일을 복사 붙여넣기 할지

RUN

COPY

  • 이렇게 중복으로 실행하는 이유는, Dockerfile은 위에서부터 아래로 Layer가 있다.
  • 상위 Layer는 최대한 변동성이 적도록, 하위 Layer는 그나마 변동성이 크도록 구성한다.
  • 만약 어떤 Layer가 변경될 때, 이 Layer가 상위 Layer라면 아래까지 싹 다 변경하고,
  • 하위 Layer라면 그 아래로만 변경하기 때문에 성능을 생각해서 이렇게 구성한다고 한다.

ENTRYPOINT

  • 이미지를 컨테이너로 변환하자마자 실행시킬 명령어

 

 

 

🔹 Docker 실행 명령어

 

A) Dockerfile → 이미지

# docker build -f {도커_파일_이름} -t {이미지_이름} {도커_파일_위치}

docker build -f Dockerfile -t test-image .

B) 이미지 → 컨테이너

# docker run --name {컨테이너_이름(지정해주는거임)} -d -p {포트}:{포트} {이미지_이름}

docker run --name test-container -d -p 8080:8080 test-image

C) Docker Hub 로그인

docker login

D) push 전 이미지 이름 변경 (필수)

# docker tag {이미지_이름:태그} {계정_이름/레포지토리_이름:태그}

docker tag test-image:latest edac99/docker-test:latest

E) 이미지 push

# docker push {계정_이름/레포지토리_이름:태그}

docker push edac99/docker-test:latest

F) 이미지 pull

# docker pull {계정_이름/레포지토리_이름:태그}

docker pull edac99/docker-test:latest

컨테이너 log 보기

# docker logs {컨테이너_이름}

docker logs test-container

현재 실행중인 컨테이너 종료

docker stop $(docker ps -aq)

이미지 모두 삭제

docker system prune -a

 

 

🔹 Docker 내보내기 (server → hub)

 

A → C → D → E

내 환경에서 구성한 Dockerfile을 이미지로 변환

이미지를 내 계정의 docker hub에 push 하는 작업

 

 

🔹 Docker 가져오기 (hub → server)

 

C → F → B

이미지를 가져올 계정에 로그인 후 이미지를 pull

가져온 이미지를 컨테이너로 변환 후 실행

 

 

 

🔹 nCloud 서버 생성

 

주의사항

서버 OS 설정 시 Ubuntu로 한다면 22.04 / 21.10 / 20.04 / 18.04 버전으로 설정해야함

위 버전에서만 Docker 설치 가능

Install Docker Engine on Ubuntu

 

Install Docker Engine on Ubuntu

 

docs.docker.com

 

🔹 nCloud 서버 접속

ssh root@175.45.201.122

 

🔹 nCloud 서버 세팅

 

Ubuntu 서버에 Docker를 설치하는 커맨드

 

sudo apt-get update

sudo apt-get install ca-certificates curl gnupg lsb-release

sudo mkdir -p /etc/apt/keyrings

curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

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

sudo chmod a+r /etc/apt/keyrings/docker.gpg

sudo apt-get update

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

# 테스트
docker --version

Install Docker Engine on Ubuntu

 

Install Docker Engine on Ubuntu

 

docs.docker.com

 

 

🔹 nCloud 서버 세팅 중 발생하는 오류 해결 모음

 

sudo: unable to resolve host 오류

vi /etc/hostname 에서 이름 확인 후

vi /etc/hosts 에서 127.0.1.1 ~~ 변경

[Error] sudo: unable to resolve host

 

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 오류

ssh-keygen -R 공인_IP 후 재접속

 

 

🔹 서버에서 Hub로 로그인 후 pull

docker login

# 계정_이름
# 계정_비밀번호
# docker pull {계정_이름}/{레포지토리_이름}:{태그_이름}

docker pull edac99/docker-test:latest

 

🛑 서버 ACG Inbound 설정에서 지정한 포트 (여기서는 8080)를 whitelist로 설정

 

# docker run --name {컨테이너_이름(지정해주는거임)} -d -p 8080:8080 {이미지_이름}

docker run --name test-container -d -p 8080:8080 test-image

 

반드시 공인 IP로 접속할것

 


🔶 의문 + 해야할것

 

🔹 만약 프로젝트의 코드를 수정한다면 Docker를 다시 배포해야할까?

뭔가 아닐것 같은게, Docker는 환경만 구성하는거지, 실행 파일들을 다 가져오는건 아닐것 같음

위 예시에서는 너무 단순하게 보여주려고 index.js를 포함시킨것 같음

이제 Docker로 구성한 환경 / 프로젝트 코드 를 분리하는 방법을 알아내야함

 

🔹 Dockerfile에서 -v 옵션 (볼륨)의 정체

위 예시는 너무 간단해서 안썼지만 이거 대체 뭐하는데 쓰는건지 알아내야함

어쩌면 위 의문을 해결해줄 수도 있음

 

🔹 보다 복잡한 프로젝트로 배포 시도

폴더별로 Dockerfile이 여러개 있는 프로젝트를 배포하는 연습을 해야함

또한 이럴때 사용되는 docker-compse.yml 파일의 정체도 알아내야함

 

 

댓글