docker中容器互联,补充dockerfile与docker-compose.yml

本文介绍了Docker容器互联的概念及实现方式,包括如何自定义容器名称、建立容器间的连接,以及Docker如何通过环境变量和hosts文件为互联容器提供连接信息。此外,还讨论了Dockerfile和docker-compose.yml在构建镜像和服务中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/sannerlittle/article/details/76088504

Main Reference:[https://yeasy.gitbooks.io/docker_practice/content/network/linking.html] 
容器互联

容器的连接(linking)系统是除了端口映射外,另一种跟容器中应用交互的方式。

该系统会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

自定义容器命名

连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。

虽然当创建容器的时候,系统默认会分配一个名字。自定义命名容器有2个好处:

自定义的命名,比较好记,比如一个web应用容器我们可以给它起名叫web 
当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器 
使用 –name 标记可以为容器自定义命名。

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

使用 docker ps 来验证设定的命名。

$ sudo docker ps -l
  • 1
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
  • 1
  • 2

也可以使用 docker inspect 来查看容器的名字

$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
  • 1
/web
  • 1

注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用docker rm 来删除之前创建的同名容器。

在执行 docker run 的时候如果添加 –rm 标记,则容器在终止后会立刻删除。注意,–rm 和 -d 参数不能同时使用。

容器互联

使用 –link 参数可以让容器之间安全的进行交互。

下面先创建一个新的数据库容器。

$ sudo docker run -d --name db training/postgres
  • 1

删除之前创建的 web 容器

$ docker rm -f web
  • 1

然后创建一个新的 web 容器,并将它连接到 db 容器

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

此时,db 容器和 web 容器建立互联关系。

–link 参数的格式为 –link name:alias,其中 name 是要链接的容器的名称,alias 是这个连接的别名。

使用 docker ps 来查看容器的连接

$ docker ps
  • 1
CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES
349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db, web/db
aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  web
  • 1
  • 2
  • 3

可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db 容器,web 容器将被允许访问 db 容器的信息。

Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db 容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。

Docker 通过 2 种方式为容器公开连接信息:

环境变量 
更新 /etc/hosts 文件 
使用 env 命令来查看 web 容器的环境变量

$ sudo docker run --rm --name web2 --link db:db training/webapp env
  • 1

… 
DB_NAME=/web2/db 
DB_PORT=tcp://172.17.0.5:5432 
DB_PORT_5000_TCP=tcp://172.17.0.5:5432 
DB_PORT_5000_TCP_PROTO=tcp 
DB_PORT_5000_TCP_PORT=5432 
DB_PORT_5000_TCP_ADDR=172.17.0.5 
… 
其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。

除了环境变量,Docker 还添加 host 信息到父容器的 /etc/hosts 的文件。下面是父容器 web 的 hosts 文件

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

之后进入容器:docker exec -it <containerID> /bin/bash(打开一个bash终端,与容器交互三种方式之一)

root@aed84ee21bde:/opt/webapp# cat /etc/hosts
  • 1

172.17.0.7 aed84ee21bde 
… 
172.17.0.5 db 
这里有 2 个 hosts,第一个是 web 容器,web 容器用 id 作为他的主机名,第二个是 db 容器的 ip 和主机名。 可以在 web 容器中安装 ping 命令来测试跟db容器的连通。

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

PING db (172.17.0.5): 48 data bytes 
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms 
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms 
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms 
用 ping 来测试db容器,它会解析成 172.17.0.5。 *注意:官方的 ubuntu 镜像默认没有安装 ping,需要自行安装。

用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。

dockerfile与docker-compose.yml 
从头说起。 
假如你不用 docker ,搭建 wordpress 怎么弄?先找台 server ,假设其 OS 为 Ubuntu ,然后按照文档一步步敲命令,写配置,对吧?

用 docker 呢? 随便找台 server ,不管什么操作系统,只要支持 docker 就行, docker run ubuntu, docker 会从官方源里拉取最新的 Ubuntu 镜像,可以认为你开了个 Ubuntu 虚拟机,然后一步步安装,跟上面一样。

但是这样安装有个显著的缺点,一旦 container 被删,你做的工作就都没了。当然可以用 docker commit 来保存成镜像,这样就可以复用了。

但是镜像一般比较大,而且只分享镜像的话,别人也不知道你这镜像到底包含什么,这些问题都不利于分享和复用。 
一个直观的解决方案就是,写个脚本把安装过程全部记录下来,这样再次安装的时候,执行脚本就行了。 Dockerfile 就是这样的脚本,它记录了一个镜像的制作过程。 
有了 Dockerfile, 只要执行 docker build . 就能制作镜像,而且 Dockerfile 就是文本文件,修改也很方便。

现在有了 wordpress 的镜像,只需要 docker run 就把 wordpress 启动起来了。

如果仅仅是 wordpress, 这也就够了。但是很多时候,需要多个镜像合作才能启动一个服务,比如前端要有 nginx , 数据库 mysql, 邮件服务等等,当然你可以把所有这些都弄到一个镜像里去,但这样做就无法复用了。 
更常见的是, nginx, mysql, smtp 都分别是个镜像,然后这些镜像合作,共同服务一个项目。 
docker-compose 就是解决这个问题的。你的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume, 等等信息都包含在 docker-compose.yml 里。 
要启动服务,只需要 docker-compose up 就行,停止也只需要 docker-compse stop/down

简而言之, Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。

你说有些教程用了 dockerfile+docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息,如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要;如果镜像是需要 build 的,那就需要提供 Dockerfile.

<think>好的,我现在需要解决用户关于Docker Compose文件标准存放位置的问题。首先,我得回忆一下Docker Compose的相关文档和常见实践。用户提到他们引用了几个资料,包括docker-compose.ymlDockerfile的区别,以及使用多个compose文件的情况,比如docker-compose.override.yml。这些引用中提到,Docker Compose文件通常用于定义服务、网络和卷,而Dockerfile用于构建镜像。 接下来,用户的问题是关于docker-compose.ymlcompose.yml的标准存储路径和常见目录位置。我需要确认Docker Compose文件的默认名称和路径。根据Docker的官方文档,默认情况下,Docker Compose会查找当前目录下的docker-compose.ymlcompose.yml文件。可能从版本更新后,名称有所变化,比如从较长的docker-compose.yml到更简洁的compose.yml,但两者都是有效的。 然后,标准存放位置通常是项目的根目录。例如,在开发一个应用时,通常会将docker-compose.yml放在项目的主文件夹下,这样方便管理和执行命令。用户可能是在多个环境中使用,或者有多个compose文件,比如用于不同配置的覆盖文件,这时候需要指定路径。 另外,用户提到的引用[2]中提到了使用-f参数指定不同的yml文件,比如docker-compose -f xxx.yml,这说明文件的位置可以灵活指定,但默认情况下是在当前目录。引用[3]提到在docker-compose.yml中指定Dockerfile的位置,这可能涉及构建上下文的路径,但和compose文件本身的存放位置无关。 还需要考虑不同操作系统下的可能差异,比如在Linux和Windows系统中,路径结构不同,但Docker Compose的行为应该是一致的,都是基于当前工作目录。此外,可能有一些项目结构的最佳实践,比如将compose文件放在项目根目录下的docker或deploy子目录中,但这并非强制,而是组织代码的一种方式。 总结一下,Docker Compose文件的标准位置是项目的根目录,默认文件名为docker-compose.ymlcompose.yml。用户可以根据需要使用不同的文件名,并通过-f参数指定路径。常见的目录位置包括项目根目录、子目录如docker/,或者其他环境配置相关的目录如env/prod/等。需要确保在运行docker-compose命令时,当前工作目录正确,或者使用-f明确指定文件路径。</think>### Docker Compose文件的标准存放位置 Docker Compose文件(如`docker-compose.yml`或`compose.yml`)的默认存储位置和常见目录如下: #### 1. **默认文件名路径** - **默认文件名**:Docker Compose默认会查找当前目录下的以下文件: - `docker-compose.yml` - `compose.yml`(较新版本的Docker可能支持更简短的名称)[^2]。 - **标准存放位置**:通常放置在**项目的根目录**下,代码、Dockerfile等文件同级。例如: ```text /your-project/ ├── docker-compose.yml ├── Dockerfile └── src/ ``` #### 2. **自定义路径多文件配置** - 若文件不在当前目录,可通过`-f`参数显式指定路径: ```bash docker-compose -f /path/to/docker-compose.yml up ``` 这在多环境配置(如开发、测试、生产)中常见,例如: ```text /your-project/ ├── docker-compose.yml # 基础配置 ├── docker-compose.override.yml # 本地开发覆盖配置 └── env/ ├── prod/ │ └── docker-compose.yml # 生产环境配置 └── test/ └── docker-compose.yml # 测试环境配置 ``` #### 3. **常见目录结构** - **单一服务项目**:直接放在项目根目录。 - **复杂多服务项目**:可能按功能或服务拆分到子目录: ```text /microservices/ ├── auth-service/ │ ├── Dockerfile │ └── docker-compose.yml ├── order-service/ │ ├── Dockerfile │ └── docker-compose.yml └── global-compose.yml # 聚合所有服务的全局配置 ``` #### 4. **Dockerfile的关系** - **Dockerfile**:用于定义单个镜像的构建步骤,通常`docker-compose.yml`同级或位于子目录[^1]。 - **构建上下文**:在`docker-compose.yml`中通过`build.context`指定Dockerfile的路径[^3],例如: ```yaml services: app: build: context: ./backend dockerfile: Dockerfile.prod ``` #### 5. **操作系统兼容性** - **Linux/Windows/macOS**:路径规则一致,但需注意文件系统差异(如Windows的路径分隔符为`\`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值