웹서버 분류

Docker에 code-server 설치하는 방법

컨텐츠 정보

  • 34,898 조회
  • 6 댓글
  • 0 추천
  • 목록

본문



code-server는 쉽게말해 VS Code를 서버에 직접 설치하는 것입니다.


설치 후 웹브라우저에서 해당 URL이나 포트에 접근하면, 웹브라우저 안에서 VS Code가 실행된다고 보면 됩니다.


기존 홈페이지 파일을 수정하려면, FTP를 열어서 해당 파일을 VS Code로 열고 수정 후 붙여주는 작업을


웹브라우저에서 바로 접속해서 즉시 수정가능하게 됩니다.


편하지만, 비밀번호가 뚫리면 사이트가 다 날아가겠죠? ^^;;



이 글에서는 제가 소개해드렸던 쉽게 설치하기 시리즈에 바로 적용할 수 있게 알려드리겠습니다.


또한 보안을 위해 특정 IP만 접근할 수 있게 Nginx 설정도 추가하는 방법도 같이 알려드리겠습니다.



이 가이드를 바로 적용할 수 있는 글은 다음과 같습니다.



Docker compose로 라이믹스 편하게 설치하는 방법


https://www.wsgvet.com/ubuntu/125



Docker compose로 그누보드 편하게 설치하는 방법


https://www.wsgvet.com/ubuntu/126



Docker compose로 워드프레스 편하게 설치하는 방법


https://www.wsgvet.com/ubuntu/153



Docker compose로 멀티 사이트 운영하기


https://www.wsgvet.com/ubuntu/123 




위 셋팅뿐만 아니라 Docker-compose로 Nginx를 설정했다면 누구나 적용할 수 있습니다.



공통 설정사항


docker-compose.yml 파일에 code-server 추가하기 


도커 폴더에서 docker-compose.yml 을 열어서 적당한 위치에 밑의 내용을 넣습니다.



  code-server:
    image: linuxserver/code-server
    container_name: code-server
    env_file: .code.env
    environment:
    - PUID=82
    - PGID=82
    - TZ=Asia/Seoul
    volumes:
    - ./data/code-server:/config
    - ./site:/config/site
    #ports:
    #  - 8443:8443
    restart: unless-stopped


하나씩 설명드리겠습니다.


env_file: .code.env <- 웹브라우저에서 접근할 때 필요한 비밀번호가 저장되는 곳입니다.


environment:  <- 환경변수 설정

- PUID=82     <- code-server에서 수정하기 위해 유저 권한을 지정하는 부분입니다. alpine 이미지에서 82www-data를 의미합니다.

- PGID=82     <- code-server에서 수정하기 위해 그룹 권한을 지정하는 부분입니다.

- TZ=Asia/Seoul  <- code-server의 시간을 한국으로 설정합니다.


volumes:  

- ./data/code-server:/config  <- code-server의 설정이 들어가는 부분입니다. 테마 설정 등이 저장이 되어, 컨테이너를 재생성해도 설정파일이 남아있게됩니다.

- ./site:/config/site <- 직접적으로 code-server가 접근 가능한 폴더를 지정하는 것입니다. 즉 ./site 폴더를 code-server 컨테이너의 /config/site 폴더에 마운트해서 code-server가 직접 접근하여 수정가능하게 해줍니다.


아까 위에서 환경변수로 PUID와 PGID를 82로 지정했는데요. 


volumes에 지정된 폴더와 그 이하 파일 및 폴더 모두 82로 권한이 변경됩니다.


따라서 ./site:/config/site 이렇게 하면 도커 폴더에 있는 site라는 폴더의 파일 및 이하 폴더가 전부 82로 바뀌게 된다는 말입니다.


이 부분을 모르고 volume을 아무곳이나 지정하게 되면,  82로 변경되면 안되는 폴더 및 파일도 변경되어 시스템이 망가지게 됩니다.


그래서 반드시 해당 폴더 셋팅을 잘 해야 합니다.


제 가이드대로 하셨다면 걱정하지 않아도 됩니다.


port는 원래 8443으로 접근하면 바로 열립니다. 하지만 Nginx 프록시를 활용할 계획이므로 주석처리하여 작동하지 않게 합니다.



