directory search
Compose About versions and upgrading (Compose) ASP.NET Core + SQL Server on Linux (Compose) CLI environment variables (Compose) Command-line completion (Compose) Compose(组成) Compose command-line reference(组合命令行参考) Control startup order (Compose) Django and PostgreSQL (Compose) Docker stacks and distributed application bundles (Compose) docker-compose build(docker-compose构建) docker-compose bundle docker-compose config docker-compose create docker-compose down docker-compose events docker-compose exec docker-compose help docker-compose images docker-compose kill docker-compose logs docker-compose pause docker-compose port docker-compose ps docker-compose pull docker-compose push docker-compose restart docker-compose rm docker-compose run docker-compose scale docker-compose start docker-compose stop docker-compose top docker-compose unpause docker-compose up Environment file (Compose) Environment variables in Compose Extend services in Compose Frequently asked questions (Compose) Getting started (Compose) Install Compose Link environment variables (deprecated) (Compose) Networking in Compose Overview of Docker Compose Overview of docker-compose CLI Quickstart: Compose and WordPress Rails and PostgreSQL (Compose) Sample apps with Compose Using Compose in production Using Compose with Swarm Engine .NET Core application (Engine) About images, containers, and storage drivers (Engine) Add nodes to the swarm (Engine) Apply custom metadata (Engine) Apply rolling updates (Engine) apt-cacher-ng Best practices for writing Dockerfiles (Engine) Binaries (Engine) Bind container ports to the host (Engine) Breaking changes (Engine) Build your own bridge (Engine) Configure container DNS (Engine) Configure container DNS in user-defined networks (Engine) CouchDB (Engine) Create a base image (Engine) Create a swarm (Engine) Customize the docker0 bridge (Engine) Debian (Engine) Default bridge network Delete the service (Engine) Deploy a service (Engine) Deploy services to a swarm (Engine) Deprecated Engine features Docker container networking (Engine) Docker overview (Engine) Docker run reference (Engine) Dockerfile reference (Engine) Dockerize an application Drain a node (Engine) Engine FAQ (Engine) Fedora (Engine) Get started (Engine) Get started with macvlan network driver (Engine) Get started with multi-host networking (Engine) How nodes work (Engine) How services work (Engine) Image management (Engine) Inspect the service (Engine) Install Docker (Engine) IPv6 with Docker (Engine) Join nodes to a swarm (Engine) Legacy container links (Engine) Lock your swarm (Engine) Manage nodes in a swarm (Engine) Manage sensitive data with Docker secrets (Engine) Manage swarm security with PKI (Engine) Manage swarm service networks (Engine) Migrate to Engine 1.10 Optional Linux post-installation steps (Engine) Overview (Engine) PostgreSQL (Engine) Raft consensus in swarm mode (Engine) Riak (Engine) Run Docker Engine in swarm mode Scale the service (Engine) SDKs (Engine) Select a storage driver (Engine) Set up for the tutorial (Engine) SSHd (Engine) Storage driver overview (Engine) Store service configuration data (Engine) Swarm administration guide (Engine) Swarm mode key concepts (Engine) Swarm mode overlay network security model (Engine) Swarm mode overview (Engine) Understand container communication (Engine) Use multi-stage builds (Engine) Use swarm mode routing mesh (Engine) Use the AUFS storage driver (Engine) Use the Btrfs storage driver (Engine) Use the Device mapper storage driver (Engine) Use the OverlayFS storage driver (Engine) Use the VFS storage driver (Engine) Use the ZFS storage driver (Engine) Engine: Admin Guide Amazon CloudWatch logs logging driver (Engine) Bind mounts (Engine) Collect Docker metrics with Prometheus (Engine) Configuring and running Docker (Engine) Configuring logging drivers (Engine) Control and configure Docker with systemd (Engine) ETW logging driver (Engine) Fluentd logging driver (Engine) Format command and log output (Engine) Google Cloud logging driver (Engine) Graylog Extended Format (GELF) logging driver (Engine) Journald logging driver (Engine) JSON File logging driver (Engine) Keep containers alive during daemon downtime (Engine) Limit a container's resources (Engine) Link via an ambassador container (Engine) Log tags for logging driver (Engine) Logentries logging driver (Engine) PowerShell DSC usage (Engine) Prune unused Docker objects (Engine) Run multiple services in a container (Engine) Runtime metrics (Engine) Splunk logging driver (Engine) Start containers automatically (Engine) Storage overview (Engine) Syslog logging driver (Engine) tmpfs mounts Troubleshoot volume problems (Engine) Use a logging driver plugin (Engine) Using Ansible (Engine) Using Chef (Engine) Using Puppet (Engine) View a container's logs (Engine) Volumes (Engine) Engine: CLI Daemon CLI reference (dockerd) (Engine) docker docker attach docker build docker checkpoint docker checkpoint create docker checkpoint ls docker checkpoint rm docker commit docker config docker config create docker config inspect docker config ls docker config rm docker container docker container attach docker container commit docker container cp docker container create docker container diff docker container exec docker container export docker container inspect docker container kill docker container logs docker container ls docker container pause docker container port docker container prune docker container rename docker container restart docker container rm docker container run docker container start docker container stats docker container stop docker container top docker container unpause docker container update docker container wait docker cp docker create docker deploy docker diff docker events docker exec docker export docker history docker image docker image build docker image history docker image import docker image inspect docker image load docker image ls docker image prune docker image pull docker image push docker image rm docker image save docker image tag docker images docker import docker info docker inspect docker kill docker load docker login docker logout docker logs docker network docker network connect docker network create docker network disconnect docker network inspect docker network ls docker network prune docker network rm docker node docker node demote docker node inspect docker node ls docker node promote docker node ps docker node rm docker node update docker pause docker plugin docker plugin create docker plugin disable docker plugin enable docker plugin inspect docker plugin install docker plugin ls docker plugin push docker plugin rm docker plugin set docker plugin upgrade docker port docker ps docker pull docker push docker rename docker restart docker rm docker rmi docker run docker save docker search docker secret docker secret create docker secret inspect docker secret ls docker secret rm docker service docker service create docker service inspect docker service logs docker service ls docker service ps docker service rm docker service scale docker service update docker stack docker stack deploy docker stack ls docker stack ps docker stack rm docker stack services docker start docker stats docker stop docker swarm docker swarm ca docker swarm init docker swarm join docker swarm join-token docker swarm leave docker swarm unlock docker swarm unlock-key docker swarm update docker system docker system df docker system events docker system info docker system prune docker tag docker top docker unpause docker update docker version docker volume docker volume create docker volume inspect docker volume ls docker volume prune docker volume rm docker wait Use the Docker command line (Engine) Engine: Extend Access authorization plugin (Engine) Docker log driver plugins Docker network driver plugins (Engine) Extending Engine with plugins Managed plugin system (Engine) Plugin configuration (Engine) Plugins API (Engine) Volume plugins (Engine) Engine: Security AppArmor security profiles for Docker (Engine) Automation with content trust (Engine) Content trust in Docker (Engine) Delegations for content trust (Engine) Deploying Notary (Engine) Docker security (Engine) Docker security non-events (Engine) Isolate containers with a user namespace (Engine) Manage keys for content trust (Engine) Play in a content trust sandbox (Engine) Protect the Docker daemon socket (Engine) Seccomp security profiles for Docker (Engine) Secure Engine Use trusted images Using certificates for repository client verification (Engine) Engine: Tutorials Engine tutorials Network containers (Engine) Get Started Part 1: Orientation Part 2: Containers Part 3: Services Part 4: Swarms Part 5: Stacks Part 6: Deploy your app Machine Amazon Web Services (Machine) Digital Ocean (Machine) docker-machine active docker-machine config docker-machine create docker-machine env docker-machine help docker-machine inspect docker-machine ip docker-machine kill docker-machine ls docker-machine provision docker-machine regenerate-certs docker-machine restart docker-machine rm docker-machine scp docker-machine ssh docker-machine start docker-machine status docker-machine stop docker-machine upgrade docker-machine url Driver options and operating system defaults (Machine) Drivers overview (Machine) Exoscale (Machine) Generic (Machine) Get started with a local VM (Machine) Google Compute Engine (Machine) IBM Softlayer (Machine) Install Machine Machine Machine CLI overview Machine command-line completion Machine concepts and help Machine overview Microsoft Azure (Machine) Microsoft Hyper-V (Machine) Migrate from Boot2Docker to Machine OpenStack (Machine) Oracle VirtualBox (Machine) Provision AWS EC2 instances (Machine) Provision Digital Ocean Droplets (Machine) Provision hosts in the cloud (Machine) Rackspace (Machine) VMware Fusion (Machine) VMware vCloud Air (Machine) VMware vSphere (Machine) Notary Client configuration (Notary) Common Server and signer configurations (Notary) Getting started with Notary Notary changelog Notary configuration files Running a Notary service Server configuration (Notary) Signer configuration (Notary) Understand the service architecture (Notary) Use the Notary client
characters

