Docker数据管理,端口映射与容器互联

news2025/3/12 10:47:05

1.Docker 数据管理

在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。

容器中的管理数据主要有两种方式:

数据卷(Data Volumns):容器内数据直接映射到本地主机环境;

数据卷容器(Data Volume Containers):使用特定容器维护数据卷。

本章将首先介绍如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。接下来,介绍如何使用数据卷容器在容器和主机、、容器和容器之间共享数据,并实现数据的备份和恢复。

1.1 数据卷

数据卷(Data Volumes) 是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux 中的mount行为。

数据卷可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;
  • 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
  • 对数据卷的更新不会影响镜像,解耦开应用和数据;
  • 卷会一直存在,直到没有容器使用,可以安全地卸载它。

1. 创建数据卷

Docker提供了volume子命令来管理数据卷,如下命令可以快速在本地创建一个数据卷:

[root@open-Euler2 ~]# docker volume create -d local test
test

此时,查看/var/lib/docker/volumes 路径下,会发现所创建的数据卷位置:

[root@open-Euler2 ~]# ll /var/lib/docker/volumes/
drwx-----x 3 root root   4096 Mar 10 14:55 test

挂载数据卷到容器

当你启动一个容器时,可以使用 -v 或 --mount 标志将数据卷挂载到容器中。

使用 -v 或 --volume 标志:

docker run -d -P --name my-nginx -v test:/usr/share/nginx/html nginx

在这个例子中,test数据卷被挂载到容器 my-nginx 的 /usr/share/nginx/html 目录下。

使用 --mount 标志:

docker run -d -P --name my-nginx --mount source=test,target=/usr/share/nginx/html nginx

访问数据卷

一旦数据卷被挂载到容器中,你可以通过访问容器内的指定路径来读写数据卷中的数据。

例如,在上面的例子中,你可以通过访问容器内 /usr/share/nginx/html 目录来读写 test 数据卷。

除了 create 子命令外, docker volume 还支持 inspect (查看详细信息)、 ls (列出已有数据卷)、 prune (清理无用数据卷)、 rm (删除数据卷)等,大家可以自行实践。

2.绑定数据卷

除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。

在用docker [container] run命令的时候,可以使用 -mount 选项来使用数据卷。

- mount 选项支持三种类型的数据卷,包括:

  • volume :普通数据卷,映射到主机/var/lib/docker/volumes 路径下,指定卷名即可;
  • bind:绑定数据卷,映射到主机指定路径下,需要指定绝对路径;
  • tmpfs :临时数据卷,只存在于内存中。

不过建议使用-v选项来实现

下面使用 nginx:latest 镜像创建一个Web容器,并创建一个数据卷挂载到容器的/opt/webapp目录:

[root@open-Euler2 webapp]# docker run -itd -P --name web1 -v /webapp/:/opt/webapp nginx:latest
[root@open-Euler2 webapp]# docker exec -it web1 bash
root@dab5895f9464:/# ls /opt/webapp/
index.html

这个功能在进行应用测试的时候十分方便,比如用户可以放置一些程序或数据到本地目录中实时进行更新,然后在容器内运行和使用。

另外,本地目录的路径必须是绝对路径,容器内路径可以为相对路径。 如果容器内目录不存在, Docker会自动创建。

Docker 挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读:

docker run -d -P --name web2 -v /webapp:/opt/webapp:ro nginx:latest

加了 :ro 之后,容器内对所挂载数据卷内的数据就无法修改了。

1.2 数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。 数据卷容器也是一个容器,但是它的目的是 专门提供数据卷给其他容器挂载。

首先,创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到 /dbdata并查看/dbdata目录::

然后,可以在其他容器中使用--volumes-from来挂载 dbdata 容器中的数据卷,例如创建 db1 和 db2 两个容器,并从dbdata容器挂载数据卷:

[root@open-Euler2 webapp]# docker run -it --volumes-from dbdata --name db1 ubuntu
[root@open-Euler2 webapp]# docker run -it --volumes-from dbdata --name db2 ubuntu