docker-compose.yml 파일의 예시를 알려드리겠습니다.


(1) Docker compose로 라이믹스 편하게 설치하는 방법 예시



version: '3'


services:


  db:
    image: mariadb:latest
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - TZ=Asia/Seoul
    volumes:
      - ./data/dbdata:/var/lib/mysql


  redis:
    container_name: redis
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - ./data/dataredis:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes
  
  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./ssl/:/etc/letsencrypt/
      - /usr/share/nginx/html:/usr/share/nginx/html
    command: certonly -n --webroot -w /usr/share/nginx/html -d <domain> -d www.<domain> -d port.<domain> -d pma.<domain>


  php:
    depends_on:
      - db
    build:
      context: ./build
    container_name: php
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./site:/var/www/web
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  nginx:
    depends_on:
      - php
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - phpmyadmin:/var/www/html
      - ./ssl/:/etc/letsencrypt/
      - ./site:/var/www/web
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx/
      - /usr/share/nginx/html:/usr/share/nginx/html
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  phpmyadmin:
    image: phpmyadmin:fpm-alpine
    container_name: phpmyadmin
    #ports:
    #  - "80:80"
    environment:
      - PMA_HOST=db
    restart: unless-stopped
    depends_on:
      - db
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - phpmyadmin:/var/www/html


  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: unless-stopped
    #ports:
    #  - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/portainer_data:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      
  code-server:
    image: linuxserver/code-server
    container_name: code-server
    env_file: .code.env
    environment:
      - PUID=82
      - PGID=82
      - TZ=Asia/Seoul
    volumes:
      - ./data/code-server:/config
      - ./site:/config/site
    #ports:
    #  - 8443:8443
    restart: unless-stopped


volumes:
  phpmyadmin:



(2) Docker compose로 그누보드 편하게 설치하는 방법 예시



version: '3'


services:


  db:
    image: mariadb:latest
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - TZ=Asia/Seoul
    volumes:
      - ./data/dbdata:/var/lib/mysql
  
  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./ssl/:/etc/letsencrypt/
      - /usr/share/nginx/html:/usr/share/nginx/html
    command: certonly -n --webroot -w /usr/share/nginx/html -d <domain> -d www.<domain> -d port.<domain> -d pma.<domain>


  redis:
    container_name: redis
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - ./data/dataredis:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes


  smtp:
    image: namshi/smtp
    container_name: smtp
    restart: always
    env_file: .env


  php:
    depends_on:
      - db
    build:
      context: ./build
    container_name: php
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./site:/var/www/web
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  nginx:
    depends_on:
      - php
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - phpmyadmin:/var/www/html
      - ./ssl/:/etc/letsencrypt/
      - ./site:/var/www/web
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx/
      - /usr/share/nginx/html:/usr/share/nginx/html
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  phpmyadmin:
    image: phpmyadmin:fpm-alpine
    container_name: phpmyadmin
    #ports:
    #  - "80:80"
    environment:
      - PMA_HOST=db
    restart: unless-stopped
    depends_on:
      - db
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - phpmyadmin:/var/www/html


  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: unless-stopped
    #ports:
    #  - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/portainer_data:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  code-server:
    image: linuxserver/code-server
    container_name: code-server
    env_file: .code.env
    environment:
      - PUID=82
      - PGID=82
      - TZ=Asia/Seoul
    volumes:
      - ./data/code-server:/config
      - ./site:/config/site
    #ports:
    #  - 8443:8443
    restart: unless-stopped


volumes:
  phpmyadmin:



(3) Docker compose로 워드프레스 편하게 설치하는 방법 예시



version: '3'