本节中的信息解释bridge了在安装 Docker 时自动创建的 Docker 默认网络中的旧容器链接。

在 Docker 网络功能之前,您可以使用 Docker 链接功能来允许容器相互发现并安全地将有关一个容器的信息传输到另一个容器。通过引入 Docker 网络功能,您仍然可以创建链接,但它们在默认bridge网络和用户定义网络之间的行为不同。

本节简要讨论通过网络端口进行连接,然后详细介绍默认bridge网络中的容器链接。

警告:该--link标志是 Docker 的弃用遗留功能。它最终可能会被删除。除非您绝对需要继续使用它,否则我们建议您使用用户定义的网络来促进两个容器之间的通信而不是使用--link。用户定义的网络不支持的一个功能--link是在容器之间共享环境变量。但是,您可以使用其他机制(如卷)以更受控制的方式在容器之间共享环境变量。

使用网络端口映射连接

假设您使用此命令来运行简单的 Python Flask 应用程序:

$ docker run -d -P training/webapp python app.py

注意:容器具有内部网络和IP地址。Docker 可以有多种网络配置。您可以在这里看到有关 Docker 网络的更多信息。

创建该容器时,该-P标志用于自动将其内部的任何网络端口映射到 Docker 主机上临时端口范围内的随机高端口。接下来,docker ps运行时,您看到容器中的端口5000已绑定到主机上的端口49155。

$ docker ps nostalgic_morse

CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

您还看到了如何使用-p旗子。在这里,主机的端口80映射到容器的端口5000:

$ docker run -d -p 80:5000 training/webapp python app.py

你也看到了为什么这不是一个好主意,因为它限制你在那个特定的港口上只有一个集装箱。

相反,您可以指定一系列主机端口,以便将容器端口绑定到与默认端口不同的位置。短时端口范围*

$ docker run -d -p 8000-9000:5000 training/webapp python app.py

这将将容器中的端口5000绑定到主机上8000到9000之间的随机可用端口。

还有一些其他方法可以配置-p旗子。默认情况下,-p标志将指定的端口绑定到主机上的所有接口。但是,您还可以指定绑定到特定接口,例如,仅将绑定指定到localhost...

$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py

这将将容器内的端口5000绑定到localhost127.0.0.1主机上的接口。

或者,将容器的端口5000绑定到动态端口,但仅在localhost,你可以:

$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以通过添加尾随来绑定UDP端口。/udp例如:

$ docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py

你也学到了有用的东西docker port显示当前端口绑定的快捷方式。这对于显示特定的端口配置也很有用。例如,如果您已经将容器端口绑定到localhost在主机上,然后docker port产出将反映这一点。

$ docker port nostalgic_morse 5000127.0.0.1:49155

*-p可以多次使用标志来配置多个端口。

与连接系统连接

本节将介绍默认情况下的遗留链接功能。bridge网络。请参阅在用户定义的网络中连接容器有关用户定义网络中链接的更多信息。

网络端口映射并不是Docker容器相互连接的唯一方式。Docker还有一个链接系统,允许您将多个容器连接在一起,并从一个容器到另一个容器发送连接信息。链接容器时,可以将有关源容器的信息发送到收件人容器。这允许收件人查看所选数据描述源容器的各个方面。

命名的重要性

