Docker를 사용하여 안전한 웹 응용 프로그램 배포

지난 몇 년 동안 우리는 점점 더 많은 컨테이너를 사용하는 것을 보았는데, 나는 이것이 미래에 계속될 것이라고 생각한다.개발자의 입장에서 볼 때 이것은 정확하다.나는 여전히 육중하고 느린 가상 기기를 사용했는데, 이것은 매우 긴 시간을 들여 준비하고 시작하는 것을 기억한다.그리고 컨테이너와 부두 일꾼이 왔어요.네, 사용하기 전에 고려해야 할 것이 몇 가지 있습니다. 하지만 밑줄은 하나 이상의 용기를 빨리 시작해서 프로젝트에서 제 일을 완성하고, 마지막에 모든 물건을 뜯어서 다른 프로젝트로 전환할 수 있다는 것입니다. 거기에서 저는 똑같은 일을 더 많이 할 수 있습니다.
현지 환경에서 도움을 주는 것 외에 Docker와containers는 또 다른 장점을 가져왔다.배포 및 사용 편이성Docker를 사용하여 응용 프로그램을 게시하는 것은 매우 간단합니다.몇 분 안에 모든 것을 설치할 수 있는 도구가 있다.이것이 바로 본고에서 이해하고자 하는 내용입니다. 최종적으로 응용 프로그램을 웹에 발표할 것입니다. 더 좋은 것은 HTTPS 보안 서버 뒤에 배치하는 것입니다.

결점 토대


이렇게 하려면 Docker 서버를 설치해야 합니다.Linux를 실행하는 서버만 있으면 을 쉽게 실행할 수 있습니다.만약 당신이 서버가 없다면, 당신은 다른 공급업체에서 상당히 저렴한 서버를 살 수 있습니다.그리고 반드시 install docker을 설치해야 한다. 왜냐하면 이것은 우리 앞에 있는 많은 임무를 간소화할 수 있기 때문이다.
이 연습에서, 우리는 매우 간단한expressjs 전방 응용 프로그램을 구축하고 배치할 것입니다. 그러나, 기본적으로 필요한 내용을 배치할 수 있습니다.우리의 목표를 실현하기 위해, 우리는 docker-compose을 우리의 입구 공유기로 사용하고, 대중으로부터 전송되는 데이터를expressjs 응용 프로그램에 전송할 것이다.

트라피크 서버 준비


현재 dockerdocker-compose이 설치되어 있습니다. 입구 공유기를 시작하고 실행하며 작은 설정을 적용할 것입니다.이를 위해 시스템의 어느 위치에 docker-compose.yml 파일, 즉 /opt/env/ 파일을 만듭니다.디렉토리와 파일을 만들고 다음을 붙여넣습니다.
version: "3"

services:
  traefik:
    image: traefik:2.2
    ports:
    - "80:80"
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - ./traefik.toml:/etc/traefik/traefik.toml:ro
    container_name: traefik
    networks:
    - public
    restart: always

networks:
  public:
여기에서 우리는 매우 간단한 docker 네트워크와 이 네트워크에 연결된 서비스를 정의했다.본문을 읽을 때traefik 2.2의 이미지 버전은 이미 유행이 지났을 수도 있지만, 현재는 최신 버전입니다.container_name을 설정하는 것은 선택할 수 있지만,traefik에 재부팅 정책을 설정하는 것을 강력히 권장합니다. 계속 시작하기를 원하기 때문입니다.물론, 서비스를 포트 80에 연결해야 합니다.볼륨을 마운트할 때 Traefik에 연결되어 있고 Docker 컨테이너 생성 및 traefik.toml 파일을 수신하기 때문에 Docker 소켓을 서비스에 연결해야 합니다.
[entryPoints]
  [entryPoints.web]
    address = ":80"

[providers]
  [providers.docker]
    endpoint = "unix:///var/run/docker.sock"

[log]
  level = "DEBUG"

[accessLog]
이 간단한 설정 파일에서 접근 로그 기록을 사용합니다. 로그 기록 단계를 debug로 올리면 info로 낮출 수 있습니다. Docker 플러그인의 위치를provider로 설정하고 입구점을 정의할 수 있습니다.이렇게 하면 docker-compose up -d만 실행하면 트랙을 시작할 수 있습니다.

예제 응용 프로그램 만들기


자신의 프로그램을 구축하려면 이 절차를 건너뛸 수 있습니다.설령 우리가 이곳에서 자바스크립트 프로그램을 사용한다고 해도, 당신은 원하는 것을 사용할 수 있습니다.
이제 로컬 컴퓨터에서 예제 expressjs 응용 프로그램을 만듭니다.
mkdir docker-deploy
cd docker-deploy
npm init
# simply use all default values
npm install express --save
이제 같은 디렉토리에 다음과 같은 index.js 파일을 새로 만듭니다.
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
신속한 작동 보장:
node index.js
그리고 브라우저에서 을 엽니다.

http://localhost:3000/ 어플리케이션 배포


이미지 만들기


