웹사이트 검색

Nginx Proxy Manager로 Docker 관리를 위해 Portainer를 설치하고 사용하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
    1. 센트 OS/록키 리눅스/알마 리눅스
    2. 우분투/데비안

    1. 센트 OS/록키 리눅스/알마 리눅스
    2. 우분투
    3. 데비안

    1. NPM 설치
    2. NPM 액세스
    3. Portainer를 NPM 컨테이너에 연결

    1. 외부 컨테이너를 Portainer에 부착

    Portainer는 Docker, Kubernetes 및 Nomad를 위한 오픈 소스 컨테이너 관리 솔루션으로 컨테이너 시작, 생성 및 실행을 쉽게 단순화합니다. 컨테이너, 이미지, 네트워크 및 볼륨을 관리하기 위한 웹 기반 대시보드를 제공합니다.

    이 자습서에서는 Linux 서버에 Portainer 컨테이너 관리 솔루션을 설치 및 구성하고 이를 사용하여 다양한 앱을 실행하는 Docker 컨테이너를 만들고 관리하는 방법을 배웁니다. 또한 Nginx 프록시 관리자를 사용하여 이러한 컨테이너를 Nginx 뒤에 배치하는 방법도 배웁니다.

    전제 조건

    • Ubuntu/Debian/Cent OS/Rocky Linux 8/Alma Linux를 실행하는 Linux 서버.\n
    • sudo 권한이 있는 루트가 아닌 사용자.\n
    • Portainer(portrainer.example.com) 및 Nginx Proxy Manager(npm.example.com)용 서버를 가리키는 정규화된 도메인 이름(FQDN) ).

    1단계 - 방화벽 구성

    센트 OS/록키 리눅스/알마 리눅스

    Firewalld 방화벽이 설치되어 있어야 합니다. 방화벽 상태를 확인하십시오.

    $ sudo firewall-cmd --state
    running
    

    포트 80, 9443 및 443을 엽니다. Portainer는 포트 9443을 사용하여 HTTPS를 통해 웹 UI를 노출합니다. Nginx Proxy Manager는 UI에 포트 81을 사용합니다.

    $ sudo firewall-cmd --permanent --add-service=http
    $ sudo firewall-cmd --permanent --add-service=https
    $ sudo firewall-cmd --permanent --add-port=9443/tcp
    $ sudo firewall-cmd --permanent --add-port=81/tcp
    

    변경 사항을 적용하려면 방화벽을 다시 로드하십시오.

    $ sudo firewall-cmd --reload
    

    우분투/데비안

    Ubuntu 및 Debian 시스템은 기본적으로 ufw(복잡하지 않은 방화벽)를 사용합니다.

    방화벽이 실행 중인지 확인하십시오.

    $ sudo ufw status
    

    실행 중이면 포트 80, 9443 및 443을 엽니다.

    $ sudo ufw allow 80
    $ sudo ufw allow 443
    $ sudo ufw allow 9443
    $ sudo ufw allow 81
    

    방화벽이 실행되고 있지 않으면 SSH 포트를 엽니다.

    $ sudo ufw allow "OpenSSH"
    

    방화벽이 실행되고 있지 않으면 활성화하십시오.

    $ sudo ufw enable
    

    실행 중인 경우 다시 로드하여 변경 사항을 적용합니다.

    $ sudo ufw reload
    

    2단계 - 도커 설치

    센트 OS/록키 리눅스/알마 리눅스

    다음 명령을 실행하여 Docker를 설치합니다.

    $ sudo yum install -y yum-utils
    $ sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    $ sudo yum install docker-ce docker-ce-cli containerd.io
    

    우분투

    $ sudo apt install ca-certificates curl gnupg lsb-release
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    $ sudo apt update
    $ sudo apt install docker-ce docker-ce-cli containerd.io
    

    데비안

    $ sudo apt install ca-certificates curl gnupg lsb-release
    $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    $ sudo apt update
    $ sudo apt install docker-ce docker-ce-cli containerd.io
    

    Docker 서비스를 활성화하고 시작합니다.

    $ sudo systemctl start docker --now
    

    Docker 그룹에 사용자 이름을 추가합니다.

    $ sudo usermod -aG docker $USER
    

    시스템에서 로그아웃했다가 다시 로그인하여 변경 사항을 적용하십시오.

    3단계 - Docker Compose 설치

    Docker Compose 바이너리를 다운로드하고 설치합니다.

    $ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    바이너리에 실행 권한을 적용합니다.

    $ sudo chmod +x /usr/local/bin/docker-compose
    

    4단계 - 포터이너 설치

    Portainer용 디렉토리를 생성합니다.

    $ mkdir ~/portainer
    

    디렉터리로 전환합니다.

    $ cd ~/portainer
    

    편집을 위해 Docker Compose 파일을 만들고 엽니다.

    $ nano docker-compose.yaml
    

    다음 코드를 붙여넣습니다.

    version: "3.3"
    services:
        portainer:
          image: portainer/portainer-ce:latest
          container_name: portainer
          restart: always
          privileged: true
          volumes:
            - ./data:/data:Z
            - /var/run/docker.sock:/var/run/docker.sock:Z
          ports:
            - 9443:9443
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    Docker 작성 파일을 살펴보겠습니다.

    • Docker Hub에서 최신 버전의 Portainer Community Edition을 가져오고 있습니다. Portainer Community Edition은 무료로 사용할 수 있으며 Business Edition은 유료 라이선스가 필요합니다. Business Edition을 가져올 수 있지만 사용하려면 라이센스 키를 요청해야 합니다.\n
    • 식별 및 연결을 위해 컨테이너 이름을 portainer로 지정했습니다.\n
    • 다시 시작 정책은 always로 설정되어 부팅 중에 컨테이너가 유지됩니다.
    • privileged: true 설정은 SELinux를 사용하고 있으므로 Portainer가 Docker 소켓에 액세스하고 권한 있는 컨텍스트에서 실행할 수 있도록 하기 위한 것입니다. SELinux를 사용하지 않는 경우 이 설정을 제거할 수 있습니다. 이 설정은 하드웨어에 대한 액세스를 포함하여 호스트 시스템의 모든 것에 대한 Portainer 컨테이너 액세스를 제공합니다. 따라서 수행 중인 작업을 알고 있는 경우에만 이 설정을 활성화하십시오.\n
    • volumes 섹션은 바인드 마운트를 사용하여 호스트의 폴더를 컨테이너의 폴더에 매핑합니다. 컨테이너 관리를 위해 관련 데이터 및 Docker 소켓 API를 저장하기 위해 컨테이너에 ~/portainer/data 디렉터리를 노출했습니다. :Z 레이블은 호스트에서 SELinux를 실행 중임을 Docker에 알려줍니다. SELinux를 활성화하지 않은 경우 레이블을 제거해야 합니다.\n

    포테이너를 시작합니다.

    $ docker-compose up -d
    

    컨테이너의 상태를 확인합니다.

    $ docker ps
    CONTAINER ID   IMAGE                           COMMAND        CREATED         STATUS         PORTS                                                           NAMES
    916411e8d12e   portainer/portainer-ce:latest   "/portainer"   5 seconds ago   Up 4 seconds   8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp   portainer
    

    5단계 - Portainer 액세스 및 구성

    브라우저에서 URL https://:9443을 열면 다음 화면이 나타납니다.

    새 관리자 사용자를 생성하라는 메시지가 표시됩니다. 사용자 세부 정보를 추가합니다. 개인 정보 보호에 관심이 있는 경우 익명 통계 수집 허용 확인란을 선택 취소합니다. 사용자 만들기 버튼을 클릭하여 설치를 시작하고 새 관리자 계정을 만듭니다.

    다음으로 다음 대시보드 화면으로 이동합니다.

    몇 초 후 자동으로 새로 고쳐지고 다음 화면이 표시됩니다.

    Portainer가 실행되고 있는 로컬 환경을 보여줍니다. 시작하려면 로컬 환경을 클릭하십시오.

    대부분의 섹션은 자명합니다. 스택 섹션은 Docker 작성 파일을 사용하여 컨테이너를 만드는 데 도움이 됩니다. 사이드바의 컨테이너 범주를 사용하여 컨테이너를 직접 배포할 수 있습니다. 호스트 섹션을 통해 현재 도커 환경을 구성할 수 있습니다. 앱 템플릿 섹션에는 가장 일반적인 애플리케이션을 설치하기 위한 사전 설치된 Docker 작성 파일이 함께 제공됩니다. 사용자 지정 템플릿을 만들 수도 있습니다.

    설정 섹션에서는 사용자 지정 Docker 레지스트리 추가, Docker swarm용 여러 호스트 추가, 사용자 액세스 구성, 데이터 백업 및 Portainer 사용자 지정과 같은 다양한 설정을 구성할 수 있습니다.

    5단계 - Nginx 프록시 관리자(NPM)를 사용하여 역방향 프록시 뒤에 Portainer 배치

    계속 진행하기 전에 Nginx Proxy Manager를 사용하여 Portainer를 리버스 프록시 뒤에 배치하겠습니다. Nginx Proxy Manager는 Nginx를 리버스 프록시 호스트로 설정하기 위한 웹 관리 UI를 제공하는 Docker 애플리케이션입니다. 리디렉션 또는 스트리밍 호스트로도 사용할 수 있습니다.

    NPM 설치

    첫 번째 단계는 Nginx 프록시 관리자(NPM)용 네트워크를 생성하는 것입니다. 네트워크 섹션을 열고 네트워크 추가 버튼을 클릭하여 새 네트워크를 만듭니다.

    네트워크에 이름을 지정하고 모든 설정을 변경하지 않은 상태로 둡니다. 네트워크 만들기 버튼을 클릭하여 완료합니다.

    스택을 방문하고 스택 추가 버튼을 사용하여 새 스택을 생성합니다.

    스택 이름을 nginx-proxy-manager로 지정하고 다음 코드를 붙여넣습니다.

    version: "3.3"
    services:
      npm-app:
        image: 'jc21/nginx-proxy-manager:latest'
        container_name: npm-app
        restart: unless-stopped
        ports:
          - '80:80' # Public HTTP Port
          - '443:443' # Public HTTPS Port
          - '81:81' # Admin Web Port
          # Add any other Stream port you want to expose
          # - '21:21' # FTP
        environment:
          DB_MYSQL_HOST: "npm-db"
          DB_MYSQL_PORT: 3306
          DB_MYSQL_USER: "npm"
          DB_MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
          DB_MYSQL_NAME: "npm"
          # Uncomment the line below if IPv6 is not enabled on your host
          # DISABLE_IPV6: 'true'
        volumes:
          - ./npm-data:/data:Z
          - ./letsencrypt:/etc/letsencrypt:Z
        depends_on:
          - npm-db
        networks:
          - npm-network
          - npm-internal
    
      npm-db:
        image: 'mariadb:latest'
        container_name: npm-db
        restart: unless-stopped
        environment:
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
          MYSQL_DATABASE: 'npm'
          MYSQL_USER: 'npm'
          MYSQL_PASSWORD: ${DB_MYSQL_PASSWORD}
        volumes:
          - ./npm-data/mysql:/var/lib/mysql:Z
        networks:
          - npm-internal
    
    networks:
      npm-internal:
      npm-network:
        external: true
    

    데이터베이스 및 루트 MySQL 암호를 설정하기 위해 두 개의 환경 변수를 설정했습니다. Portainer는 환경 변수를 사용하여 비밀을 설정하는 데 사용할 수 있습니다. 페이지를 아래로 스크롤하고 환경 변수 추가 버튼을 클릭하여 강력한 암호를 추가합니다.

    스택 배포 버튼을 클릭하여 NPM 컨테이너를 생성하고 시작합니다.

    액세스 NPM

    브라우저에서 URL https://:81을 열면 다음 화면이 나타납니다. 로그인하려면 다음 기본 자격 증명을 입력하십시오.

    이메일 주소: [email 비밀번호: changeme

    다음으로 이름과 이메일 주소를 설정하라는 메시지가 즉시 표시됩니다. 저장 버튼을 클릭하면 새 암호를 생성하라는 메시지가 표시됩니다. 시작하려면 저장 버튼을 다시 클릭하십시오.

    호스트 >> 프록시 호스트를 방문하여 프록시 호스트 추가 버튼을 클릭합니다.

    도메인 이름을 portainer.example.com으로 입력합니다. 구성표를 https로 선택합니다. 전달 호스트 이름으로 컨테이너 이름을 입력하고 전달 포트로 9443을 입력합니다. 일반 악용 차단 및 Websockets 지원 옵션 옵션을 확인합니다.

    SSL 탭으로 전환하고 드롭다운 메뉴에서 새 SSL 인증서 요청을 선택합니다. SSL 연결을 보호하고 최적화하려면 SSL 및 HTTP/2 지원 강제 옵션을 선택하세요. 갱신 알림을 받을 이메일 주소를 입력하고 서비스 약관에 동의합니다. 저장 버튼을 클릭하여 Portainer에 대한 프록시 호스트 설정을 완료합니다.

    Portainer를 NPM 컨테이너에 연결

    프록시 호스트를 설정했지만 컨테이너가 여전히 NPM 네트워크에 연결되어 있지 않습니다. Portainer 대시보드로 돌아가서 컨테이너 섹션을 방문하고 portainer 컨테이너를 선택합니다.

    연결된 네트워크 섹션 아래의 드롭다운 메뉴에서 npm-network를 선택하고 네트워크 가입 버튼을 클릭하여 Portainer 컨테이너를 프록시 관리자 네트워크에 추가합니다.

    오류가 발생할 수 있지만 페이지를 새로 고치면 NPM 네트워크에 추가된 컨테이너가 표시되어야 합니다.

    브라우저에서 URL https://portainer.example.com을 사용하여 Portainer에 액세스할 수 있어야 합니다.

    Nginx 프록시 관리자 자습서에서 설명한 대로 https://npm.example.com과 같이 공개적으로 액세스할 수 있는 URL 뒤에 NPM을 배치하는 유사한 절차를 따를 수 있습니다.

    이제 Portainer에 대한 공개 URL을 설정했으므로 노출된 9443 포트를 제거할 수 있습니다. 그렇게 하려면 터미널로 돌아가서 portainer 디렉토리로 전환하십시오.

    $ cd ~/portainer
    

    편집을 위해 Docker 작성 파일을 엽니다.

    $ nano docker-compose.yaml
    

    아래와 같이 주석 처리하여 포트 섹션을 제거합니다.

    version: "3.3"
    services:
        portainer:
          image: portainer/portainer-ce:latest
          container_name: portainer
          restart: always
          privileged: true
          volumes:
            - ./data:/data:Z
            - /var/run/docker.sock:/var/run/docker.sock:Z
          #ports:
          #  - 9443:9443
          networks:
            - npm-network
    
    networks:
      npm-network:
        external: true
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    여기에서 Portainer 컨테이너를 다시 시작해야 하므로 NPM 네트워크의 세부 정보를 추가했습니다.

    Portainer 컨테이너를 중지합니다.

    $ docker-compose down --remove-orphans
    

    업데이트된 구성으로 컨테이너를 다시 시작하십시오.

    $ docker-compose up -d
    

    6단계 - 앱 템플릿을 사용하여 컨테이너 배포

    Portainer는 최소한의 구성으로 직접 응용 프로그램을 시작할 수 있도록 미리 정의된 여러 템플릿을 제공합니다.

    앱 템플릿 섹션을 방문하여 템플릿을 선택합니다. 이름을 지정하고 사용할 네트워크를 선택합니다. 고급 옵션 섹션을 사용하여 사용자 지정 포트, 네트워크 및 볼륨 탑재를 배포합니다.

    컨테이너 배포 버튼을 클릭하여 애플리케이션 배포를 완료합니다. 여기서는 Redis 컨테이너를 배포합니다.

    7단계 - 컨테이너 관리

    기존 컨테이너를 관리해 보겠습니다. 컨테이너 페이지를 열면 실행 중인 모든 컨테이너가 표시됩니다.

    계속하려면 최근에 생성된 hw-redis 컨테이너를 클릭합니다.

    상단에는 실행 중인 컨테이너에서 수행할 수 있는 작업 목록이 표시됩니다. 컨테이너를 중지하고 죽일 수 있습니다. Recreate는 처음부터 컨테이너를 생성합니다. 복제/수정 옵션을 사용하면 실행하기 전에 설정을 변경할 수 있는 또 다른 동일한 컨테이너를 만들 수 있습니다.

    컨테이너 상태는 컨테이너에 대한 실행 시간, IP 주소 및 기타 세부 정보를 보여줍니다.

    로그 옵션은 docker logs 명령의 출력을 표시합니다. 명령 출력은 캐시되지 않으므로 페이지를 새로 고칠 때마다 명령이 처음부터 실행됩니다.

    검사 옵션은 컨테이너에서 docker inspect 명령을 실행하고 해당 출력을 표시합니다.

    통계 옵션은 실시간으로 컨테이너 사용량을 보여줍니다.

    콘솔 옵션을 사용하여 컨테이너 콘솔을 시작할 수 있습니다. 실행할 명령과 시스템 사용자를 묻는 메시지가 표시됩니다.

    연결 버튼을 눌러 콘솔을 시작합니다.

    연결 옵션은 docker attach 명령을 실행합니다.

    컨테이너 세부 정보 페이지에는 다른 옵션이 있습니다. 기존 컨테이너를 사용하여 이미지를 생성할 수 있습니다. 다른 옵션에는 컨테이너 다시 시작 정책 변경 및 기존 컨테이너에 대한 네트워크 연결 또는 연결 끊기가 포함됩니다.

    외부 컨테이너를 Portainer에 연결

    Portainer 외부에서 컨테이너를 생성하면 Portainer가 실행되는 동일한 시스템에서 생성되는 한 내부에 표시됩니다. 이는 Portainer가 websocket을 사용하여 Docker와 연결되어 있기 때문에 가능합니다.

    Hello World Docker 컨테이너를 실행하여 테스트해 보겠습니다.

    $ docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

    터미널에서 컨테이너 목록을 확인하십시오. 중지된 컨테이너를 포함하여 모든 컨테이너 목록을 표시하기 위해 -a 플래그를 사용하고 있습니다. 컨테이너의 이름이 sad_williamson임을 알 수 있습니다.

    $ docker ps -a
    CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS                     PORTS                                                                                  NAMES
    5fa46b85d594   hello-world                       "/hello"                 3 minutes ago   Exited (0) 3 minutes ago                                                                                          sad_williamson
    .....
    

    이제 Portainer Containers 페이지를 확인하면 Hello World 컨테이너가 같은 이름의 목록에 중지된 것으로 표시됩니다.

    결론

    이것으로 Docker 관리 및 Nginx 프록시 관리자용 Portainer 설치 및 사용에 대한 자습서를 마칩니다. 다음 튜토리얼에서는 도커 이미지 구축, 맞춤형 컨테이너 생성, Docker swarm과 함께 Portainer 사용에 대해 알아볼 것입니다. 질문이 있으시면 아래 의견에 게시하십시오.