端口发布与暴露

端口发布与暴露

目录

  • 发布端口
  • 发布到临时端口
  • 发布所有端口
  • 试一试
    • 使用 Docker CLI
    • 使用 Docker Compose

如果你一直在跟随本指南,你应该理解容器为应用程序的每个组件提供了隔离的进程。每个组件 - 如 React 前端、Python API 和 Postgres 数据库 - 都运行在自己的沙箱环境中,与主机上的其他一切完全隔离。这种隔离对于安全和管理依赖性非常有利,但也意味着你不能直接访问它们。例如,你无法在浏览器中访问 web 应用程序。

这就是端口发布的作用。

发布端口

发布端口可以通过设置转发规则来打破一点点的网络隔离。举个例子,你可以指示主机的 8080 端口的请求应该转发到容器的 80 端口。发布端口是在创建容器时使用 docker run-p(或 --publish)标志来完成的。语法如下:

sh 复制代码
docker run -d -p 主机端口:容器端口 nginx
  • 主机端口:你希望在主机上接收流量的端口号
  • 容器端口:容器内监听连接的端口号

例如,将容器的 80 端口发布到主机的 8080 端口:

sh 复制代码
docker run -d -p 8080:80 nginx

现在,发送到主机 8080 端口的任何流量都会转发到容器内的 80 端口。

当端口被发布时,默认情况下它会发布到所有网络接口上。这意味着任何到达你机器的流量都可以访问发布的应用程序。注意不要发布数据库或任何敏感信息。了解更多关于发布端口的信息 这里.

发布到临时端口

有时,你可能只想发布端口但不在乎使用哪个主机端口。在这些情况下,你可以让 Docker 为你选择端口。为此,只需省略主机端口配置。

例如,以下命令会将容器的 80 端口发布到主机上的一个临时端口:

sh 复制代码
docker run -p 80 nginx

一旦容器运行起来,使用 docker ps 会显示选定的端口:

sh 复制代码
docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                    NAMES
a527355c9c53   nginx         "/docker-entrypoint...."   4 seconds ago    Up 3 seconds    0.0.0.0:54772->80/tcp    romantic_williamson

在这个例子中,应用程序在主机的 54772 端口上暴露。

发布所有端口

在创建容器镜像时,EXPOSE 指令用于指示打包的应用程序将使用指定端口。这些端口默认不会被发布。

使用 -P--publish-all 标志,你可以自动将所有暴露的端口发布到临时端口。这在开发或测试环境中避免端口冲突时非常有用。

例如,以下命令将发布镜像配置的所有暴露端口:

sh 复制代码
docker run -P nginx

试一试

在本动手指南中,你将学习如何使用 CLI 和 Docker Compose 发布容器端口来部署 web 应用程序。

使用 Docker CLI

在此步骤中,你将运行一个容器并使用 Docker CLI 发布其端口。

下载并安装 Docker Desktop。

在终端中运行以下命令启动新容器:

sh 复制代码
docker run -d -p 8080:80 docker/welcome-to-docker

第一个 8080 是指主机端口。这是本地机器上用于访问容器内运行的应用程序的端口。第二个 80 是指容器端口。这是容器内应用程序监听传入连接的端口。因此,该命令将主机的 8080 端口绑定到容器系统的 80 端口。

访问浏览器中的 http://localhost:8080 打开网站。

使用 Docker Compose

这个例子将使用 Docker Compose 启动相同的应用程序:

创建一个新目录,并在该目录中创建一个 compose.yaml 文件,内容如下:

yaml 复制代码
services:
  app:
    image: nginx
    ports:
      - 8080:80

端口配置接受几种不同形式的语法定义端口。在这种情况下,你使用与 docker run 命令中相同的 HOST_PORT:CONTAINER_PORT 语法。

打开终端并导航到你在上一步中创建的目录。

使用 docker compose up 命令启动应用程序。

打开浏览器访问 http://localhost:8080

相关推荐
全能全知者1 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
阿尔帕兹3 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口5 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
景天科技苑7 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge8 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇8 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试10 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!16 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林17 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis19 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab