우분투 서버
설치 분류

Docker를 Web에서 관리하는 Portainer 설치방법

컨텐츠 정보

  • 19,544 조회
  • 4 댓글
  • 0 추천
  • 목록

본문

3232235777_1FaQPrvI_5f47a4bd6b8b893638d52613e82cb3e0ec3f064a.png



1. Portainer는 무엇일까요?


portainer는 docker를 Web UI 형태로 관리할 수 있게 해주는 툴입니다.


도커를 SSH에서 관리하는 것보다 편하고 직관적입니다.



2. docker-compose로 실행하기


기본적으로 docker 명령어로 쓸 수 있지만 개인적으로 docker-compose로 관리하는 것이 더 직관적이고 편한 것 같아서 선호합니다.


docker-compose.yml 파일 하나만 만들면 바로 실행이 됩니다.


기본적으로 메인으로 쓰는 docker-compose.yml 파일에 넣어서 한꺼번에 관리하는 것도 좋지만,


메인 docker-compose를 전부 멈추는 경우 portainer도 같이 멈추기 때문에 따로 실행되는 것이 좋다고 생각합니다.



우선 docker-compose.yml 파일이 들어갈 폴더를 생성하는 것이 좋습니다.


우선 홈 폴더를 /home/sammy/docker 라고 지정하고 해당 폴더에서 셋팅한다고 할 경우로 해보겠습니다.



mkdir portainer && cd portainer


portainer 도커 컴포즈 파일과 데이터가 들어갈 폴더를 생성하고 이동합니다.



nano docker-compose.yml


위 명령어로 도커 컴포즈 파일을 생성합니다.



version: '3'


services:
  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: always
    ports:
      - 8880:9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer_data:/data


volumes:
  portainer_data:


ports는 8880이 아닌 자신이 접속하고 싶은 원하는 포트로 변경할 수 있습니다.


위 내용을 넣고 컨트롤 + O, 엔터, 컨트롤 + X로 저장 후 빠져나옵니다.



sudo docker-compose up -d


위 명령어로 도커 컴포즈 파일의 내용을 데몬으로 실행하게 됩니다.



/portainer# docker-compose up -d
Creating network "portainer_default" with the default driver
Creating volume "portainer_portainer_data" with default driver
Pulling portainer (portainer/portainer-ce:alpine:)...
latest: Pulling from portainer/portainer-ce:alpine
d1e017099d17: Pull complete
717377b83d5c: Pull complete
Digest: sha256:f8c2b0a9ca640edf508a8a0830cf1963a1e0d2fd9936a64104b3f658e120b868
Status: Downloaded newer image for portainer/portainer-ce:alpine
Creating portainer ... done


위와 같이 portainer 이미지를 다운 받고 실행되는 것을 볼 수 있습니다.



3. 웹에서 portainer 접속하기


접속하려면 당연히 8880번 포트는 방화벽에서 열어줘야겠죠? ^^


웹브라우저에 http://example.com:8880


위와 같이 접속하면 됩니다.


3232235777_sZYDeymv_2811df468b78f2226b1d6eec584eff7a1b05aa71.png


이제 위와 같이 관리자 계정을 생성하라고 나옵니다.


Username에 원하는 ID를 넣고, 비번을 똑같이 두번 넣으면 됩니다.


ID는 당연히 보안을 위해 admin은 안쓰는게 좋겠죠? ^^


다 넣고 Create user 를 누릅니다.


3232235777_2eqVOF7E_3a28326f2ea0480f2efe2e871455afcd9ef0b2c4.png


위와 같이 Local을 선택하고 Connect를 누릅니다.


3232235777_r3d6Xh0g_48e9c331f86b469e1dac994d790bf2169f473f98.png


위와 같이 local이라는 내용이 보입니다.


현재 실행되고 있는 스택의 수, 컨테이너, 볼륨, 이미지 등이 표시되네요.


이제 local을 클릭해보면


3232235777_Ate3WEkQ_f89c75451adde5c22a919dd8cd1438135f32494c.png


위와 같이 스택, 컨테이너, 이미지, 볼륨, 네트워크를 볼 수 있습니다.


저는 다른건 별로 안쓰고 Containers 부분을 많이 활용하고 있는데요.


Container를 눌러보면


3232235777_jfdaRoye_be17c487ef06035acfa5513624100852a1892d49.png


위와 같이 현재 실행되고 있는 컨테이너 리스트가 나옵니다.