응용 프로그램을 배치하려면 먼저 Docker 이미지를 만들어야 합니다. 응용 프로그램을 저장하고 나중에 서버에서 컨테이너를 만듭니다.먼저 이미지를 만들 때 Docker가 무시하는 파일을 나타내는 .dockerignore 파일을 만듭니다.
node_modules
npm-debug.log
디버그 로그를 무시합니다. 컨테이너에 나타나지 않기를 원하지 않습니다. 로컬 노드 모듈은 개발 버전 파일을 포함하고 있으며, 컨테이너가 생산을 준비할 수 있기를 바랍니다. 따라서 이미지가 생성될 때 생산을 준비하는 모듈을 설치합니다.이제 Dockerfile을 만들 준비가 되었습니다.
FROM node:13.12-alpine3.10

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm ci --only=production
COPY . .

EXPOSE 3000

ENTRYPOINT ["node","index.js"]
이것은 우리가 자신의 Docker 이미지를 만드는 청사진입니다. Docker에게 우리의 이미지 FROM 노드 기반 이미지를 만드는 것을 알려 줍니다. 더욱 구체적으로 말하면 13.12-alpine3입니다.10 버전의 노드 Docker 이미지입니다.노드 이미지를 사용해야 npmnode과 같은 도구를 사용할 수 있습니다.물론 응용 프로그램이 다른 기술을 사용하고 있다면 서로 다른 기본 이미지를 사용해야 합니다.그러나 사용 가능한 경우 alpine 버전의 이미지를 사용하는 것이 좋습니다.Alpine Linux는 Docker에 아주 적합한 소형 Linux 발행판이다. 기초가 튼튼하고 작아서 Docker 이미지의 크기를 줄일 수 있기 때문이다.
다음은 WORKDIR을/usr/src/app로 설정하고 COPY을any package*로 설정합니다.이 디렉터리에 json 파일을 저장한 다음 노드 모듈을 깨끗하게 설치합니다.다음에 프로그램의 나머지 부분을 그림으로 복사합니다. 예를 들어 그림은 색인만 복사합니다.js 파일입니다. 나머지는 모두 무시되었습니다.
마지막으로, 우리는 EXPOSE d 포트를 3000으로 설정합니다. 왜냐하면 우리의 프로그램은 용기 안의 포트 3000을 감청하기 때문에, 우리는 ENTRYPOINT을 설정했습니다. 이것은 기본적으로 명령입니다. 이 그림을 사용하여 용기를 만들 때 이 명령을 실행합니다.
그림을 계속 만들기 전에 으로 돌아가서 등록하십시오. 새로 만든 그림을 거기로 밀어붙일 것입니다.그곳에 있을 때, 계속해서 그곳에 새로운 저장소를 만들어라.
이제 이미지를 만듭니다.
docker build -t your_dockerhub_name/express-sample .
잠시 후 새 그림을 만들 것입니다.이제 새 컨테이너를 생성하여 모든 것이 정상적인지 확인합니다.
docker run --rm -d -p 3000:3000 your_dockerhub_name/express-sample
브라우저에서 Docker Hub을 다시 엽니다.같은 결과를 보았다면, 이것은 우리가 Docker 이미지와 Docker 용기를 성공적으로 만들었다는 것을 의미합니다.
이제 배치를 계속하기 전에 이미지를 Docker Hub로 전송해야 합니다.
# if you have not yet logged in to Docker Hub from your shell do so now
docker login
docker tag your_dockerhub_name/express-sample:latest your_dockerhub_name/express-sample:1.0.0
docker push your_dockerhub_name/express-sample:1.0.0
이미지를 밀어넣기 전에 위의 명령이 기본적으로 최신 태그를 사용하는 새 이미지를 만들었기 때문에 이미지를 새 버전으로 표시합니다.우리도 그곳에서 이 판본을 지정할 수 있다.이것은 선택할 수 있는 절차이지만, 그림을 배치하려면, 덮어쓰고 서버의 일부 내용을 파괴하지 않도록 버전으로 표시해야 하기 때문에, 이렇게 하는 것을 권장합니다.

http://localhost:3000/ 배포 이미지


이제 우리는 마침내 배치 부분에 왔다.배포를 수행하기 위해 docker-compose의 강력한 기능을 사용하여 서버가 아닌 로컬에서 코드를 통해 다른 docker-compose.yml 파일을 만듭니다.
version: "3"

services:
  express:
    image: your_dockerhub_name/express-sample:1.0.0
    labels:
    - "traefik.http.routers.express-sample.rule=Host(`express-sample.yourdomain.com`)"
    - "traefik.http.services.express-sample.loadbalancer.server.port=3000"
    container_name: express-sample
    networks:
    - env_public
    restart: unless-stopped

networks:
  env_public:
    external: true
용기에 아무 소용이 없기 때문에 이 파일을 .dockerignore에 추가하고 싶을 수도 있습니다.파일을 다시 빠르게 탐색하기 위해 네트워크를 다시 정의했지만, 이번 이름은 env public입니다.traefik 용기에서 정의된 네트워크에서 왔지만, 우리는 반드시 env 2를 사용하여 미리 처리해야 합니다. 기본적으로 docker-composedocker-compose.yml이 있는 디렉터리 이름으로 생성된 네트워크를 미리 처리하기 때문입니다.
우리는 이 네트워크를 서비스에 분배하고, 리셋 정책을 설정하며, 선택할 수 있는 용기 이름을 설정합니다.포트는 트레이픽이 데이터를 처리하기 때문에 귀속할 필요가 없습니다.
우리가 절대적으로 정의해야 할 것은 labels이다. 이것은traefik에서 어떤 호스트가 이 서비스에 연결되고, 어떤 포트가 사용되고 있는지 알려준다.더 많은 규칙이 루트에 사용될 수 있지만, 본문의 범위를 넘어섰습니다. 멋진 을 보시기 바랍니다.
이제 docker-compose 명령만 실행하면 됩니다.
DOCKER_HOST="ssh://root@your-server-ip" docker-compose up -d
DOCKER_HOST 변수를 설정하여 docker-compose이 설정한 SSH 연결을 통해 모든 명령을 실행하도록 지시했습니다.만일 모든 것이 순조롭다면, 당신은 traefik docs에 방문하여 배치된 응용 프로그램을 볼 수 있을 것입니다.

http://express-sample.yourdomain.com 애플리케이션 보안 유지


이 모든 것은 현재 안전하지 않은 HTTP 연결을 통해 제공되기 때문에, 지금은 우리가 그것을 보호할 때이다.이를 위해, Traefik을 다시 설정하고, 새로 등록된 용기마다 에서 유효한 SSL 인증서를 가져오도록 지시해야 합니다.
먼저 서버에서 docker-compose.yml 파일을 열고 traefik 서비스를 편집합니다.
# ...
  traefik:
    image: traefik:2.2
    labels:
    - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    - "traefik.http.routers.global-redirect.rule=HostRegexp(`{host:.+}`)"
    - "traefik.http.routers.global-redirect.entrypoints=web"
    - "traefik.http.routers.global-redirect.middlewares=redirect-to-https"
    ports:
    - "80:80"
    - "443:443"
# ...
여기에 트레이픽이 모든 HTTP 데이터를 HTTPS로 직접 전환하고 서버 443 포트를 HTTPS 데이터의 서비스 443 포트에 연결하도록 표시하기 위해 탭에 규칙을 추가했습니다.이제 traefik.toml 파일을 편집하여 Lets 암호화를 사용하도록 하겠습니다.
[entryPoints]
  [entryPoints.web]
    address = ":80"
  [entryPoints.web-secure]
    address = ":443"

[certificatesResolvers.myresolver.acme]
  email = "[email protected]"
  storage = "acme.json"
  [certificatesResolvers.myresolver.acme.httpChallenge]
    # used during the challenge
    entryPoint = "web"

# ...
보시다시피, 새로운 웹 보안 입구점과 http 도전을 사용하는 acme 인증서 해석기를 추가했습니다. 이것은 안전하지 않은 웹 입구점에서 처리됩니다.현재 우리는traefik 서비스를 다시 만들어야 한다. docker-compose up -d을 다시 실행하면 된다.
서버를 다시 로드한 후 애플리케이션 docker-compose.yml 파일에 다음 두 개의 레이블을 추가합니다.
# ...
    labels:
    - "traefik.http.routers.express-sample.tls=true"
    - "traefik.http.routers.express-sample.tls.certresolver=myresolver"
# ...
현재, 이 서비스는 서버 traefik.toml 프로필에 정의된 myresolvre 인증서 분석 프로그램을 사용하여 SSL 인증서를 처리하도록 지시했습니다.이 명령을 적용하려면 다음 명령을 다시 실행하십시오.
DOCKER_HOST="ssh://root@your-server-ip" docker-compose up -d

암호화 해달래요. 결론


Docker는 로컬 개발 수요든 배치든, 혹은... 이든 당신의 생활을 더욱 가볍게 할 수 있습니다.근데 이건 은탄이 아니야.그것을 사용하기 전에 고려해야 할 요소가 있다. 너도 용기에 주의해야 한다. 왜냐하면 서버 전체를 은반에 놓은 공격자에게 맡길 수 있기 때문이다.그러나 이것은 본문의 범위를 넘어섰다.그러나, 나는 확실히 당신들에게 Docker와 용기를 더 잘 이해하도록 초청합니다. 왜냐하면 그들은 이미 소프트웨어 개발에서 중요한 역할을 하기 때문에, 나는 그것들이 곧 사라지지 않을 것이라고 생각합니다.
나는 당신이 응용 프로그램을 배치할 수 있기를 희망하며, 본문이 매우 도움이 되고 내용이 풍부하다는 것을 발견할 수 있기를 바랍니다.만약 당신이 문제에 부딪히면 저에게 메시지를 남겨 주십시오. 저는 매우 기꺼이 당신에게 도움을 제공할 것입니다.

좋은 웹페이지 즐겨찾기