services:


  db:
    image: mariadb:latest
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - TZ=Asia/Seoul
    volumes:
      - ./data/dbdata:/var/lib/mysql


  redis:
    container_name: redis
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - ./data/dataredis:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes
  
  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./ssl/:/etc/letsencrypt/
      - /usr/share/nginx/html:/usr/share/nginx/html
    command: certonly -n --webroot -w /usr/share/nginx/html -d <domain> -d www.<domain> -d port.<domain> -d pma.<domain>


  php:
    depends_on:
      - db
    build:
      context: ./build
    container_name: php
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./site:/var/www/web
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  nginx:
    depends_on:
      - php
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - phpmyadmin:/var/www/html
      - ./ssl/:/etc/letsencrypt/
      - ./site:/var/www/web
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx/
      - /usr/share/nginx/html:/usr/share/nginx/html
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  phpmyadmin:
    image: phpmyadmin:fpm-alpine
    container_name: phpmyadmin
    #ports:
    #  - "80:80"
    environment:
      - PMA_HOST=db
    restart: unless-stopped
    depends_on:
      - db
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - phpmyadmin:/var/www/html


  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: unless-stopped
    #ports:
    #  - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/portainer_data:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  code-server:
    image: linuxserver/code-server
    container_name: code-server
    env_file: .code.env
    environment:
      - PUID=82
      - PGID=82
      - TZ=Asia/Seoul
    volumes:
      - ./data/code-server:/config
      - ./site:/config/site
    #ports:
    #  - 8443:8443
    restart: unless-stopped


volumes:
  phpmyadmin:



(4) Docker compose로 멀티 사이트 운영하기 예시



version: '3'


services:


  db:
    image: mariadb:latest
    container_name: db
    restart: unless-stopped
    env_file: .env
    environment:
      - TZ=Asia/Seoul
    volumes:
      - ./data/dbdata:/var/lib/mysql
      - ./db:/docker-entrypoint-initdb.d


  redis:
    container_name: redis
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - ./data/dataredis:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes


  smtp:
    image: namshi/smtp
    container_name: smtp_relay
    restart: always
    env_file: .env


  php:
    depends_on:
      - db
    build:
      context: ./build
    container_name: php
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./site:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  nginx:
    depends_on:
      - php
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./site:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx/
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  acme.sh:
    image: neilpang/acme.sh
    container_name: acme.sh
    env_file: .env
    volumes:
      - ./data/acme.sh:/acme.sh
      - ./site:/var/www/html
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    command: acme.sh --cron --home "/acme.sh"


  phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin
    #ports:
    #  - "80:80"
    environment:
      - PMA_HOST=db
    restart: always
    depends_on:
      - db
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    restart: always
    #ports:
    #  - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/portainer_data:/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro


  code-server:
    image: linuxserver/code-server
    container_name: code-server
    env_file: .code.env
    environment:
      - PUID=82
      - PGID=82
      - TZ=Asia/Seoul
    volumes:
      - ./data/code-server:/config
      - ./site:/config/site
    #ports:
    #  - 8443:8443
    restart: unless-stopped



위와 같이 수정하면 됩니다.


이제 docker-compose.yml 수정은 끝났습니다.



.code.env 파일 생성하기


웹브라우저에서 접근했을 때 비번을 지정하는 파일입니다.


docker-compose.yml 파일과 같은 위치에 .code.env 파일을 생성 후 



# for code-server
PASSWORD=yourpassword


위와 같이 입력합니다. yourpassword 대신에 원하는 비번을 입력하세요.


그리고 저장합니다.


code-server를 시작합니다.



sudo docker-compose up -d code-server


위 명령어로 다운 받고 실행됩니다.



Nginx 설정하기


웹브라우저에서 접근하는 방법은 2가지가 있습니다.


1. code.domain.com 처럼 서브도메인 붙이기


2. domain.com:8082 처럼 도메인에 포트 붙이기


1번 방법은 443 포트를 사용해서 깔끔하게 접근할 수 있습니다.


하지만 도메인 회사의 DNS 설정에서 code를 추가해줘야하고, SSL 인증서를 추가로 받거나 와일드카드 인증서가 필요합니다.


2번 방법은 8082 같은 포트를 열어야되는 불편함이 있지만, DNS 설정에 추가할 필요가 없고, SSL 인증서 또한 기존 인증서를 그대로 쓸 수 있는 장점이 있습니다.



1번 방법에서 인증서를 추가로 발급 받는 방법을 알려드리겠습니다.


먼저 도메인의 DNS 설정에서 code를 추가하세요.


DNS 설정에서는 code.domain.com을 서버의 IP를 가리키게 합니다.


이제 Nginx에 code 설정을 추가하고, SSL 인증서를 새로 발급 받을 것입니다.


./nginx/conf.d/ 폴더에 code.conf 라는 파일을 만들고



server {
        listen 80;
        listen [::]:80;


        server_name code.domain.com;
        
        # Useful for Let's Encrypt
        location ~ /\.well-known/acme-challenge/ {
                allow all;
                root /usr/share/nginx/html; 
        }
}


code.domain.com을 자신의 도메인으로 수정한 뒤, 저장합니다.



./nginx/conf.d/


위 경로에 code를 위한 SSL 설정파일을 만듭니다.


code-ssl-conf


위와 같은 파일을 만들고



ssl_certificate /etc/letsencrypt/live/code.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/code.domain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/code.domain.com/chain.pem;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# enable strict transport security only if you understand the implications
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;


위와 같이 넣습니다.


code.domain.com 대신에 자신의 도메인을 넣습니다.


그리고 저장합니다.


code.domian.com의 SSL 인증서 발급을 위한 Nginx 설정은 끝났습니다.



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


위 명령어로 Nginx를 재시작해줍니다.



이제 인증서 생성 단계입니다.


와일드카드 인증서를 가지고 계신다면 넘어가면 됩니다.


기존에 DNS 설정을 도메인, www.도메인, pma.도메인, port.도메인 이렇게 했다면,


SSL 인증서도 총 4개의 도메인으로 구성되어 있을 것입니다.


여기에 code만 추가하면 되겠죠?


docker-compose.yml 파일을 열어서 certbot 부분을 보면



  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./ssl/:/etc/letsencrypt/
      - /usr/share/nginx/html:/usr/share/nginx/html
    command: certonly -n --webroot -w /usr/share/nginx/html -d domain.com -d www.domain.com -d port.domain.com -d pma.domain.com


위와 같이 되어있을 것입니다. 이제 code-server를 위한 인증서 발급으로 수정할 것입니다.



  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./ssl/:/etc/letsencrypt/
      - /usr/share/nginx/html:/usr/share/nginx/html
    # command: certonly -n --webroot -w /usr/share/nginx/html -d domain.com -d www.domain.com -d port.domain.com -d pma.domain.com
    command: certonly --dry-run -n --webroot -w /usr/share/nginx/html -d code.domain.com


기존 command 부분을 주석처리하고, 밑에 code를 위한 인증서 발급 테스트 명령어를 넣습니다.


code.domain.com 대신 자신의 도메인을 넣습니다.


저장 후, SSH에서 



sudo docker-compose up certbot


위 명령어를 내리면 인증서 발급 테스트를 받는 것을 실시간으로 볼 수 있습니다.



# docker-compose up certbot
Starting certbot ... done
Attaching to certbot
certbot        | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot        | Plugins selected: Authenticator webroot, Installer None
certbot        | Cert not due for renewal, but simulating renewal for dry run
certbot        | Renewing an existing certificate
certbot        | Performing the following challenges:
certbot        | http-01 challenge for code.domain.com
certbot        | Using the webroot path /usr/share/nginx/html for all unmatched domains.
certbot        | Waiting for verification...
certbot        | Cleaning up challenges
certbot        | IMPORTANT NOTES:
certbot        |  - The dry run was successful.
certbot exited with code 0


위와 같이 dry run was successful 이 나오면 테스트가 성공한 것입니다.


다시 docker-compose.yml 를 열어서 cerbot의 command 부분에 있는 --dry-run 옵션을 삭제합니다.


저장 후 다시 



sudo docker-compose up certbot


위 명령어를 내리면 정상적으로 발급 받은 것을 확인할 수 있습니다.



이제 Nginx를 SSL 인증서와 연결할 차례입니다.


./nginx/conf.d/code.conf 파일을 열어서



