Docker目录挂载和多容器通信

Docker目录挂载和多容器通信
墨颜丶- 使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新
build
和run
,很是麻烦。 - 容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。
几种挂载方式
Docker提供了多种挂载方式,以下是三种主要的挂载方式及其使用方法和推荐:
- 绑定挂载(Bind Mounts):
- 使用方式:通过
-v
或--mount
参数将主机上的文件或目录挂载到容器中。例如:docker run -v /host/path:/container/path image_name
。 - 特点:允许容器与主机之间共享文件和目录,对其中一个的更改会直接影响到另一个。
- 推荐场景:当需要容器与主机之间实时同步文件或目录,或者需要在容器外部直接操作容器内部文件时,绑定挂载是一个很好的选择。
- 卷挂载(Volume Mounts):
- 使用方式:通过
-v
参数将Docker数据卷挂载到容器中。例如:docker run -v volume_name:/container/path image_name
。 - 特点:Docker卷是一个可供容器使用的特殊目录,它绕过了联合文件系统,因此对其的I/O操作效率更高。卷挂载允许在容器之间共享和重用数据,并且它们的生命周期可以独立于容器。
- 推荐场景:当需要在多个容器之间共享数据,或者希望数据的生命周期独立于容器时,卷挂载是一个很好的选择。
- 临时文件系统(tmpfs)挂载:
- 使用方式:通过
--tmpfs
参数将临时文件系统挂载到容器的指定路径。 - 特点:临时文件系统挂载的数据不会持久化到磁盘,仅存在于容器的运行期间。
- 推荐场景:当需要为容器提供临时的、非持久化的存储空间时,可以使用tmpfs挂载。
推荐:
- 如果需要实时同步主机与容器之间的文件或目录,或者需要在容器外部直接操作容器内部文件,推荐使用绑定挂载。
- 如果需要在多个容器之间共享数据,或者希望数据的生命周期独立于容器,推荐使用卷挂载。
请注意,不同的挂载方式有其特定的使用场景和优缺点,在选择时需要根据实际需求进行权衡。同时,为了确保数据的安全性和一致性,建议在使用挂载功能时谨慎操作,并遵循Docker的最佳实践。
文档参考:https://docs.docker.com/storage/
挂载演示
1. 绑定挂载(Bind Mounts)
绑定挂载允许你将主机上的文件或目录挂载到容器中
1 | docker run -v /host/path:/container/path ubuntu |
上面的命令会将/host/path
目录挂载到容器的/container/path
目录
其他:比如Flask
1 | docker run -d \ # -d 在后台运行容器。 |
2. 卷挂载(Volume Mounts)
Docker卷是一个可供容器使用的特殊目录,它绕过了联合文件系统,提供了更高效的I/O操作
首先,创建一个Docker卷:
1 | docker volume create my-volume |
然后,将卷挂载到容器中:
1 | docker run -v my-volume:/container/path ubuntu |
上面的命令会将my-volume
卷挂载到容器的/container/path
目录
其他:比如Flask
1 | docker volume create flask-volume # 创建一个Docker卷 |
3. 临时文件系统(tmpfs)挂载
tmpfs挂载创建的是一个临时文件系统,数据不会持久化到磁盘
1 | docker run --tmpfs /tmp:rw,size=1024 ubuntu |
上面的命令会在容器内创建一个/tmp
目录,并将其挂载为tmpfs文件系统
注意:在使用挂载功能时,请确保主机上的目录或文件权限设置正确,以便容器可以访问它们。此外,对于敏感数据或重要文件,请谨慎使用挂载功能,以避免潜在的安全风险。
在实际应用中,你可以根据具体需求选择适合的挂载方式,并根据需要进行调整和扩展。
多容器通信
项目往往都不是独立运行的,需要数据库、缓存这些东西配合运作。
这节我们把前面的 Django
项目增加一个 MariaDB
依赖,多跑一个 MariaDB
容器,演示如何多容器之间的通信。
创建虚拟网络
要想多容器之间互通,从 Django
容器访问 MariaDB
容器,我们只需要把他们放到同个网络中就可以了。
文档参考:https://docs.docker.com/engine/reference/commandline/network/
举例
使用Docker网络:
Docker提供了内置的网络功能,使得容器之间可以相互通信。当你启动Docker时,它会自动创建一个名为bridge
的默认网络。你可以将容器连接到这个网络,或者使用docker network create
命令创建自定义网络,并将容器连接到这个自定义网络。一旦容器连接到了同一个网络,它们就可以通过容器名称或IP地址相互通信。
例如,创建自定义网络:
1 | docker network create my-custom-network |
将容器连接到自定义网络:
1 | docker run -d --network==my-custom-network --name container1 ... |
容器间通信:
1 | docker exec -it container1 ping container2 |
示例
- 下载镜像
1 | # mariadb |
我的Dockerfile
如下,仅供参考
1 | # 使用官方Python 3.10.13镜像作为基础镜像 |
- 生成容器
1 | # 创建自定义网络 |
- 修改
Django
数据库配置文件
1 | DATABASES = { |
4.Django
数据库初始化
1 | docker exec -it myproject-django-container /bin/bash |
文笔流畅美,点赞纷至来;
内容引入胜,分享乐开怀;
佳作值得赏,打赏表心怀。