迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 > Docker >

Docker 中 expose 和 port 之间的区别

作者:迹忆客 最近更新:2023/03/22 浏览次数:

在 Docker 中,当我们使用 docker createdocker run 创建容器后,我们可能希望我们的容器与外部服务或其他外部容器交互。我们需要向外部世界提供端口来实现这一点。

在本文中,我们将介绍两种可以用来在 Docker 中公开端口的重要方法。我们还将讨论如何将容器端口映射到主机端口以及方法的差异。

Docker 中的 EXPOSE DockerFile 指令

docker 文件只是一个文本文件,它指定使用 docker build 命令组装镜像的指令。其中包括 EXPOSE 指令。

EXPOSE 指令用于通知 Docker 我们正在构建的容器应该在运行时监听特定的网络端口。但是请注意,该指令只是一个参考点,并没有将容器端口映射到主机端口。

语法:

EXPOSE <port>/<protocol>

我们不必指定协议,因为 Docker 可以使用默认的 TCP 协议。但是,我们可以提供其他协议,例如 UDP 协议。

Docker 将使用默认的 TCP 协议,因为 Nginx 官方 docker 文件中没有指定该协议。

COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
COPY 30-tune-worker-processes.sh /docker-entrypoint.d
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

假设我们从 Docker 注册中心拉取官方 Nginx 镜像,创建一个容器,并运行该容器。在这种情况下,我们可以从容器中快速确定一些有用的信息,例如端口号和使用的协议。

~/isaac$ docker ps -a

输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
99edfdea0443   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 2 minutes   80/tcp    nice_volhard

上面的输出显示 Nginx 容器在 Dockerfile 和 TCP 协议中所述的端口 80 上运行。

或者,我们也可以在创建容器时使用 --expose 标签在运行时公开端口,如下所示。

docker run --expose 80 nginx

现在,将此端口绑定到主机端口号。我们需要使用大写的 -P 标签或小写的 -p 标签。

尽管我们可以使用其中任何一个来获得结果,但这些标签有很大的不同。

大写的 -P 标签,当在运行时使用时,允许我们将所有暴露的标签绑定到主机上的随机端口。这使我们能够避免端口冲突。

$ docker run -d -P nginx
006b88a06e51eac45895f13b33a89221676029e8fa654aaaccc79b81f74efb4d

代码:

isaac$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                   NAMES
006b88a06e51   nginx     "/docker-entrypoint.…"   27 seconds ago   Up 6 seconds   0.0.0.0:49153->80/tcp   angry_babbage

我们还可以使用小写的 -p 标签将容器发布到主机上的特定端口。

Docker Compose 端口

Docker-compose 是一个实用工具,它允许我们在 Docker 上运行多容器应用程序。

docker-compose.yml 文件下,我们可以指定容器在其他文件中的配置方式,例如服务、文件版本、使用的卷以及连接服务的网络。

就像我们在 Dockerfile 中指定端口号一样,我们也需要在 docker-compose.yml 文件中指定端口号。我们可以使用 exposeports 指令来做到这一点。

rabbitmq:
   image: rabbitmq
   expose: 
        - 3000
        - 5000

expose 指令允许我们在不发布端口或将它们绑定到主机端口的情况下公开端口,即端口不暴露给主机,只暴露给其他服务。

另一方面,ports 指令允许我们指定主机和容器端口号。此外,这些端口将在其他服务之间共享,并向主机暴露给随机或给定的端口。

rabbitmq:
   image: rabbitmq
   ports: 
        - "8000:80"
        - "5000: 70"

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Linux 中托管 Docker Internal

发布时间:2023/04/18 浏览次数:139 分类:Docker

Docker 允许开发人员通过将应用程序包装在称为容器的标准化单元中来高效地构建、测试和部署应用程序。 在使用 Docker 容器时,您可能会遇到需要将容器与主机连接的场景。

在 Docker 中设置工作目录

发布时间:2023/04/18 浏览次数:82 分类:Docker

在 Docker 中,我们可以通过编辑 Dockerfile 并添加密钥 WORKDIR 来设置我们的工作目录。本文将讨论在 Docker 中更改我们当前和默认的工作目录。

在 Docker 容器中公开多个端口

发布时间:2023/04/18 浏览次数:143 分类:Docker

Docker 容器使用端口来实现万维网上不同设备之间的通信。 在本篇文章中,我们将学习如何使用 Nginx 应用程序在 Docker 容器中公开多个端口。

将用户添加到 Docker 容器

发布时间:2023/04/18 浏览次数:187 分类:Docker

在本文中,我们将学习如何通过实现返回产品数组的 Express 应用程序将用户添加到 Docker 容器。

使用 Docker 网络主机命令

发布时间:2023/04/18 浏览次数:112 分类:Docker

在本文中,我们将学习如何使用 --network 命令将容器添加到主机网络。 如果我们不使用此命令指定网络,我们还将了解如何将容器添加到默认网络。

清除 Docker 容器日志

发布时间:2023/04/18 浏览次数:181 分类:Docker

本文介绍了我们可以用来清除 docker 容器中日志的不同方法。日志是应用程序在特定事件或状态发生时记录的信息,它们帮助我们监控应用程序并采取必要的措施。

Docker 中的守护进程日志位置

发布时间:2023/04/18 浏览次数:175 分类:Docker

本文将讨论守护进程事件以及我们通常可以在哪里找到每个操作系统 (OS) 的守护进程日志。

Dockerfile 中 COPY 和 ADD 命令的区别

发布时间:2023/04/18 浏览次数:158 分类:Docker

在 Dockerfile 中,我们可以使用 COPY 或 ADD 命令复制这些文件。 这些命令在功能上是相同的; 但是,存在一些差异。本文介绍了 Dockerfile 中 COPY 和 ADD 命令之间的区别。

Docker 中的 --rm 标志

发布时间:2023/04/18 浏览次数:77 分类:Docker

本文介绍如何在 docker 中使用 --rm 命令。 此外,它还提供了使用命令的优势。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便