server {
        listen 80;
        listen [::]:80;


        server_name code.domain.com;
        
        # Useful for Let's Encrypt
        location ~ /\.well-known/acme-challenge/ {
                allow all;
                root /usr/share/nginx/html; 
        }


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        server_name code.domain.com;
        server_tokens off;


        include /etc/nginx/conf.d/code-ssl-conf;
        include /etc/nginx/conf.d/options-ssl-nginx;
       
        #IP 차단 부분입니다. 밑의 내용을 수정 후 앞에 #을 빼면 IP차단 설정이 적용됩니다.
        #allow 111.112.333.444; #자신의 집 컴퓨터의 외부IP를 확인 후 넣고 앞에 #을 제거하면 됩니다.
        #allow 123.123.123.123; #두번째 허용 IP
        #allow 124.124.124.124; #세번째 허용 IP # 이렇게 허용 IP를 추가해준 후 앞에 #을 제거하면 됩니다.
        #deny all; # 위 아이피 이외에 모든 IP를 차단합니다. 차단이 필요없다면 앞에 #을 놔두면 됩니다.


        location / {
            proxy_pass         http://code-server:8443/;
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection upgrade;
            proxy_set_header Accept-Encoding gzip;   
        }
}


위와 같이 완성된 형태로 수정 후 저장합니다. 당연히 code.domain.com은 자신의 도메인으로 수정해야 합니다.



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


위 명령어로 Nginx를 재시작해줍니다.


이제 웹브라우저에 code.domain.com 으로 접속하고 비번을 입력하면 code-server가 눈앞에 있을 것입니다.



접속에 성공했으니 docker-compose.yml 파일을 다시 수정합니다.



  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    volumes:
      - ./ssl/:/etc/letsencrypt/
      - /usr/share/nginx/html:/usr/share/nginx/html
    command: certonly -n --webroot -w /usr/share/nginx/html -d domain.com -d www.domain.com -d port.domain.com -d pma.domain.com -d code.domain.com


위와 같이 -d code.domain.com 을 추가해주고 저장합니다.



와일드카드 SSL 인증서가 있는 경우


이 경우는 정말 쉽습니다.


https://github.com/woosungchoi/docker-multi-site


위와 같이 셋팅되어 있다고 가정하겠습니다.



./nginx/conf.d/에 Nginx 설정파일을 추가합니다.


code.conf 파일을 만들어서



server {
        listen 80;
        listen [::]:80;


        server_name code.domain.com;


        location / {
                rewrite ^ https://$host$request_uri? ;
        }
}


server {
        listen 443 ssl http2;
        server_name code.domain.com;
        server_tokens off;


        include /etc/nginx/conf.d/ssl-conf;
        include /etc/nginx/conf.d/options-ssl-nginx;


        #IP 차단 부분입니다. 밑의 내용을 수정 후 앞에 #을 빼면 IP차단 설정이 적용됩니다.
        #allow 111.112.333.444; #자신의 집 컴퓨터의 외부IP를 확인 후 넣고 앞에 #을 제거하면 됩니다.
        #allow 123.123.123.123; #두번째 허용 IP
        #allow 124.124.124.124; #세번째 허용 IP # 이렇게 허용 IP를 추가해준 후 앞에 #을 제거하면 됩니다.
        #deny all; # 위 아이피 이외에 모든 IP를 차단합니다. 차단이 필요없다면 앞에 #을 놔두면 됩니다.
       
        location / {
            proxy_pass         http://code-server:8443/;
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection upgrade;
            proxy_set_header Accept-Encoding gzip;   
        }
}


위와 같이 넣으면 됩니다. 저장 후 



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


위와 같이 Nginx를 재시작해주고, 웹브라우저에 code.domain.com 으로 접속하면 끝입니다.


정말 쉽죠?



뒤에 포트를 붙여서 기존 도메인을 활용하여 접속하기


이제 기존에 있던 인증서를 이용하고, 포트로 접속하는 방법에 대해 알려드리겠습니다.


우선 자신이 원하는 포트의 방화벽을 오픈합니다. 클라우드서버를 쓴다면, 클라우드 관리자 설정에서도 방화벽을 열어줘야 합니다.


예를들어 8082번이라고 하겠습니다.


docker-compose.yml 파일을 열어서, Nginx 부분에 포트를 추가합니다.



    ports:
      - "80:80"
      - "443:443"


기존에 위와 같이 80과 443만 열려있는데 


자신이 오픈한 방화벽 포트를 같이 넣어줍니다.


8082를 오픈했다면



    ports:
      - "80:80"
      - "443:443"
      - "8082:8082"


위와 같이 추가해주면 됩니다. 저장합니다.



이제 Nginx에 설정파일을 추가해줍니다.


