기타

[Docker] Docker 호스트에 원격으로 배포하기(docker compose 이용)

tmkimm 2021. 12. 18. 18:25

귀여운 docker logo

Overview

사이드 프로젝트에서 서버를 제대로 관리하기 위해 Docker를 적용하면서 원격으로 배포한 과정을 공유하려고 합니다.

자료가 많아 쉽게 원격으로 배포를 할 수 있을 줄 알았는데 생각보다 어려움을 겪어서 정리하고자 글을 작성하게 되었습니다.

다음 기회에는 CI/CD도 적용해보고 싶네요 😯

맥북 기준으로 작성되었으며 docker-compose.yml 파일이 준비되어 있다고 가정합니다.
샘플이 필요하시다면 여기에서 다운로드하시면 됩니다.

 

 

 

 

❌  DOCKER_HOST 환경 변수를 설정하여 실행

docker-compose 명령 전에 DOCKER_HOST 환경 변수를 실행해주면 타겟을 지정할 수 있습니다.

-H(--host) 옵션을 통해 전달해도 됩니다.

DOCKER_HOST= "ssh://user@remotehost" docker-compose up -d

 

하지만 제 경우 에러가 발생했습니다. 

"docker: Cannot connect to the Docker daemon at tcp://ip. Is the docker daemon running?"

아래 명령어로 docker를 재시작해보고 보안규칙 문제일 수도 있겠다는 생각에 ec2 인바운드 규칙을 수정해도 마찬가지였습니다.

sudo systemctl start docker
sudo systemctl enable docker

조금 더 구글링 해본 결과 docker daemon 설정, 권한 설정이 문제인 것 같았지만 이 방법은 수동으로 배포하는 것과 크게 차이가 없는 것 같아 다른 방법을 찾아보았습니다.

 

 

 

 

✅  Docker Context 사용

Docker context란 배포할 대상(Docker API endpoints)에 이름을 붙이고 나중에 사용할 수 있도록 정보를 저장하는 것을 말합니다. 

원격 호스트 정보를 쉽게 관리할 수 있고 배포 대상을 자유롭게 변경할 수 있습니다.

명령어도 아주 간단합니다.

 

  1. docker context create 명령어로 context를 생성하고
  2. docker context use를 이용해 사용할 context만 지정해주면 끝!
docker context create context이름 ‐‐docker host=ssh://user@remotemachine
docker context use context이름

 

이제 실행하는 명령어는 서버에서 실행하는 것과 똑같습니다.

docker ps
docker-compose -f docker-compose.yml up -d

 

기본 context는 default고 docker context ls 명령을 이용해 context 목록을 확인할 수 있습니다.

docker context use default
docker context ls

 

굳이 context를 스위칭하지 않아도 --context 옵션을 이용하면 동일하게 사용할 수 있습니다.

docker --context context명 ps

 

 

ssh 접속 Key 설정

ssh 접속에 필요한 key를 설정하지 않으면 permission denied 에러가 발생하게 됩니다.

"Permission denied (publickey,password)."

 

관리하기 쉽게 key를 ~/.ssh 위치로 복사한 후 ssh-add 명령을 이용해 추가해주면 됩니다.

ssh-add ~/.ssh/key파일명

다시 시도해보면 docker context와 정상적으로 연결된 것을 확인할 수 있습니다.

설정 후에도 Permission 문제가 발생한다면 다른 방법으로 설정해보시길 바랍니다.

 

 

 

docker-compose volumn 에러

세팅도 다 되었겠다 설레는 마음으로 docker-compose 명령을 실행했는데 새로운 에러가 저를 반겨줍니다.

역시 한 번에 될 리 없죠😂

"mount through procfd: not a directory: unknown: Are you trying to mount a directory onto a file"

 

당시 docker-compose.yml

services:
  nginx:
    image: nginx
    networks:
      - backend
    depends_on:
      - hola-backend
    ports:
      - "80:80"
    volumes: 
      - ./nginx.conf:/etc/nginx/nginx.conf
    restart: "unless-stopped"

 

로컬 환경에서는 문제없이 실행이 됐었는데 왜 원격일 때 문제가 발생할까 찾아보니 원격(remote)으로는 volume을 사용할 수 없다고 합니다.

volume을 이용해 nginx.conf 파일을 매칭 하는 것이 아니라 Dockerfile로 이미지를 만들어 처리했습니다.

지정한 구성 파일을 사용하고 싶기 때문에 기본 파일을 삭제하는 명령을 포함했습니다.

 

Dockerfile

FROM nginx
RUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY content /usr/share/nginx/html
COPY conf /etc/nginx

 

이미지 생성

docker build -t nginx_image

 

 

 

Conclusion

이제 docker context를 이용해서 원격 docker 호스트에 마음대로 배포를 할 수 있게 되었습니다.

더 좋은 방법이 있거나 잘못된 내용이 있을 경우 댓글로 알려주시면 감사하겠습니다.🙏

다음 글과 이어집니다.

Docker, Nginx, Node.js 환경에서 서비스 무중단 배포하기

 

 

참고 글