해당 리스트를 눌러서 로그도 볼 수 있고, Console에 들어가서 직접 명령을 내릴 수도 있습니다.


저는 여러가지를 많이 쓰는데 실시간으로 로그를 보는 것이 좋더라구요. ㅎㅎ



4. SSL 연결 사용하기


portainer는 기본적으로 http를 사용하기 때문에 보안에 좋지 않습니다.


자신의 호스트에 SSL 인증서가 있다면 https로 접속할 수 있습니다.


SSL 인증서가 호스트(내 컴퓨터 또는 서버)의 /home/sammy/docker/site/ssl 폴더에 있다고 가정하고 알려드리겠습니다.



sudo docker-compose down -v


우선 실행되고 있는 portainer를 정지합니다.



nano docker-compose.yml


위 명령어로 도커 컴포즈 파일로 들어갑니다.



version: '3'


services:
  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: always
    ports:
      - 8880:9000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer_data:/data
      - /home/sammy/docker/site/ssl:/certs:ro
    command:
      --ssl
      --sslcert /certs/fullchain.pem
      --sslkey /certs/privkey.pem


volumes:
  portainer_data:


위와 같이 호스트의 /home/sammy/docker/site/ssl 폴더를 컨테이너의 /certs 읽기 전용으로 볼륨을 붙입니다.


그리고 command에 ssl 접속 명령어를 넣고, sslcert 옵션에서 인증서 경로, sslkey 옵션에서 개인키 경로를 지정해주면 됩니다.


내용을 자신의 환경에 맞게 넣고 컨트롤 + O, 엔터, 컨트롤 + X로 저장 후 빠져나옵니다.



sudo docker-compose up -d


위 명령어로 다시 실행하면 


https://example.com:8880


위와 같은 https로 접속할 수 있습니다.



5. Nginx와 연결하여 특정 IP만 접속 허용하기


Nginx 컨테이너가 같은 도커 네트워크에 있을 때 리버스 프록시 방식으로 연결할 수 있습니다.


기존 방식으로는 포트가 노출되어 방화벽을 해제해줘야 하고, 특정 IP만 접속 허용하는 것이 불가능합니다.


따라서 Nginx와 연결하면 443이나 80 같은 포트를 그대로 쓰고, 앞에 서브도메인을 넣어서 관리할 수 있으며, 특정 IP만 접속 할 수 있게 셋팅 가능합니다.


(1) Nginx 컨테이너와 같은 docker-compose 파일에서 관리하기


우선 기존 docker-compose.yml 을 수정합니다.



nano docker-compose.yml


위 명령어로 수정합니다.



version: '3'


services:


## 여러 컨테이너들... 생략


  webserver:
    depends_on:
      - php
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./site:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
    networks:
      - app-network


  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: always
    #ports:
    #  - "8880:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer_data:/data
    networks:
      - app-network
  
volumes:
  nginx-conf:
  portainer_data:


networks:
  app-network:
    driver: bridge


기본적으로 위와 같이 Nginx와 같은 네트워크에 있게 셋팅할 수 있을 것입니다.


이 셋팅의 장점은 쉽고 편하다는 것입니다.


Nginx 리버스 프록시로 접속 가능하게 하면 포트 노출도 필요없습니다. 80이나 443포트로 접속할 것입니다.



(2) Nginx 컨테이너와 다른 docker-compose 파일에서 관리하기


또다른 방법으로는 다른 폴더에 또다른 docker-compose.yml 파일을 작성하는 것입니다.


먼저



sudo docker-compose down


위 명령어로 기존에 돌아가던 도커 컴포즈를 종료합니다.


그리고 기존에 작성했던 docker-compose.yml 파일에서 portainer 관련 내용을 지웁니다.



mkdir portainer && cd portainer


위 명령어로 portainer 폴더를 만들고 이동합니다.



nano docker-compose.yml


위 명령어로 새로운 portainer 도커 컴포즈 파일을 생성합니다.



version: '3'


services:
  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer_data:/data
    networks:
      - gnuboard_app-network


volumes:
  portainer_data:


networks:
  gnuboard_app-network:
    external: true


위와 같이 작성합니다.


특이한 부분은 networks 부분을 gnuboard_app-network와 외부(external) 소통을 선택하여 같은 네트워크 상에 있게 합니다.


이렇게 네트워크와 연결하면 여러개의 docker-compose로 실행된 컨테이너와 소통할 수 있습니다.


그래서 Nginx 리버스 프록시가 가능해집니다.



또한 docker-compose가 분리되어 있기 때문에 Nginx 쪽에서 docker-compose down 명령어를 내려도 portainer는 종료되지 않습니다.


장단점이 명확하므로 선택해서 쓰시면됩니다.


저는 개인적으로 쓰다보니 그냥 하나의 docker-compose.yml 파일에 몰아넣어서 관리를 편하게 하는게 낫더라구요.


이 셋팅도 포트 노출이 없어서 보안에 좋습니다. Nginx를 통로로 쓰기 때문에 포트를 오픈할 필요가 없습니다.


-------


docker-compose 파일을 작성한 후



sudo docker-compose up -d --force-recreate


위 명령어로 강제 재생성합니다.


이제 portainer 쪽 설정은 끝났습니다.


Nginx 설정파일만 추가해주면 됩니다.


Nginx 설정파일이 있는 곳에 가서



nano portainer.conf


위와 같이 portainer Nginx 설정파일을 만듭니다.



server {
        listen 443;
        server_name port.example.com;
        server_tokens off;


        include /etc/nginx/conf.d/ssl-conf.conf; #Nginx의 SSL 설정
        include /etc/nginx/conf.d/options-ssl-nginx.conf; #Nginx의 SSL 설정


        #IP 차단 부분입니다. 밑의 내용을 수정 후 앞에 #을 빼면 IP차단이 적용됩니다.
        #allow 111.111.111.111; #자신의 집 컴퓨터의 외부IP를 확인 후 넣고 앞에 #을 제거하면 됩니다.
        #allow 123.123.123.123; #두번째 허용 IP
        #allow 124.124.124.124; #세번째 허용 IP # 이렇게 허용 IP를 추가해준 후 앞에 #을 제거하면 됩니다.
        deny all; # 위 아이피 이외에 모든 IP를 차단합니다.
        
        location / {
            proxy_pass         http://portainer:9000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;          
        }
}


SSL 인증서 설정은 적당히 해주시고, IP 차단 부분에 자신의 집 외부IP를 넣으면 됩니다. 그리고 앞에 # 주석 해제하구요.


이렇게 셋팅한 후 


Nginx가 있는 docker-compose.yml 파일이 있는 곳으로 가서 



sudo docker-compose up -d --force-recreate --no-deps webserver


위와 같이 Nginx를 강제 재시작해준 후 


https://port.example.com


위와 같은 주소로 들어가면 접속이 됩니다.


추후에 Nginx, portainer, 워드프레스, 그누보드, redis, ffmpeg 모두 돌아가는 도커 설정을 업로드 할 예정입니다.


그때 더 자세히 알려드리도록 하겠습니다.


이상 docker를 Web에서 관리하는 툴인 portainer 설치와 간단한 실행 방법을 알려드렸습니다.



6. 참조링크


https://portainer.readthedocs.io/en/stable/deployment.html


https://stackoverflow.com/questions/52819468/portainer-how-to-specify-ssl-in-docker-compose-yml

관련자료

댓글 4 / 1 페이지

히라미님의 댓글

Docker 먼저 설치하게 되는 Portainer 이내요..
Portainer 사용법 익숙해지면 웹으로도 거의 다 할수있어서 편리하내요..
전 거의 모니터링 용도로 쓰는..

외부에 주소 노출되면 위험할수도 있으니까 아이피 접근허용으로 해주는것도 좋을듯 하내요 ㅎ

우성군님의 댓글의 댓글

아이피 접근 허용은 Nginx랑 연계해서 해보려고 했는데요.

이게 docker-compose로 한꺼번에 down 해버리면 portainer도 같이 down이 되더라구요.

그래서 보안 쪽을 약간 포기하고 편의성 때문에 이렇게 셋팅해보았습니다.

Nginx 연계해서 아이피 접근 쪽 설정하는 것도 좋다고 생각합니다. ㅎㅎ

---

서로 다른 docker-compose 파일에서 만든 컨테이너끼리 네트워크 하는 방법을 알았습니다.

해당 내용 추가해야겠네요 ㅎㅎ

--

Nginx에 연결하는 방법도 올렸습니다!

efvewvrev님의 댓글

중간쯤에 까지 진행 해봤습니다. 콘솔에서는 bash가 안되네요. 보통 sh이용하나요? ash 이용하나요? bash가 기본인줄 알았는데 접속이 안되고 설치가 안되어 있네요..
전체 34 / 4 페이지
RSS

최근글


새댓글


알림 0