此时,容器 db1 和db2 都挂载同一个数据卷到相同的/dbdata 目录,三个容器任何一方在该目录下的写入,其他容器都可以看到。

例如,在dbdata容器中创建一个test文件:

[root@open-Euler2 webapp]# docker start dbdata
dbdata
[root@open-Euler2 webapp]# docker exec -it dbdata bash
root@8f509839eca1:/# cd /dbdata
root@8f509839eca1:/dbdata# touch test
root@8f509839eca1:/dbdata# ls
test

在db1容器内查看它:

[root@open-Euler2 webapp]# docker start db1
db1
[root@open-Euler2 webapp]# docker exec -it db1 bash
root@b8443834a4a7:/# ls /dbdata
test

可以多次使用--volumes-from参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷:

 docker run -d --name db3 --volumes-from dbl ubuntu

注意:使用--volumns-from参数所挂载数据卷的容器自身并不需要保持在运行状态

如果删除了挂载的容器(包括dbdata、 db工和 db2 ),数据卷并不会被自动删除。 如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。

1.3 利用数据卷容器来迁移数据

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

1. 备份

使用下面的命令来备份 dbdata 数据卷容器内的数据卷:

[root@open-Euler2 ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/
/dbdata/test
[root@open-Euler2 ~]# ll
total 76784
-rw-------. 1 root root        884 Jan 10 11:11 anaconda-ks.cfg
-rw-r--r--  1 root root      10240 Mar 10 16:58 backup.tar
drwxrwxr-x  2 1000 docker     4096 Feb 26 18:43 docker
-rw-r--r--  1 root root   78603326 Feb 26 22:56 docker-28.0.1.tgz

这个命令稍微有点复杂,具体分析下。

首先利用ubuntu镜像创建了一个容器worker。使用--volumes-from dbdata参数来让worker容器挂载 dbdata容器的数据卷(即dbdata数据卷);使用-v $ (pwd) : /backup 参数来挂载本地的当前目录到worker容器的/backup 目录。

worker容器启动后,使用 tar cvf /backup/backup.tar /dbdata 命令将/dbdata 下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。

2. 恢复

如果要恢复数据到一个容器,可以按照下面的操作。

首先创建一个带有数据卷的容器dbdata2:

[root@open-Euler2 ~]# docker run -itd -v /dbdata --name dbdata2 ubuntu bash
b5c28bbf44911bed8f49e64c19037975b710b908c84b91479e8223ae56beee8e

然后创建另一个新的容器,挂载dbdata2 的容器,并使用untar解压备份文件到所挂载的容器卷中:


[root@open-Euler2 ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
dbdata/
dbdata/test

1.4 本章小结

数据是最宝贵的资源。 Docker 在设计上考虑到了这点,数据卷机制为数据管理提供了方便的操作支持。 本章介绍了通过数据卷和数据卷容器对容器内的数据进行共享、备份和恢复等操作,通过这些机制,即使容器在运行中出现故障,用户也不必担心数据发生丢失,只需 要快速地重新创建容器即可。

在生产环境中,推荐在使用数据卷或数据卷容器之外,定期将主机的本地数据进行备份,或者使用支持容错的存储系统,包括RAID 或分布式文件系统,如 Ceph、 GPFS、 HDFS 等。

另外,有些时候不希望将数据保存在宿主机或容器中,还可以使用tmpfs类型的数据卷,其中数据只存在于内存中,容器退出后自动删除。

2.端口映射与容器互联

在实践中,经常会碰到需要多个服务组件容器共同协作的情况,这往往需要多个容器之间能够互相访问到对方的服务。

Docker 除了通过网络访间外, 还提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到本地宿主主机;另一个是互联机制实现多个容器间通过容器名来快速访问。 本章将分别讲解这两个很实用的功能。

2.1 端口映射实现容器访问

1.从外部访问容器应用

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。 当使用-P(大写的)标记时,Docker随机映射一个的宿主机端口到容器内部正在监听的网络端口上。

[root@open-Euler2 ~]# docker run -d -P nginx
89a9b4b7827742a901d124bf7af09a4686fae1315a91e8fa05a0a911813b03a9
[root@open-Euler2 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
89a9b4b78277   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 3 seconds   0.0.0.0:32769->80/tcp, :::32769->80/tcp   crazy_northcutt

此时, 可以使用docker ps看到, 本地主机的32769被映射到了容器的80端口。

访间宿主主机的端口即可访问容器内web应用提供的界面。

同样, 可以通过docker logs命令来查看应用的信息:

-p (小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。

支持的格式有:

  • HostPort:ContainerPort
  • IP:HostPort:ContainerPort  
  • IP::ContainerPort  

2.映射到所有接口地址

使用 HostPort:ContainerPort 格式本地的80端口映射到容器的80端口,可以执行如下命令:

[root@open-Euler2 ~]# docker run -d -p 80:80 nginx

此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口。例如:

[root@open-Euler2 ~]# docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

3.映射到指定地址的指定端口

可以使用 IP:HostPort:ContainerPort  格式指定映射使用一个特定地址和特定端口。例如:

[root@open-Euler2 ~]# docker run -d -p 192.168.121.151:80:80 nginx
955050b980528f98312c296388d43cc2e2a30e3f84403f758157b06c81a47d25

4.映射到指定地址的任意端口

使用 IP::ContainerPort 绑定localhost的任意端口到容器的80端口,本地主机会自动分配一个端口: 

[root@open-Euler2 ~]# docker run -d -p 127.0.0.1::80 nginx
478a6d0bf890ac189721a50617b1e0d6d6343127a405bda3f1898bb2b473c030

还可以使用udp标记来指定udp端口:

[root@open-Euler2 ~]# docker run -d -p 127.0.0.1:80:80/udp nginx
5572bc9e356da03a0992b01302d61c4c3ee94d9ec3596b34f305eb5e24795c1d

查看容器:

[root@open-Euler2 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                          NAMES
5572bc9e356d   nginx     "/docker-entrypoint.…"   15 seconds ago       Up 14 seconds       80/tcp, 127.0.0.1:80->80/udp   peaceful_maxwell
478a6d0bf890   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   127.0.0.1:32768->80/tcp        cool_moore
955050b98052   nginx     "/docker-entrypoint.…"   41 minutes ago       Up 41 minutes       192.168.121.151:80->80/tcp     inspiring_cori

5.查看映射端口配置

使用docker port来查看当前映射的端口配置,也可以查看到绑定的地址:

[root@open-Euler2 ~]# docker port 5572bc9e356d
80/udp -> 127.0.0.1:80

提示:容器有自己的内部网络和IP地址,使用docker [container] inspect+容器ID可以获取容器的具体信息。

2.2 互联机制实现便捷互访

容器的互联(linking)是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。

1.自定义容器命名

连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。虽然当创建容器的时候,系统默认会分配一个名字,但自定义命名容器有两个好处:

  • 自定义的命名,比较好记,比如一个Web应用容器我们可以给它起名叫web, 一目了然;
  • 当要连接其他容器时候(即便重启),也可以使用容器名而不用改变,比如连接web容器到db容器。

使用--name标记可以为容器自定义命名:

[root@open-Euler2 ~]# docker run -itd --name web nginx bash

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

[root@open-Euler2 ~]# docker ps -l
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
2d8f7dc9ddfa   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 7 seconds   80/tcp    web

也可以使用docker [container] inspect来查看容器的名字:

[root@open-Euler2 ~]# docker inspect -f "{{ .Name }}" web
/web

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

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

2. 容器互联

使用--link参数可以让容器之间安全地进行交互。下面先创建一个新的数据库容器:

MYSQL_ROOT_PASSWORD=123456 设置了 MySQL 容器的 root 用户密码为 “123456”,而 --restart=always 确保了容器在 Docker 启动时始终自动重启。

创建数据库:

删除之前创建的web容器:

docker rm -f web

然后基于Wordpress镜像创建一个新的web容器,并将它连接到db容器:

docker run --name web -p 80:80 --link db:db -d --restart=always wordpress

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

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

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

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

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

更新/etc/hosts文件:

更新环境变量:

使用env命令来查看web容器的环境变量:

wordpress应用搭建:

这里要访问的是web容器的服务映射到宿主机的IP+端口

进入安装界面:

填写数据库信息:

填写站点信息

安装成功

进入wordpress主页

2.3 本章小结

毫无疑问,容器服务的访间是很关键的一个用途。本章通过具体案例讲解了 Docker容器服务访问的两大基本操作, 包括基础的容器端口映射机制和容器互联机制。 同时,Docker 目前可以成熟支持Linux系统自带的网络服务和功能,这既可以利用现有成熟的技术提供稳定支持,又可以实现快速的高性能转发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署前后端项目

部署项目 liunx 软件安装 软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 建议nginx、MySQL、Redis等等使用docker安装,会很便捷,这里只演示JDK、ngxin手动的安装 安装JDK 上述我…

1256:献给阿尔吉侬的花束--BFS多组输入--memset

1256:献给阿尔吉侬的花束--BFS多组输入--memset 题目 解析代码【结构体】用book标记且计步数的代码[非结构体法] 题目 解析 标准的BFS题目,在多组输入中要做的就是先找到这一组的起点和终点,然后将其传给bfs,在多组输入中最易忘记…

【JavaEE】SpringBoot快速上手,探秘 Spring Boot,搭建 Java 项目的智慧脚手架

1.Spring Boot介绍 在学习SpringBoot之前, 我们先来认识⼀下Spring ,我们看下Spring官⽅的介绍 可以看到,Spring让Java程序更加快速, 简单和安全。 Spring对于速度、简单性和⽣产⼒的关注使其成为世界上最流⾏的Java框架。 Spring官⽅提供了很多开源的…

【C】初阶数据结构9 -- 直接插入排序

前面我们学习了数据结构二叉树,接下来我们将开启一个新的章节,那就是在日常生活中经常会用到的排序算法。 所谓排序算法就是给你一堆数据,让你从小到大(或从大到小)的将这些数据排成一个有序的序列(这些数据…

Lottie与LottieFiles:快速为前端Web开发注入精美动画的利器

目录 Lottie与LottieFiles:快速为前端Web开发注入精美动画的利器 一、Lottie是什么?从GIF到JSON的动画技术演进 1、传统动画臃肿的Gif 2、Lottie的突破性创新 二、Lottie的核心组件解析(Lottie的技术架构) 1、Lottie核心三要…

音乐API

https://neteasecloudmusicapi.vercel.app/docs/#/https://neteasecloudmusicapi.vercel.app/docs/#/ 使用实例 所有榜单内容摘要 说明 : 调用此接口,可获取所有榜单内容摘要 接口地址 : /toplist/detail 调用例子 : /toplist/detail 获取歌单所有歌曲 说明 : 由于网易云…

从零搭建微服务项目Pro(第3-1章——本地/OSS图片文件存取)

前言: 在小型demo项目中,一般将图片音频等字节流文件存放本地数据库,但企业级项目中,由于数据量容量有限,需要借助OSS来管理大规模文件。 OSS(对象存储服务,Object Storage Service&#xff0…

游戏引擎学习第147天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说,我们通过隐式计算来解决问题,而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分,并计划继续处理音量问题。不过,实际上我们现在不需要继续处理…

Spring boot启动原理及相关组件

优质博文:IT-BLOG-CN 一、Spring Boot应用启动 一个Spring Boot应用的启动通常如下: SpringBootApplication Slf4j public class ApplicationMain {public static void main(String[] args) {ConfigurableApplicationContext ctx SpringApplication.…

【Linux】信号处理以及补充知识

目录 一、信号被处理的时机: 1、理解: 2、内核态与用户态: 1、概念: 2、重谈地址空间: 3、处理时机: 补充知识: 1、sigaction: 2、函数重入: 3、volatile&…

微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由

之前学习了Nacos,用于发现并注册、管理项目里所有的微服务,而OpenFeign简化微服务之间的通信,而为了使得前端可以使用微服务项目里的每一个微服务的接口,就应该将所有微服务的接口管理起来方便前端调用,所以有了网关。…

comctl32!ListView_OnSetItem函数分析LISTSUBITEM结构中的image表示图标位置

第一部分: BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi) { LISTSUBITEM lsi; BOOL fChanged FALSE; int i; int idpa; HDPA hdpa; if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)) { …

数据结构——多项式问题(顺序存储结构or链式存储结构)

补充&#xff1a;malloc函数&#xff1a; malloc 函数是 C 语言标准库中的一个重要函数&#xff0c;位于 <stdlib.h> 头文件中&#xff0c;主要用于在程序运行时动态分配内存。以下将详细介绍其用法。 前面的返回值指针可以自己定义&#xff0c;如 &#xff08;int*&am…

记录小白使用 Cursor 开发第一个微信小程序(一):注册账号及下载工具(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;一&#xff09;&#xff1a;注册账号及下载工具&#xff08;250308&#xff09;一、微信小程序注册摘要1.1 注册流程要点 二、小程序发布流程三、下载工具 记录小白使用 Cursor 开发第一个微信小程序&#xff08…

vue2项目修改浏览器显示的网页图标

1.准备一个新的图标文件&#xff0c;通常是. ico格式&#xff0c;也可以是. Png、. Svg等格式 2.将新的图标文件(例如&#xff1a;faviconAt.png)放入项目的public文件夹中。如下图 public文件夹中的所有文件都会在构建时原样复制到最终的输出目录(通常是dist) 3. 修改vue项目…

【网络安全工程】任务10:三层交换机配置

CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog三层交换机是指在OSI&#xff08;开放系统互连&#xff09;模型中的第三层网络层提供路由功能的交换机。它不仅具备二层交换机的交换功能&#xff0c;还能实现路由功能&#xff0c;提供更为灵活的网…

侯捷 C++ 课程学习笔记:C++内存管理机制

内存管理从平地到万丈高楼 内存管理入门&#xff08;Memory Management 101&#xff09; 需要具有动态分配并使用memory&#xff08;存储&#xff08;器&#xff09;&#xff0c;&#xff08;计算机的&#xff09;内存&#xff09;&#xff0c;使用过C标准库的容器&#xff0…

JVM常用概念之本地内存跟踪

问题 Java应用启动或者运行过程中报“内存不足&#xff01;”&#xff0c;我们该怎么办? 基础知识 对于一个在本地机器运行的JVM应用而言&#xff0c;需要足够的内存来存储机器代码、堆元数据、类元数据、内存分析等数据结构&#xff0c;来保证JVM应用的成功启动以及未来平…

【鸿蒙开发】Hi3861学习笔记- 软件定时器示例

00. 目录 文章目录 00. 目录01. 定时器概述02. 定时器API03. 定时器常用API3.1 osTimerNew3.2 osTimerDelete3.3 osTimerStart3.4 osTimerStop 04. 程序示例05. 附录 01. 定时器概述 软件定时器&#xff0c;是基于系统Tick时钟中断且由软件来模拟的定时器&#xff0c;当经过设…

在Html5中仿Matlab自定义色带生成实践

目录 前言 一、RGB的相关知识 1、RGB的基本原理 2、RGB的数值表示 3、应用场景 二、ColorMap生成实战 1、外部库介绍 2、相关API 3、实例生成 三、总结 前言 在现代网页开发与数据可视化领域&#xff0c;色彩的表现力对于信息传达和视觉体验起着至关重要的作用。色带&…