도커 컨테이너를 실행할 때 -p 포트 연결하는것이 나는 매우 힘들었다.
호스트포트와 도커 컨테이너 포트가 무슨 관계인지,
또 컨테이너 포트와 서버의 포트는 무슨 관계인지(리액트는 3000이라던가, 톰캣은 8080이라던가) 이부분에 대해 이해하는게 유독 어렵고 힘들었다.
이젠 극복!하고 이해해서 자유자재로 사용할 수 있길 바란다!!
docker run -d -p 8080:80 nginx
8080은 호스트 포트다.
http://127.0.0.1:8080
이것이다.
80은 컨테이너의 포트다.
컨테이너의 포트는 그럼 누가 정하나? 80은 누가 정하냐고!
진정하고..
docker image inspect nginx
다음은 nginx 이미지의 상세 내용이다.
"ContainerConfig": {
"ExposedPorts": {
"80/tcp": {}
},
...
}
노출 포트가 80/tcp이다. 즉, 컨테이너를 80번 포트로 노출하겠단 거다.
"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