要建立链接,Docker依赖于容器的名称。您已经看到,您创建的每个容器都有一个自动创建的名称;实际上,您已经熟悉了我们的老朋友nostalgic_morse在这个指南里。您也可以自己命名容器。这个命名提供了两个有用的功能:

  1. 将执行特定功能的容器命名为使您更容易记住它们的方法是有用的,例如命名包含web应用程序的容器。web...

  1. 它为Docker提供了一个引用点,允许它引用其他容器,例如,可以指定链接容器web到集装箱db...

您可以使用--name例如,国旗:

$ docker run -d -P --name web training/webapp python app.py

这将启动一个新容器,并使用--name标志以命名容器web.您可以使用docker ps命令。

$ docker ps -l

CONTAINER ID  IMAGE                  COMMAND        CREATED       STATUS       PORTS                    NAMES
aed84ee21bde  training/webapp:latest python app.py  12 hours ago  Up 2 seconds 0.0.0.0:49154->5000/tcp  web

您也可以使用docker inspect返回容器的名称。

容器名称必须是唯一的。这意味着您只能调用一个容器。web.如果要重用容器名称,必须删除旧容器%28docker rm%29,然后才能创建同名的新容器。作为替代,您可以使用--rmdocker run命令。这将在容器停止后立即删除它。

跨链路通信

链接允许容器彼此发现并安全地将有关一个容器的信息传输到另一个容器。设置链接时,可以在源容器和收件人容器之间创建管道。然后,收件人可以访问有关源的选择数据。若要创建链接,请使用--link旗子。首先,创建一个新容器,这次是一个包含数据库的容器。

$ docker run -d --name db training/postgres

这将创建一个名为dbtraining/postgres图像,其中包含PostgreSQL数据库。

现在,您需要删除web之前创建的容器,以便用链接的容器替换它:

$ docker rm -f web

现在,创建一个新的web容器并将其与您的db集装箱。

$ docker run -d -P --name web --link db:db training/webapp python app.py

这将连接新的web容器db您之前创建的容器。大--link国旗形式如下:

--link <name or id>:alias

何地name是我们链接到的容器的名称,并且alias是链接名的别名。您很快就会看到这个别名是如何使用的。大--link标志还采取以下形式:

--link <name or id>

在这种情况下,别名将与名称匹配。您可以将前面的示例编写为:

$ docker run -d -P --name web --link db training/webapp python app.py

接下来,使用docker inspect*

$ docker inspect -f "{{ .HostConfig.Links }}" web[/db:/web/db]

你可以看到web容器现在链接到db集装箱web/db。这允许它访问有关db集装箱。

那么,连接容器实际上是做什么的呢?您已经了解到,链接允许源容器向收件人容器提供有关自身的信息。在我们的例子中,接受者,web,可以访问有关源的信息。db为此,Docker在容器之间创建一个安全隧道,不需要在容器外部公开任何端口;您将注意到,当我们启动db容器,我们也没有使用-P-p旗子。这是链接的一个巨大好处:我们不需要将源容器(这里是PostgreSQL数据库)公开到网络中。

Docker以两种方式公开源容器到收件人容器的连接信息:

  • 环境变量,

  • 更新/etc/hosts档案。

环境变量

当您链接容器时,Docker会创建多个环境变量。控件自动在目标容器中创建环境变量。--link参数。它还将公开源自源容器的Docker的所有环境变量。这些变量包括:

  • ENV源容器的Dockerfile中的命令

  • -e,,,--env,和--env-file上的选项docker run在启动源容器时发出

这些环境变量可以从目标容器中发现与源容器相关的信息。

警告*重要的是要理解从容器内的Docker中产生的环境变量可用于任何链接到它的容器。如果将敏感数据存储在其中,这可能会对安全产生严重影响。

码头设置<alias>_NAME中列出的每个目标容器的环境变量。--link参数。例如,如果一个新容器调用web链接到名为db通孔--link db:webdb,然后Docker创建一个WEBDB_NAME=/web/webdb变量中的web集装箱。

Docker还为源容器公开的每个端口定义了一组环境变量。每个变量在表单中都有一个唯一的前缀:

<name>_PORT_<port>_<protocol>

这个前缀中的组件是:

  • 别名<name>中指定的--link参数%28例如,webdb%29

  • <port>暴露数

  • <protocol>哪个是tcp或udp?

