docker 组合服务中的端口符号如何工作?
How ports notation in docker compose service works?
在docker-compose.yml,
以下端口符号有什么区别?
ports:
- "5000:5000"
回复:
ports:
- "8080"
或根本没有端口。
例如在下面的docker-compose.yml中,mongodb服务必须暴露一个端口来与节点服务通信,但没有指定端口
services:
node:
build:
context: .
dockerfile: node.dockerfile
ports:
- "3000:3000"
networks:
- nodeapp-network
depends_on:
- mongodb
mongodb:
image: mongo
networks:
- nodeapp-network
networks:
nodeapp-network:
driver: bridge
来源:https://github.com/DanWahlin/NodeExpressMongoDBDockerApp
然而,在这些 docker-compose.yml 中,有些端口使用 27017:27017
或 8080
符号指定。
services:
nginx:
container_name: nginx
image: ${DOCKER_ACCT}/nginx
build:
context: .
dockerfile: .docker/nginx.${APP_ENV}.dockerfile
links:
- node1:node1
- node2:node2
- node3:node3
ports:
- "80:80"
- "443:443"
networks:
- codewithdan-network
node1:
container_name: node-codewithdan-1
image: ${DOCKER_ACCT}/node-codewithdan
build:
context: .
dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
ports:
- "8080"
volumes:
- .:/var/www/codewithdan
working_dir: /var/www/codewithdan
env_file:
- ./.docker/env/app.${APP_ENV}.env
depends_on:
- mongo
- redis
networks:
- codewithdan-network
node2:
container_name: node-codewithdan-2
image: ${DOCKER_ACCT}/node-codewithdan
build:
context: .
dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
ports:
- "8080"
volumes:
- .:/var/www/codewithdan
working_dir: /var/www/codewithdan
env_file:
- ./.docker/env/app.${APP_ENV}.env
depends_on:
- mongo
- redis
networks:
- codewithdan-network
node3:
container_name: node-codewithdan-3
image: ${DOCKER_ACCT}/node-codewithdan
build:
context: .
dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
ports:
- "8080"
volumes:
- .:/var/www/codewithdan
working_dir: /var/www/codewithdan
env_file:
- ./.docker/env/app.${APP_ENV}.env
depends_on:
- mongo
- redis
networks:
- codewithdan-network
mongo:
container_name: mongo
image: ${DOCKER_ACCT}/mongo
build:
context: .
dockerfile: .docker/mongo.dockerfile
ports:
- "27017:27017"
env_file:
- ./.docker/env/mongo.${APP_ENV}.env
networks:
- codewithdan-network
redis:
container_name: redis
image: ${DOCKER_ACCT}/redis
build:
context: .
dockerfile: .docker/redis.${APP_ENV}.dockerfile
ports:
- "6379"
networks:
- codewithdan-network
networks:
codewithdan-network:
driver: bridge
来源:https://github.com/DanWahlin/CodeWithDanDockerServices
你能解释一下区别吗?
要么指定两个端口 (HOST:CONTAINER),要么只指定容器端口(选择临时主机端口)。所以在你的情况下 8080
是容器端口
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
来自here
临时端口范围由/proc/sys/net/ipv4/ip_local_port_range内核参数配置,通常范围从32768到61000。
无论哪种方式,您都应该能够通过检查您的 NAT 表来了解 Docker 在您的网络堆栈中取得的成就。 from here
在 docker compose 中,默认情况下不会创建任何端口,以防它们与已打开的端口冲突
典型的 Docker 容器 运行 长期 运行ning 服务器侦听某个 TCP 端口。同一 Docker 网络上的其他容器可以使用容器名称(docker run --name
、container_name:
指令)作为 DNS 名称和服务器 运行 所在的端口来访问该容器.在 Docker Compose 中,Compose 会为每个 Compose YAML 文件创建一个 Docker 网络,并在 YAML 文件中的密钥下提供服务。即使没有指定 ports:
也能正常工作。
因此,例如,如果您的 docker-compose.yml
文件显示
services:
mongo:
image: mongo
others:
env:
MONGODB_HOST: mongo
MONGODB_PORT: 27017
那么 MongoDB 容器将可以在该主机名和(默认)端口上访问,即使它没有明确具有 ports:
.
如果您确实声明了 ports:
,则可以从 Docker space 外部访问容器。如果你只有一个端口,那就是服务器的端口号,Docker 选择主机端口;这在大多数情况下没有用(但保证不会遇到端口冲突)。如果你有两个端口,它们是主机端口和内部服务端口。您还可以指定主机 IP 地址以 bind(2) 到。
存在或不存在 ports:
不影响 dontainer 之间的通信。始终使用容器的名称(或 Docker-compose.yml
服务名称)和服务器正在侦听的“内部”端口号。
在docker-compose.yml,
以下端口符号有什么区别?
ports:
- "5000:5000"
回复:
ports:
- "8080"
或根本没有端口。
例如在下面的docker-compose.yml中,mongodb服务必须暴露一个端口来与节点服务通信,但没有指定端口
services:
node:
build:
context: .
dockerfile: node.dockerfile
ports:
- "3000:3000"
networks:
- nodeapp-network
depends_on:
- mongodb
mongodb:
image: mongo
networks:
- nodeapp-network
networks:
nodeapp-network:
driver: bridge
来源:https://github.com/DanWahlin/NodeExpressMongoDBDockerApp
然而,在这些 docker-compose.yml 中,有些端口使用 27017:27017
或 8080
符号指定。
services:
nginx:
container_name: nginx
image: ${DOCKER_ACCT}/nginx
build:
context: .
dockerfile: .docker/nginx.${APP_ENV}.dockerfile
links:
- node1:node1
- node2:node2
- node3:node3
ports:
- "80:80"
- "443:443"
networks:
- codewithdan-network
node1:
container_name: node-codewithdan-1
image: ${DOCKER_ACCT}/node-codewithdan
build:
context: .
dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
ports:
- "8080"
volumes:
- .:/var/www/codewithdan
working_dir: /var/www/codewithdan
env_file:
- ./.docker/env/app.${APP_ENV}.env
depends_on:
- mongo
- redis
networks:
- codewithdan-network
node2:
container_name: node-codewithdan-2
image: ${DOCKER_ACCT}/node-codewithdan
build:
context: .
dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
ports:
- "8080"
volumes:
- .:/var/www/codewithdan
working_dir: /var/www/codewithdan
env_file:
- ./.docker/env/app.${APP_ENV}.env
depends_on:
- mongo
- redis
networks:
- codewithdan-network
node3:
container_name: node-codewithdan-3
image: ${DOCKER_ACCT}/node-codewithdan
build:
context: .
dockerfile: .docker/node-codewithdan.${APP_ENV}.dockerfile
ports:
- "8080"
volumes:
- .:/var/www/codewithdan
working_dir: /var/www/codewithdan
env_file:
- ./.docker/env/app.${APP_ENV}.env
depends_on:
- mongo
- redis
networks:
- codewithdan-network
mongo:
container_name: mongo
image: ${DOCKER_ACCT}/mongo
build:
context: .
dockerfile: .docker/mongo.dockerfile
ports:
- "27017:27017"
env_file:
- ./.docker/env/mongo.${APP_ENV}.env
networks:
- codewithdan-network
redis:
container_name: redis
image: ${DOCKER_ACCT}/redis
build:
context: .
dockerfile: .docker/redis.${APP_ENV}.dockerfile
ports:
- "6379"
networks:
- codewithdan-network
networks:
codewithdan-network:
driver: bridge
来源:https://github.com/DanWahlin/CodeWithDanDockerServices
你能解释一下区别吗?
要么指定两个端口 (HOST:CONTAINER),要么只指定容器端口(选择临时主机端口)。所以在你的情况下 8080
是容器端口
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
来自here
临时端口范围由/proc/sys/net/ipv4/ip_local_port_range内核参数配置,通常范围从32768到61000。
无论哪种方式,您都应该能够通过检查您的 NAT 表来了解 Docker 在您的网络堆栈中取得的成就。 from here
在 docker compose 中,默认情况下不会创建任何端口,以防它们与已打开的端口冲突
典型的 Docker 容器 运行 长期 运行ning 服务器侦听某个 TCP 端口。同一 Docker 网络上的其他容器可以使用容器名称(docker run --name
、container_name:
指令)作为 DNS 名称和服务器 运行 所在的端口来访问该容器.在 Docker Compose 中,Compose 会为每个 Compose YAML 文件创建一个 Docker 网络,并在 YAML 文件中的密钥下提供服务。即使没有指定 ports:
也能正常工作。
因此,例如,如果您的 docker-compose.yml
文件显示
services:
mongo:
image: mongo
others:
env:
MONGODB_HOST: mongo
MONGODB_PORT: 27017
那么 MongoDB 容器将可以在该主机名和(默认)端口上访问,即使它没有明确具有 ports:
.
如果您确实声明了 ports:
,则可以从 Docker space 外部访问容器。如果你只有一个端口,那就是服务器的端口号,Docker 选择主机端口;这在大多数情况下没有用(但保证不会遇到端口冲突)。如果你有两个端口,它们是主机端口和内部服务端口。您还可以指定主机 IP 地址以 bind(2) 到。
存在或不存在 ports:
不影响 dontainer 之间的通信。始终使用容器的名称(或 Docker-compose.yml
服务名称)和服务器正在侦听的“内部”端口号。