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)에 이름을 붙이고 나중에 사용할 수 있도록 정보를 저장하는 것을 말합니다.
원격 호스트 정보를 쉽게 관리할 수 있고 배포 대상을 자유롭게 변경할 수 있습니다.
명령어도 아주 간단합니다.
- docker context create 명령어로 context를 생성하고
- 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 환경에서 서비스 무중단 배포하기
참고 글
'기타' 카테고리의 다른 글
[Macbook] 맥북 외장모니터 연결 문제 임시 해결(모니터 깜빡임) (2) | 2022.01.09 |
---|---|
[Docker] Docker, Nginx, Node.js 환경에서 서비스 무중단 배포하기 (0) | 2021.12.19 |
[MacBook]맥북에게 5000번 포트를 빼앗겼을때 - error: bind EADDRINUSE null:5000 에러 해결 (8) | 2021.12.18 |
SVN checkout시 SSL 에러 해결방법(CentOS) (0) | 2021.11.05 |
REST API란, RESTful API 설계 가이드 (0) | 2021.01.20 |