Docker使用这种前缀格式定义三个不同的环境变量:

  • prefix_ADDR变量包含来自URL的IP地址,例如WEBDB_PORT_5432_TCP_ADDR=172.17.0.82...

  • prefix_PORT变量仅包含URL中的端口号,例如WEBDB_PORT_5432_TCP_PORT=5432...

  • prefix_PROTO变量仅包含来自URL的协议,例如WEBDB_PORT_5432_TCP_PROTO=tcp...

如果容器公开多个端口,则为每个端口定义一个环境变量集。这意味着,例如,如果容器公开了Docker创建的4个端口,每个端口将创建12个环境变量。

此外,Docker还创建了一个名为<alias>_PORT此变量包含源容器的第一个公开端口的URL。“第一个”端口被定义为具有最低数目的公开端口。例如,考虑WEBDB_PORT=tcp://172.17.0.82:5432变量。如果该端口同时用于TCP和UDP,则指定TCP端口。

最后,Docker还将来自源容器的每个Docker源环境变量公开为目标中的环境变量。对于每个变量,Docker创建一个<alias>_ENV_<name>变量在目标容器中。变量的值设置为启动源容器时使用的值Docker。

返回到我们的数据库示例,您可以运行env命令列出指定容器的环境变量。

    $ docker run --rm --name web2 --link db:db training/webapp env    . . .
    DB_NAME=/web2/db
    DB_PORT=tcp://172.17.0.5:5432
    DB_PORT_5432_TCP=tcp://172.17.0.5:5432
    DB_PORT_5432_TCP_PROTO=tcp
    DB_PORT_5432_TCP_PORT=5432
    DB_PORT_5432_TCP_ADDR=172.17.0.5    . . .

您可以看到,Docker已经创建了一系列环境变量,其中包含有关源的有用信息。db集装箱。每个变量都以前缀DB_,它是从alias你上面有说明。如果aliasdb1,变量将以DB1_.可以使用这些环境变量配置应用程序,以连接到db集装箱。连接将是安全的和私有的;只有链接web容器将能够与db集装箱。

关于码头环境变量的重要注记

不像/etc/hosts档案,如果重新启动源容器,存储在环境变量中的IP地址不会自动更新。我们建议在/etc/hosts若要解析链接容器的IP地址,请执行以下操作。

这些环境变量仅为容器中的第一个进程设置。一些守护进程,例如sshd,当它们产卵时,会擦洗它们以连接。

更新/etc/hosts档案

除了环境变量之外,Docker还将源容器的主机项添加到/etc/hosts档案。这里有一个条目web集装箱:

$ docker run -t -i --rm --link db:webdb training/webapp /bin/bash

root@aed84ee21bde:/opt/webapp# cat /etc/hosts172.17.0.7  aed84ee21bde. . .172.17.0.5  webdb 6e5cdeb2d300 db

您可以看到两个相关的主机条目。第一个条目是web容器,它使用容器ID作为主机名。第二个条目使用链接别名引用db集装箱。除了您提供的别名之外,链接容器的名称-如果是唯一的,则从提供给--link参数-并且链接容器的主机名也将被添加到/etc/hosts用于链接容器的IP地址。您现在可以通过以下任何一个条目来平该主机:

root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping

root@aed84ee21bde:/opt/webapp# ping webdb

PING webdb (172.17.0.5): 48 data bytes56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

:在本例中,您将注意到您必须安装ping因为它最初没有包含在容器中。

在这里,你用ping命令,将db容器使用其主机项,该条目解析为172.17.0.5.您可以使用此主机项配置应用程序以使用db集装箱。

::可以将多个收件人容器链接到单个源。例如,可以将多个%28不同名称的web容器附加到db集装箱。

如果重新启动源容器,则链接容器/etc/hosts文件将使用源容器的新IP地址自动更新,从而允许继续进行链接通信。

$ docker restart db

db

$ docker run -t -i --rm --link db:db training/webapp /bin/bash

root@aed84ee21bde:/opt/webapp# cat /etc/hosts172.17.0.7  aed84ee21bde. . .172.17.0.9  db
Previous article: Next article: