Docker에서 포트 포워딩 설명

포트 포워딩이란?



포트 포워딩:
인터넷에서 특정 포트 번호로 패킷이 도착했을 때 미리 설정해 둔 LAN측의 기기로 패킷을 전송하는 기능입니다.

※인용원: htps //w w. 이 t 보오 k. 니후 / s dy / t6. HTML
  • 포트 연결이라는 이미지
  • 가상 환경 로 개발을 하는 경우, 이 포트 포워딩이 필수가 된다고 생각합니다만, 이번은 도커 를 예로 조금 해설합니다.
    ※이번은 포트 포워딩에 대해서 Docker를 기초로 이야기하기 때문에, Docker에 대해서는 해설하지 않습니다.

  • Docker 이미지


  • 개요

  • 스크립트
  • Go 언어로 작성


  • Dockerfile
  • golang의 기본 이미지 사용


  • 거동
  • 컨테이너를 실행하면 "start server"와 출력
  • HTTP 요청에 대해 요청 측에 "Hello Docker!!"라고 출력, 요청을 받은 측에 "received request"와 출력
  • "8080"포트를 해제


  • sample.go
    package main
    
    import (
        "fmt"
        "log"
        "net/http"
    )
    
    func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            // クライアントからリクエストを受けた場合
            log.Println("received request")
            // HTTPリクエストを受けた場合
            fmt.Fprintf(w, "Hello Docker!!")
        })
    
        log.Println("start server")
        server := &http.Server{Addr: ":8080"}
        if err := server.ListenAndServe(); err != nil {
            log.Println(err)
        }
    }
    

    Dockerfile
    FROM golang:1.9
    RUN mkdir /echo
    COPY main.go /echo
    CMD ["go", "run", "/echo/main.go"]
    

    Docker 이미지 빌드


  • 이미지 빌드
  • $docker image build -t sample:latest .
    Sending build context to Docker daemon   5.12kB
    Step 1/4 : FROM golang:1.9
    1.9: Pulling from library/golang
    55cbf04beb70: Pull complete 
    1607093a898c: Pull complete 
    9a8ea045c926: Pull complete 
    d4eee24d4dac: Pull complete 
    9c35c9787a2f: Pull complete 
    8b376bbb244f: Pull complete 
    0d4eafcc732a: Pull complete 
    186b06a99029: Pull complete 
    Digest: sha256:8b5968585131604a92af02f5690713efadf029cc8dad53f79280b87a80eb1354
    Status: Downloaded newer image for golang:1.9
     ---> ef89ef5c42a9
    Step 2/4 : RUN mkdir /echo
     ---> Running in 99e306a53ced
    Removing intermediate container 99e306a53ced
     ---> f9b0ec578390
    Step 3/4 : COPY main.go /echo
     ---> b71ab1e040bd
    Step 4/4 : CMD ["go", "run", "/echo/main.go"]
     ---> Running in fff606860921
    Removing intermediate container fff606860921
     ---> 2c9096d1911b
    Successfully built 2c9096d1911b
    Successfully tagged sample:latest
    $ docker images
    REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
    sample               latest              2c9096d1911b        16 seconds ago      750MB
    

    Docker 컨테이너 실행



  • 배경 에서 컨테이너 실행
  • -p 옵션
  • 포트 포워딩 설정
  • 왼쪽(9000)이 호스트 포트이고 오른쪽(8080)이 컨테이너 포트
  • 위에서 Go 언어로 작성된 스크립트를 설명했습니다만, 8080만 해방되어 있기 때문에, 필연적으로 컨테이너측의 포트는 8080이 됩니다.




  • ※호스트측과 컨테이너측의 포트를 나눈 것은, 액세스시에 어느 쪽으로부터 액세스했는지를, 알기 쉽게 하기 위해서입니다.
    $ docker run -d -p 9000:8080 2c9096d1911b
    5e3f8c5181b99c72002fe1917044c38426132c863350c47db828909294823b0b
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    5e3f8c5181b9        2c9096d1911b        "go run /echo/main.go"   4 seconds ago       Up 3 seconds        0.0.0.0:9000->8080/tcp   objective_leavitt 
    

    HTTP 액세스


  • 컨테이너에 대한 curl 에서 액세스
  • $ curl http://localhost:9000
    Hello Docker!!
    

    여기까지 그림


  • Dockerfile을 바탕으로 build하여 이미지를 만듭니다
  • 이미지를 실행하여 컨테이너를 시작합니다.
  • 컨테이너 상태가 실행 중입니다.



  • 컨테이너 런타임 (run), -p 옵션으로 포트 포워딩 설정하기
  • 이미지는 아래 그림과 같이 컨테이너에 구멍을 뚫는 이미지
  • 8080 포트를 해제하고 9000 포트를 연결하여 액세스가 가능합니다.




  • curl에서 9000 포트에서 HTTP 요청 보내기
  • "Hello Docker!!"라고 응답이 돌아온다




  • 요약



    이런 느낌으로 포트 포워딩으로 포트의 연결을 실시해 주는 것으로, 가상 환경에 대해서도 액세스 할 수 있게 되는 것입니다.

    여담입니다만, -p 옵션으로 포트 포워딩으로 설정을 했습니다만, 만약 호스트측의 설정을 하지 않는 경우 어떻게 된다고 생각합니까?
    // こんな感じでコンテナ側のポートしか設定しない場合です
    $ docker run -d -p 8080 abcdefg
    

    아무도 알고 있는 분 많다고 생각합니다만, 좋게 비어 있는 포트 번호를 할당해, 그 포트 번호와 연결을 실시해 줍니다.

    위를 실행 한 후 docker ps를하고 PORTS를 확인하면 어떤 포트와 연결되어 있는지 알 수 있으므로 시도한 적이없는 분은 꼭 시도하십시오.

    좋은 웹페이지 즐겨찾기