🔶 결과
내 로컬 개발 환경을 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
- Dockerfile을 이미지로 build 하기 전 실행할 커맨드
- npm install 과 npm ci 의 차이 npm install 과 npm ci 의 차이
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 파일의 정체도 알아내야함
'기억 저장소' 카테고리의 다른 글
[nCloud] 서버와 DB 따로 배포 후 연동 (2) | 2022.10.14 |
---|---|
[TypeORM] Cannot add or update a child row: a foreign key constraint fails 오류 해결 (0) | 2022.10.09 |
TypeScript + Express 초간단 세팅 (0) | 2022.10.05 |
JS로 JWT 로그인 구현 (Passport.js 미사용) (0) | 2022.10.02 |
[Node.js] 초간단 Github OAuth 인증 구현 (0) | 2022.10.02 |
댓글