我知道我可以在docker-compose.yml文件中指定“端口”的协议,但是如果没有指定协议,我不确定默认协议是什么。
是TCP吗?是UDP吗?两个都?
我无法在任何地方找到答案(包括在 Docker Compose 文件参考中)。
特拉菲克的朋友们大家好。
我刚刚开始研究 traefik。所有教程都展示了如何使用 traefik 与其他容器一起运行一个 docker-compose.yml 文件。我经常有许多单独的 docker-compose.yml 文件,并且非常想将它们与 traefik 一起使用。
这是我的 traefik 容器代码:
version: "3.3"
services:
traefik:
image: "traefik:v2.5"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.myresolver.acme.email=xxxxxxxxx@gmail.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "443:443"
- "8080:8080"
networks:
- "traefik"
- "external"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
Run Code Online (Sandbox Code Playgroud)
以及我想与 traefik 一起使用的另一个示例 docker-compose:
version: '3.1'
services:
php:
image: php:7.4-apache
ports:
- 8081:80
volumes:
- ./php/www:/var/www/html/
labels:
- "traefik.enable=true"
- "traefik.http.routers.php.rule=host(`php.xxxxxx.com`)"
- "traefik.http.routers.php.entrypoints=websecure"
- …Run Code Online (Sandbox Code Playgroud) 参加涉及这些问题的课程;实际细节与课程无关,但我通常有兴趣尝试理解事物。
我有一个 docker-compose.yml 文件,我可以“调用”或“启动”该文件。该文件包含以下信息:
services:
redis:
image: redis:latest
expose:
- "6379"
sample0395:
image: sample0395/base:latest
stdin_open: true
tty: true
expose:
- "8888"
ports:
- "8888:8888"
Run Code Online (Sandbox Code Playgroud)
据我了解,仅基于如图所示的层次结构:
我正在尝试在我的服务器上设置新版本的 Kibana 和 Elasticsearch。我有一个现有的 K 和 E 使用默认端口(5601、9200)运行,并且无法升级现有数据。我想在 Docker 中运行 K 和 E 的较新版本 (7.4.2),使用不同的端口 (5611:5601、9211:9200) 来访问容器。我有新的数据区域可用。
我相信我的 Elasticsearch 运行正常,但 Kibana 查找 Elasticsearch 的覆盖对我不起作用。我已附加我的 docker-compose.yml 文件。
预先感谢您的帮助。
version: '3'
networks:
elk01:
driver: bridge
services:
es01:
image: elasticsearch:7.4.2
container_name: es01
user: "983"
networks:
- elk01
environment:
#- cluster.initial_master_nodes=es01
- cluster.name=docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms4g -Xmx4g -XX:-HeapDumpOnOutOfMemoryError"
#- ES_JAVA_OPTS: "-Xms4g -Xmx4g -XX:-HeapDumpOnOutOfMemoryError"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- "9211:9200"
- "9311:9300"
expose:
- "9211"
volumes:
- /elk/elk7_4_2/elasticsearch/data:/usr/share/elasticsearch/data
- …Run Code Online (Sandbox Code Playgroud) 关于 docker 网络的一些事情让我感到困惑。我有一个docker-compose.yml可以像这样简化的文件:
version: '3.8'
services:
foo:
...
networks:
- main_network
ports:
- "3000:3000"
bar:
...
networks:
- main_network
expose:
- "5000"
networks:
main_network:
Run Code Online (Sandbox Code Playgroud)
根据这个答案,expose...
公开端口而不将它们发布到主机——它们只能被链接的服务访问。只能指定内部端口。
如果这是真的,bar应该只将 5000 端口公开给foo服务。它似乎按预期工作。如果,我运行bash到bar服务和执行:
$ ss -lntu
Run Code Online (Sandbox Code Playgroud)
5000端口正确打开:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
...
tcp LISTEN 0 128 0.0.0.0:5000 0.0.0.0:*
...
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,从我的容器外部,例如使用 Web 浏览器,我无法连接到该主机。另外,如果我跑
$ nmap -p1-65535 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
我可以验证只foo打开了服务的 3000/TCP 端口:
PORT STATE SERVICE
3000/tcp …Run Code Online (Sandbox Code Playgroud)