Docker(二)

Docker(二)

六、Docker容器数据管理

容器中的数据默认存储在可写层,当容器被删除时,这些数据也会丢失。为了实现数据持久化和容器间数据共享,Docker提供了三种数据持久化方式:数据卷(Volumes)、绑定挂载(Bind Mounts)和tmpfs挂载(tmpfs Mounts)。

6.1 数据卷(Volumes)

数据卷是Docker管理的宿主机文件系统的一部分(位于/var/lib/docker/volumes/目录),由Docker创建和管理,是推荐的数据持久化方式。

6.1.1 创建数据卷
# 创建数据卷
docker volume create myvolume

# 查看所有数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect myvolume
6.1.2 使用数据卷

在运行容器时,通过-v--mount选项挂载数据卷:

# 使用-v选项:docker run -v 卷名:容器路径 [其他选项] 镜像
docker run -d --name mynginx -v myvolume:/usr/share/nginx/html nginx

# 使用--mount选项(更推荐,语法更清晰)
docker run -d --name mynginx --mount source=myvolume,target=/usr/share/nginx/html nginx
6.1.3 删除数据卷
# 删除未被使用的数据卷
docker volume rm myvolume

# 删除所有未被使用的数据卷
docker volume prune

数据卷的特点:

完全由Docker管理,与宿主机的核心文件系统隔离。
可以在多个容器之间共享。
容器删除时,数据卷不会被自动删除,需要手动删除。
可以通过Docker命令或API管理。

6.2 绑定挂载(Bind Mounts)

绑定挂载将宿主机的文件或目录挂载到容器中,宿主机的文件系统由用户控制,而非Docker。

6.2.1 使用绑定挂载
# 使用-v选项:docker run -v 宿主机路径:容器路径 [其他选项] 镜像
docker run -d --name mynginx -v /home/user/html:/usr/share/nginx/html nginx

# 使用--mount选项
docker run -d --name mynginx --mount type=bind,source=/home/user/html,target=/usr/share/nginx/html nginx

绑定挂载的特点:

可以挂载宿主机的任何文件或目录。
宿主机的文件系统结构可能影响容器的运行。
容器中的用户可能需要对宿主机的挂载路径有相应的权限。
不支持Docker CLI命令直接管理。

6.3 tmpfs挂载(tmpfs Mounts)

tmpfs挂载将数据存储在宿主机的内存中,不会持久化到磁盘,适用于临时数据存储。

6.3.1 使用tmpfs挂载
# 使用--tmpfs选项(仅支持Linux)
docker run -d --name mynginx --tmpfs /tmp nginx

# 使用--mount选项
docker run -d --name mynginx --mount type=tmpfs,target=/tmp nginx

tmpfs挂载的特点:

数据存储在内存中,读写速度快。
容器停止后,数据会被清除。
仅适用于Linux系统。
可以限制最大使用的内存大小。

6.4 数据卷容器

数据卷容器是一个专门用于共享数据的容器,其他容器通过挂载该容器的数据卷来实现数据共享。

# 创建数据卷容器
docker create --name datavolume -v /data busybox

# 其他容器通过--volumes-from挂载数据卷容器
docker run -d --name app1 --volumes-from datavolume myapp
docker run -d --name app2 --volumes-from datavolume myapp

app1和app2容器都挂载了datavolume容器的/data卷,因此可以共享该目录下的数据。

6.5 数据备份与恢复

6.5.1 备份数据卷
# 将数据卷备份到宿主机的tar文件
docker run --rm --volumes-from datavolume -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

--rm:容器退出后自动删除
--volumes-from datavolume:挂载datavolume容器的数据卷
-v $(pwd):/backup:将当前目录挂载到容器的/backup目录
tar cvf /backup/backup.tar /data:将/data目录下的数据打包到/backup/backup.tar

6.5.2 恢复数据卷
# 创建一个新的数据卷容器
docker create --name datavolume_new -v /data busybox

# 从备份文件恢复数据到新的数据卷
docker run --rm --volumes-from datavolume_new -v $(pwd):/backup busybox sh -c "tar xvf /backup/backup.tar -C /"

七、Docker网络配置

Docker提供了多种网络驱动,用于实现容器之间、容器与宿主机之间以及容器与外部网络之间的通信。

7.1 Docker网络模式

Docker默认提供了以下几种网络模式:

bridge:默认网络模式,容器连接到默认的桥接网络。
host:容器使用宿主机的网络栈,没有自己的IP地址。
none:容器没有网络接口,无法进行网络通信。
container:容器共享另一个容器的网络栈。
自定义网络:用户可以创建自定义网络,实现更灵活的网络配置。

7.1.1 查看网络
# 查看所有Docker网络
docker network ls

# 查看网络详情
docker network inspect bridge

7.2 桥接网络(bridge)

bridge是Docker默认的网络模式,当创建容器时,如果不指定网络模式,默认连接到bridge网络。

7.2.1 使用默认bridge网络
# 启动两个容器,默认连接到bridge网络
docker run -d --name container1 nginx
docker run -d --name container2 nginx

# 查看容器IP
docker inspect -f '{
   
   
            {range .NetworkSettings.Networks}}{
   
   
            {.IPAddress}}{
   
   
            {end}}' container1
docker inspect -f '{
   
   
            {range .NetworkSettings.Networks}}{
   
   
            {.IPAddress}}{
   
   
            {end}}' container2

# 在container1中ping container2(需要容器内有ping命令)
docker exec -it container1 ping <container2的IP>

默认情况下,同一bridge网络中的容器可以通过IP地址相互通信,但不能通过容器名通信(需要使用--link选项,但该选项已不推荐使用)。

7.2.2 创建自定义桥接网络

自定义桥接网络相比默认bridge网络具有以下优势:

容器可以通过容器名相互通信(内置DNS解析)。
更好的隔离性,可以创建多个自定义网络,实现不同组容器的隔离。

# 创建自定义桥接网络
docker network create mybridge

# 启动容器连接到自定义网络
docker run -d --name container3 --network mybridge nginx
docker run -d --name container4 --network mybridge nginx

# 在container3中通过容器名ping container4
docker exec -it container3 ping container4

7.3 主机网络(host)

使用host网络模式的容器不会获得独立的网络栈,而是直接使用宿主机的网络,容器的端口直接使用宿主机的端口,无需进行端口映射。

# 启动容器使用host网络
docker run -d --name mynginx --network host nginx

此时,访问宿主机的80端口即可访问容器内的Nginx服务,无需使用-p选项进行端口映射。

host网络模式的局限性:

在Windows和macOS上,由于Docker运行在虚拟机中,host网络模式的行为与Linux有所不同。
容器与宿主机共享网络栈,可能导致端口冲突。

7.4 无网络模式(none)

使用none网络模式的容器没有网络接口,无法进行网络通信,适用于不需要网络的场景。

docker run -d --name mycontainer --network none busybox

7.5 容器网络(container)

container网络模式允许一个容器共享另一个容器的网络栈,两个容器拥有相同的IP地址和端口空间,可以通过localhost相互通信。

# 启动第一个容器
docker run -d --name containerA nginx

# 启动第二个容器,共享containerA的网络
docker run -it --name containerB --network container:containerA busybox

在containerB中,可以通过localhost:80访问containerA中的Nginx服务。

7.6 端口映射

端口映射用于将容器内的端口映射到宿主机的端口,使外部网络可以访问容器内的服务。

7.6.1 基本端口映射
# 将容器的80端口映射到宿主机的8080端口
docker run -d --name mynginx -p 8080:80 nginx

此时,访问宿主机的8080端口(如http://localhost:8080)即可访问容器内的Nginx服务。

7.6.2 映射到指定IP
# 将容器的80端口映射到宿主机的127.0.0.1:8080
docker run -d --name mynginx -p 127.0.0.1:8080:80 nginx

此时,只有宿主机本地可以通过127.0.0.1:8080访问服务,外部网络无法访问。

7.6.3 随机端口映射
# 将容器的80端口映射到宿主机的随机端口(32768-65535)
docker run -d --name mynginx -p 80 nginx

# 查看映射的端口
docker port mynginx

7.7 容器连接外部网络

默认情况下,容器可以访问外部网络,这是通过宿主机的NAT(网络地址转换)实现的。如果需要限制容器的网络访问,可以通过自定义网络和防火墙规则实现。

7.8 跨主机网络(简介)

在实际生产环境中,通常需要多个主机上的容器之间进行通信。Docker提供了多种跨主机网络解决方案,如:

Overlay网络:Docker Swarm内置的跨主机网络解决方案。
Macvlan网络:允许为容器分配MAC地址,使其看起来像物理设备。
第三方网络插件:如Calico、Flannel、Weave等,适用于Kubernetes等容器编排平台。

八、Docker Compose:多容器应用编排

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件配置应用程序的所有服务,然后使用一个命令创建并启动所有服务。

8.1 安装Docker Compose

8.1.1 在Linux上安装
# 下载最新版本的Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容