Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Docker 容器连接

Docker 容器连接

作者头像
用户8647142
修改于 2021-07-27 09:46:47
修改于 2021-07-27 09:46:47
60500
代码可运行
举报
文章被收录于专栏:路涵运维路涵运维
运行总次数:0
代码可运行

前面我们实现了通过网络端口来访问运行在 docker 容器内的服务。

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P-p 参数来指定端口映射。

下面我们来实现通过端口连接到一个 docker 容器。


网络端口映射

我们创建了一个 python 应用的容器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

我们使用 -P 绑定端口号,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker ps
CONTAINER ID    IMAGE               COMMAND            ...           PORTS                     NAMES
fce072cc88ce    training/webapp     "python app.py"    ...     0.0.0.0:32768->5000/tcp   grave_hopper

我们也可以使用 -p 标识来指定容器端口绑定到主机端口。

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...           PORTS                     NAMES
33e4523d30aa        training/webapp     "python app.py"   ...   0.0.0.0:5000->5000/tcp    berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...   0.0.0.0:32768->5000/tcp   grave_hopper

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
runoob@runoob:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...     PORTS                                NAMES
95c6ceef88ca        training/webapp     "python app.py"   ...  5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...  0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口。

上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
runoob@runoob:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

docker port 命令可以让我们快捷地查看端口的绑定情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001

Docker 容器互联

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。


容器命名

当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$  docker run -d -P --name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

我们可以使用 docker ps 命令来查看容器名称。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
runoob@runoob:~$ docker ps -l
CONTAINER ID     IMAGE            COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...     0.0.0.0:32769->5000/tcp   runoob

新建网络

下面先创建一个新的 Docker 网络。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker network create -d bridge test-net

参数说明:

-d:参数指定 Docker 网络类型,有 bridge、overlay。

其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。

连接容器

运行一个容器并连接到新建的 test-net 网络:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

点击图片查看大图:

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping(即学即用:可以在一个容器里安装好,提交容器到镜像,在以新的镜像重新运行以上俩个容器)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apt-get update
apt install iputils-ping

在 test1 容器输入以下命令:

点击图片查看大图:

同理在 test2 容器也会成功连接到:

点击图片查看大图:

这样,test1 容器和 test2 容器建立了互联关系。

如果你有多个容器之间需要互相连接,推荐使用 Docker Compose,后面会介绍。


配置 DNS

我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。

配置完,需要重启 docker 才能生效。

查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -it --rm  ubuntu  cat etc/resolv.conf

点击图片查看大图:

手动指定容器的配置

如果只想在指定的容器设置 DNS,则可以使用以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

--rm:容器退出时自动清理容器内部的文件系统

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

--dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

--dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

点击图片查看大图:

如果在容器启动时没有指定 --dns--dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
当项目需要使用Docker,对Dockerfile、配置加速器以及配置加速器的实际运用
因为Docker在C/S中运行。我们的本机是C,Docker引擎是S。实际的构建过程是在Docker引擎下完成的,因此此时无法使用本地文件。这需要将本地机器指定目录中的文件打包并提供给Docker引擎使用。 如果未指定最后一个参数,则默认上下文路径为Dockerfile的位置。 注意:不要将无用的文件放在上下文路径中,因为它们将被打包并发送到docker引擎。如果文件太多,进程将很慢。
上进小菜猪
2022/12/19
7740
当项目需要使用Docker,对Dockerfile、配置加速器以及配置加速器的实际运用
Docker 容器使用
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
用户8647142
2021/07/27
5940
docker 镜像和容器
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
acc8226
2022/05/17
8570
Docker 容器连接
这样我们就可以通过访问 127.0.0.1:5001(主机) 来访问容器的 5000 端口。这里面默认都是绑定TCP要绑定UDP如下命令:
Criss@陈磊
2019/10/31
1.3K0
Docker端口映射与容器互联
在前面我们已经掌握了单个容器的管理操作,但是在实际工作中很少是只运行一个容器,而更多的是需要运行多个容器进行协作的情况,因此就需要多个容器之间能够互相访问到对方的服务,那么本篇文章就来学习Docker端口映射与容器互联相关的知识,注意本文所提到的宿主机是指VMware虚拟机,而非本地的Windows系统主机。
啃饼思录
2020/12/29
6.5K0
Docker端口映射与容器互联
docker 网络介绍
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。
dogfei
2020/07/31
4180
Docker 容器连接
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过-P或-p参数来指定端口映射。
子润先生
2021/06/30
8880
【愚公系列】2022年01月 Docker容器 容器间相互通信
前面几篇文章已经说明Docker的容器和镜像相关操作,如果只是Docker的单机应用并不能满足需求,Docker内部间要能互相通信,在符合微服务思想,才能达到Docker真正作用。
愚公搬代码
2022/12/01
4240
【愚公系列】2022年01月 Docker容器 容器间相互通信
Docker 入门到实战教程(四)容器链接
在使用Docker容器时,我们需要访问容器的内部网络,或需要在容器间相互访问。Docker 容器默认不会开放任何端口,因此需要将容器与宿主机进行端口映射,使容器可外部访问。而容器间互相访问,除了可以基于端口映射进行访问外,还可以通过容器链接(Link)的方式,也可以通过Docker 网络(Networking)实现。
小东啊
2020/07/23
1.9K0
Docker 入门到实战教程(四)容器链接
Docker 容器使用
docker客户端非常简单,我们可以直接输入docker命令来查看到 Docker 客户端的所有命令选项。
子润先生
2021/06/30
5910
【愚公系列】2022年01月 Docker容器 Docker运行web应用
docker相当于一个微型系统,但端口是不和外界相通,如果在docker里安装web应用需要暴露端口让外界可以访问,这就需要把docker端口映射到真实机器上来才能让外界访问web应用。
愚公搬代码
2022/12/01
2750
【愚公系列】2022年01月 Docker容器 Docker运行web应用
Docker学习笔记1 -- 刚入手docker时的几个命令
镜像标签可以理解为版本号。比如我们项目demo的版本是1.5.1,那么标签可以是:
Ryan-Miao
2019/03/04
4610
Docker从入门到精通(四)
我们经常碰到服务之间要进行公共协作,所以容器之间要能互相访问,其实除了网络访问外,docker提供两种方便的方式
小土豆Yuki
2023/02/23
3960
Docker从入门到精通(四)
docker部署web项目_docker到底怎么用
前面我们运行的容器并没有一些什么特别的用处。 接下来让我们尝试使用 docker 构建一个 web 应用程序。 我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
全栈程序员站长
2022/09/19
6650
docker部署web项目_docker到底怎么用
docker网络
容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。
超蛋lhy
2018/10/09
9530
docker网络
Docker理论与实践(三)
注:从上面可以看到主机的两个端口32769和80都映射到了容器的5000端口,可以在主机浏览器中访问http://localhost:32769/,http://localhost:80/,都能看到Hello world!页面。虽然两个容器的端口都是5000,但它们是不一样的,容器的namespace属性会将两个容器隔离开,因此它们对应的主机端口是不一样的。
Tyan
2022/05/09
1990
Docker学习——数据管理、使用网络(三)
这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
wuweixiang
2018/12/06
5520
centos7.4安装docker_pythondocker
当我们在一台电脑上搭建了python3.6的环境,下次换台电脑,又得重新搭建一次,设置环境变量等操作。 好不容易安装好,一会提示pip不是内部或外部命令,一会又提示pip: command not found,想死的心都有了。 搭建环境是真的麻烦,不弄好又不行,从今天开始学好docker,环境问题从此和你说再见
全栈程序员站长
2022/09/16
2540
docker学习2-快速搭建centos7-python3.6环境
当我们在一台电脑上搭建了python3.6的环境,下次换了个电脑,或者换成linux的系统了,又得重新搭建一次,设置环境变量、下载pip等操作。 好不容易安装好,一会Scrips目录找不到pip.exe,一会提示pip不是内部或外部命令,一会又提示pip: command not found, 环境安装多了都是一把辛酸泪。 搭建环境成为不少小伙伴学习的障碍,从今天开始学好docker,环境问题从此和你说再见~~~
上海-悠悠
2019/07/04
2.1K0
Docker(三)——容器
通过exit退出当前交互式容器 守护进程容器 执行命令Ctrl+P加速Ctrl+Q的方式让容器成为守护式容器
羊羽shine
2019/05/28
5310
相关推荐
当项目需要使用Docker,对Dockerfile、配置加速器以及配置加速器的实际运用
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文