[내프로젝트] 3. 도커 컨테이너 -p 옵션을 이해해보자

llunaB·2022년 3월 9일
0

도커 컨테이너를 실행할 때 -p 포트 연결하는것이 나는 매우 힘들었다.

호스트포트와 도커 컨테이너 포트가 무슨 관계인지,
또 컨테이너 포트와 서버의 포트는 무슨 관계인지(리액트는 3000이라던가, 톰캣은 8080이라던가) 이부분에 대해 이해하는게 유독 어렵고 힘들었다.

이젠 극복!하고 이해해서 자유자재로 사용할 수 있길 바란다!!

컨테이너 실행

docker run -d -p 8080:80 nginx
  • -d 옵션으로 백그라운드 실행
  • -p 옵션으로 호스트와 컨테이너 포트를 매핑

8080은 호스트 포트다.
http://127.0.0.1:8080
이것이다.

80은 컨테이너의 포트다.
컨테이너의 포트는 그럼 누가 정하나? 80은 누가 정하냐고!

진정하고..

도커이미지를 살펴보자

docker image inspect nginx

다음은 nginx 이미지의 상세 내용이다.

dockerconfig 부분의 포트 설정이다.

"ContainerConfig": {
       "ExposedPorts": {
            "80/tcp": {}
        },
            ...
}

노출 포트가 80/tcp이다. 즉, 컨테이너를 80번 포트로 노출하겠단 거다.

config 부분의 포트 설정이다.

"Config": {
            "ExposedPorts": {
                "80/tcp": {}
            },
            ...
 }

노출포트가 80/tcp다. 즉, Nginx 를 80번 포트로 노출하겠단 거다.

그러니까 8080:80 ------80 이렇게 연결된다.

8080:90 이라고 하면 컨테이너 포트와 엔진엑스 포트가 달라서 엔진엑스 서버에 접속할 수 없단 뜻이다.

[
    {
        "Id": "sha256:c919045c4c2b0b0007c606e763ed2c830c7b1d038ce878a3c0d6f5b81e6ab80b",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:1c13bc6de5dfca749c377974146ac05256791ca2fe1979fc8e8278bf0121d285"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2022-03-01T14:00:05.875390518Z",
        "Container": "62aea4acb75db8685ce9869daf8e2548b1fd56315a562ca80cef5502966ba9ca",
        "ContainerConfig": {
            "Hostname": "62aea4acb75d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.6",
                "NJS_VERSION=0.7.2",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "Image": "sha256:90bc50855dba56bcf29fb414e328f2bbe93d21ad4629139a2b0d37be1f139c9d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "DockerVersion": "20.10.12",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.6",
                "NJS_VERSION=0.7.2",
                "PKG_RELEASE=1~bullseye"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "sha256:90bc50855dba56bcf29fb414e328f2bbe93d21ad4629139a2b0d37be1f139c9d",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 141505630,
        "VirtualSize": 141505630,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/4872890269eed50b681854ff8c975012a4eea8ac2ced49d63c34c195945e335d/diff:/var/lib/docker/overlay2/7afaeb30cb8a1aa4a4ce21b0d5b3cdcc2f6273fb63b88a14569a5552a07bfa86/diff:/var/lib/docker/overlay2/d7efd2799fe4030c8622ec9b18f75da4181ecc9333f84e7830624348de338110/diff:/var/lib/docker/overlay2/81558596ac5b8fcef77b7ca9b156ec912e6fff6968ef7b6a926ddc801959a51b/diff:/var/lib/docker/overlay2/e2fbf1082f20039ff0f68666f9920c3e2d26344f0ab701fd3c08749741ea530b/diff",
                "MergedDir": "/var/lib/docker/overlay2/55954c96491a7986ac0c563aecf2bf04aeb441da07ca04d39873be1b713ba833/merged",
                "UpperDir": "/var/lib/docker/overlay2/55954c96491a7986ac0c563aecf2bf04aeb441da07ca04d39873be1b713ba833/diff",
                "WorkDir": "/var/lib/docker/overlay2/55954c96491a7986ac0c563aecf2bf04aeb441da07ca04d39873be1b713ba833/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:1401df2b50d5de5a743b7bac3238ef3b7ce905ae39f54707b0ebb8eda3ab10bc",
                "sha256:57a9a0cdd450687265b5d49d47e8dc707f178772faa43a7b01c2299cd39113b7",
                "sha256:3baebd9b50ad6c27671bb9748f3f44922650c46f04977a7857c0366390920afb",
                "sha256:d3ae25fc9f7a917bcd2c3158eff7dc5fc848157e724efdb9af9ffe3771cda464",
                "sha256:53db376e88c7ebd83d9b30e0d20ee818787c21d97c2bd365b02cf23487592007",
                "sha256:e4b39f9495876939f14376f32d7c7ba83526636a8a8b52c008ab32ade9ba6e06"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

그러면 프로그램의 디폴트 포트는 무엇인가?

대부분의 서버는 디폴트 포트를 가지고 있다.
리액트는 3000, 톰캣은 8080, MySQL은 3306...

이것을 각각의 배포설정 파일(.env)에서 바꿀 수도 있고 실행할 때 명령어로 지정할 수도 있다.

(사실 나는 저 디폴트 포트가 대체 어디에 설정되어있는건가 궁금해 미칠거같은데... 아무리 찾아봐도, 다른 포트로 실행하는 방법만 나와있고 디폴트 설정이 왜 저건지는 안나와있다......)

결국 서버의 디폴트 포트 - 컨테이너 포트 - 호스트 포트 가 쫘라라란~~~ 하고 이어지도록 하면 된다.

톰캣서버의 디폴트 포트를 변경하지 않았다는 가정하에
호스트 포트는 80으로 잡고, 컨테이너 포트는 8080으로 잡고 tomcat 이미지를 실행하면 톰캣서버의 기본포트가 8080이니까 80 - 8080 - 8080 으로 연결된다. 오케이?

MySQL 이미지를 컨테이너로 가동하고 싶다면 호스트포트 - 3360 - 3360 이렇게 연결하면 된다.

이를 응용하면 원하는 포트를 정해서 임의로 지정해서 실행해도 된다!

자세한 설명은 이 블로그를 참고하자

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=alice_k106&logNo=220278762795

profile
안녕하세요. 성장하는 주니어 개발자입니다. :-)

0개의 댓글