./nginx/conf.d/에 Nginx 설정파일을 추가합니다.


code.conf 파일을 만들어서



server {
        listen 8082 ssl http2;
        server_name domain.com;
        server_tokens off;


        include /etc/nginx/conf.d/ssl-conf;
        include /etc/nginx/conf.d/options-ssl-nginx;


        #IP 차단 부분입니다. 밑의 내용을 수정 후 앞에 #을 빼면 IP차단 설정이 적용됩니다.
        #allow 111.112.333.444; #자신의 집 컴퓨터의 외부IP를 확인 후 넣고 앞에 #을 제거하면 됩니다.
        #allow 123.123.123.123; #두번째 허용 IP
        #allow 124.124.124.124; #세번째 허용 IP # 이렇게 허용 IP를 추가해준 후 앞에 #을 제거하면 됩니다.
        #deny all; # 위 아이피 이외에 모든 IP를 차단합니다. 차단이 필요없다면 앞에 #을 놔두면 됩니다.
       
        location / {
            proxy_pass         http://code-server:8443/;
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection upgrade;
            proxy_set_header Accept-Encoding gzip;   
        }
}


위 내용에서 8082는 예시로 들었던 접속 포트입니다. 자신이 오픈한 포트를 넣어주면 됩니다.


저장 후



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


위와 같이 Nginx를 재시작해주고, 웹브라우저에 domain.com:8082 와 같이 자신이 정한 포트번호를 붙여서 접속하면 됩니다.



초기 접속 방법


3096d914599d93da92ce044e1f1d6a17_1600360372_5179.png 


▲ 첫 접속화면입니다. 여기에 .code.env 파일에 넣었던 비번을 입력하면 바로 접속됩니다.



3096d914599d93da92ce044e1f1d6a17_1600360467_4801.png
 

▲ 이제 위 화면이 나올 것입니다.

혹시 화면이 안나오면 F5나 컨트롤 + F5로 강력새로고침을 해주면 됩니다.


왼쪽 위에 햄버거 모양을 클릭합니다.


3096d914599d93da92ce044e1f1d6a17_1600360372_5376.png


▲ File -> Open Folder 를 클릭합니다.



3096d914599d93da92ce044e1f1d6a17_1600360372_5587.png
 

▲ 기본 위치가 /config/ 입니다.


아까 docker-compose.yml 셋팅에서 ./site:/config/site 이 부분이 바로 여기입니다.


code-server 컨테이너의 /config/site에 호스트에 있는 ./site 폴더를 마운트시키는 것입니다.


호스트의 ./site에 그누보드, 라이믹스, 워드프레스 등이 있기 때문에 연결시켜준 것입니다.


site를 클릭하면 자신이 셋팅한 CMS 파일 등이 있을 것입니다. 해당폴더를 클릭 후 마지막에 OK를 클릭하면 됩니다.




최종적으로 위와 같이 나오면 성공입니다!

관련자료

댓글 6

선구자님의 댓글

구글 검색으로 들어왔습니다 ㅎㅎ
믿고 보는 우성짱님의 글입니다.

이미 몇년전부터 선구자셨군요
감사합니다

doraji님의 댓글

nginx를 이렇게 사용할 수도 있군요.
저도 nginx로 서버 많이 띄웠지만.. ㅋㅋㅋ 이정도까지는 아니네요. 글 잘봤습니다.
https://realmojo.tistory.com/351

Ada님의 댓글

linuxserver/code-server 이미지를 사용하시면 .code.env에 SUDO_PASSWORD=password도 같이 넣으면 좋네요. 이거 없으면  sudo명령을 못쓰네요.
이거 때문에 pip에서 설치가 안되서 한참 찾았네요 ㅠㅠ
그리고 nginx가 힘드신 분들은 nginx proxy manager도 좋은 대책 같아요

우성짱님의 댓글의 댓글

아하 저는 예전에 그거 해줘도 안되더라구요..;; 그래서 빼긴 했었는데 된다면 넣는게 좋다고 생각합니다.

Nginx proxy manager는 안써봐서 잘 모르겠습니다. 추가 옵션이 있는 것은 좋다고 생각합니다.

감사합니다.
전체 43 / 1 페이지
RSS

최근글


새댓글


알림 0