tmkimm
Eddy
tmkimm
전체 방문자
오늘
어제
  • 분류 전체보기 (34)
    • DataBase (3)
    • Javascript (0)
    • Node.js (7)
    • Java (2)
    • Spring (3)
    • 기타 (13)
    • 사이드프로젝트 (2)
    • 생각 정리 (2)
    • 좋은글 공유 (1)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 논쟁
    • Sentry
    • 설계
    • docker
    • swagger
    • 생각정리
    • API 문서 자동화
    • mybatis
    • spring
    • SSL
    • github
    • 모니터링
    • 삽질기록
    • Java
    • 사이드프로젝트
    • 부하테스트
    • 에러트래킹
    • Git
    • Node.js

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    tmkimm

    Eddy

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

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

    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 환경에서 서비스 무중단 배포하기

     

     

    참고 글

    • How to deploy on remote Docker hosts with docker-compose
    • Deploying NGINX and NGINX Plus with Docker

     

    저작자표시

    '기타' 카테고리의 다른 글

    [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
      '기타' 카테고리의 다른 글
      • [Macbook] 맥북 외장모니터 연결 문제 임시 해결(모니터 깜빡임)
      • [Docker] Docker, Nginx, Node.js 환경에서 서비스 무중단 배포하기
      • [MacBook]맥북에게 5000번 포트를 빼앗겼을때 - error: bind EADDRINUSE null:5000 에러 해결
      • SVN checkout시 SSL 에러 해결방법(CentOS)
      tmkimm
      tmkimm
      ⭐️

      티스토리툴바