docker存储与通信

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

一、数据管理

      用户在使用docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的分享,这必然涉及容器的数据管理。 容器数据的管理主要两种方式: 数据卷 数据卷容器

 1、数据卷

(1)数据卷的概念

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

1>数据卷可以在容器之间共享和重用。

2>对数据卷的修改会立马生效。

3>对数据卷的更新,不会影响镜像。

4>卷会一直存在,直到没有容器使用。

5>数据卷的使用,类似于Linux 下对目录或文件进行mount 操作

创建数据卷 docker run 在使用时,后面可加 -v 标记,可以在容器内创建一个数据卷。多次使用-v 标记可以创建多个数据卷。

[root@localhost ~]# docker run -it -p 5000:80 --name web -v /html:/usr/share/nginx/html nginx:1 /bin/bash

//-it 交互式并获得一个tty 终端,-p 将宿主机5000 端口映射给容器的80 端口,--name 起个名字叫web, -v 创建一个数据卷 把宿主机的/html 目录(若不存在会自动建立)挂载到容器的/usr/share/nginx/html(此容器中nginx 的默认发布路径为此目录),使用nginx:1 这个镜像运行一个容器,执行/bin/bash 命令获得一个shell。

root@844ff80d3334:/#

root@844ff80d3334:/ ctrl+p ctrl+q # [root@localhost ~]#

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                  NAMES

844ff80d3334        nginx:1             "/bin/bash"         About a minute ago   Up About a minute   0.0.0.0:5000->80/tcp   web

[root@localhost ~]# ls /html/

[root@localhost ~]# echo "123123" > /html/index.html

浏览器访问宿主机5000 端口查看

QQ%E6%88%AA%E5%9B%BE20170504163536.png?v

[root@localhost ~]# echo "123" > /html/index.html   //只要修改宿主机/html 里的内容,容器里的/usr/share/nginx/html 跟着变

QQ%E6%88%AA%E5%9B%BE20170504163643.png?v

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

[root@localhost ~]# docker run -it -p5001:80 --name we1 -v /html1:/usr/share/nginx/html:ro nginx:1 /bin/bash

root@4f7bdd156b4e:/# /etc/init.d/nginx start

root@4f7bdd156b4e:/#  ctrl+p ctrl+q [root@localhost ~]#

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES

4f7bdd156b4e        nginx:1             "/bin/bash"         16 seconds ago      Up 14 seconds       0.0.0.0:5001->80/tcp   we1

a2752d8fe0fd        nginx:1             "/bin/bash"         13 minutes ago      Up 13 minutes       0.0.0.0:5000->80/tcp   we

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

2、数据卷容器

(1)数据卷容器概述 用户需要在容器之间共享一些持续性更新的数据,这时,可以使用数据卷容器。数据容器也是一个普通的容器。
(2)创建数据卷容器

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

nginx               1                   2f24e0f40c85        37 minutes ago      181.2 MB

centos              1                   385c6554f48e        3 days ago          196.7 MB

[root@localhost ~]# docker run -it -v /dbdata --name dbdata centos:1 /bin/bash  //创建一个数据卷容器,并在其中创建一个数据卷挂载到/dbdata

[root@9ecb0e48e121 /]# exit

[root@localhost ~]# docker run -it --volumes-from dbdata --name test1 centos:1 /bin/bash

 //--volumes-from 来挂载dbdata 容器中的数据卷,创建test1 和test2 两个容器,查看数据是否同步

[root@94672c86ad58 /]# ls

anaconda-post.log  dbdata  etc   lib    lost+found  mnt  proc  run   srv  tmp  var

bin                dev     home  lib64  media       opt  root  sbin  sys  usr

[root@94672c86ad58 /]#

[root@94672c86ad58 /]# ls dbdata/

[root@94672c86ad58 /]# touch /dbdata/aaa

[root@94672c86ad58 /]# ls dbdata/

aaa

[root@94672c86ad58 /]# exit

exit

[root@localhost ~]# docker run -it --volumes-from dbdata --name test2 centos:1 /bin/bash

[root@c1bf115c4b23 /]# ls

anaconda-post.log  dbdata  etc   lib    lost+found  mnt  proc  run   srv  tmp  var

bin                dev     home  lib64  media       opt  root  sbin  sys  usr

[root@c1bf115c4b23 /]# ls dbdata/

aaa   //测试文件还在

[root@c1bf115c4b23 /]# exit

Exit

 3、利用数据卷容器迁移数据

(1)备份

[root@localhost ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:1 tar cvf /backup/backup.tar /dbdata

//在centos:1 镜像上创建了一个叫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

 运行结果:

tar: Removing leading `/' from member names

/dbdata/

/dbdata/aaa

(2)恢复

[root@localhost ~]# docker run -it -v /dbdata --name dbdata2 centos:1 /bin/bash   // 创建一个带有数据卷的容器:dbdata2  

[root@2a17825b9823 /]# exit

[root@localhost ~]# docker ps -l

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

2a17825b9823        centos:1            "/bin/bash"         37 seconds ago      Exited (0) 12 seconds ago                       dbdata2

[root@localhost ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup centos:1 tar xvf /backup/backup.tar    //创建另一个新的容器,挂载dbdata2 的容器,并使用tar xvf 解压备份文件到所挂载的容器卷即可

dbdata/

dbdata/aaa

二、docker 的网络基础配置

1.端口映射实现访问容器

从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器的外部是无法通过网路来访问容器内部开的应用和服务的。可以通过 -P 或 -p 参数来指定端口映射

  1>大写P

-P:docker 会随机映射一个文件/proc/sys/net/ipv4/ip_local_port_range 中定义的端口范围作

为一个本地端口,随后将这个本地端口映射到容器内部开放的网络端口

[root@localhost ~]# docker run -d -P webapp:1 python app.py

9276997c8e3e3a2bee9cb48737bbfa27faa4577d811e2e3f0e5fddd590121a46

[root@localhost ~]# docker ps -l

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES

9276997c8e3e        webapp:1            "python app.py"     10 seconds ago      Up 9 seconds        0.0.0.0:32768->5000/tcp   focused_torvalds

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range

32768 61000

2>小写p

 -p :指定要映射的端口,并且在一个指定端口上只可以绑定一个容器

格式:

ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

ip:主机端口:容器端口 | ip::容器端口 | 主机端口:容器端口

 映射所有接口地址

[root@localhost ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

nginx                       1                   2f24e0f40c85        About an hour ago   181.2 MB

centos                      1                   385c6554f48e        3 days ago          196.7 MB

docker.io/training/webapp   latest              6fae60ef3446        21 months ago       348.7 MB

webapp                      1                   6fae60ef3446        21 months ago       348.7 MB

[root@localhost ~]# docker run -d -p 5000:5000 -p 3000:80 webapp:1 python app.py

7181e66382876d61601bc8c3dc635db09b1c63868c8d2d0ed372b455901b5db2

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES

765ed2301854        webapp:1            "python app.py"     5 seconds ago       Up 3 seconds        0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp   evil_almeida

9276997c8e3e        webapp:1            "python app.py"     7 minutes ago       Up 7 minutes        0.0.0.0:32768->5000/tcp                        focused_torvalds

 

映射到指定地址的指定端口,可以使用 ip:hostPort:containerPort

[root@localhost ~]# docker run -d -p 127.0.0.1:6000:5000 webapp:1 python app.py

bc861a62448423350151b8ef7ec31a18925d7d92938de4769135a349a16ffa0e

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                                          NAMES

bc861a624484        webapp:1            "python app.py"     5 seconds ago        Up 4 seconds        127.0.0.1:6000->5000/tcp                       tender_heyrovsky

765ed2301854        webapp:1            "python app.py"     About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp   evil_almeida

9276997c8e3e        webapp:1            "python app.py"     9 minutes ago        Up 9 minutes        0.0.0.0:32768->5000/tcp                        focused_torvalds

[root@localhost ~]# curl http://127.0.0.1:6000

Hello world![root@localhost ~]#

映射到指定地址的任意端口,使用ip::containerPort 格式,在本地主机会自动分配一个端口

[root@localhost ~]# docker run -d -p 127.0.0.1::5000 webapp:1 python app.py

3b2b1c871b29673ae1eb702d45b8f6085656f6196cb6d80c11250a58da646d0a

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES

3b2b1c871b29        webapp:1            "python app.py"     7 seconds ago       Up 5 seconds        127.0.0.1:32769->5000/tcp                      silly_meitner

bc861a624484        webapp:1            "python app.py"     2 minutes ago       Up 2 minutes        127.0.0.1:6000->5000/tcp                       tender_heyrovsky

765ed2301854        webapp:1            "python app.py"     3 minutes ago       Up 3 minutes        0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp   evil_almeida

9276997c8e3e        webapp:1            "python app.py"     11 minutes ago      Up 11 minutes       0.0.0.0:32768->5000/tcp                        focused_torvalds

2.容器互联实现容器间通信

      容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息

 

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

[root@localhost ~]# cat mysql5.tar |docker import - mysql:1

sha256:8c1652f0a50af3ac76b630185cc2fb6cc525ec8d47fe13287573e9623d5a899a

 [root@localhost ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

mysql                       1                   8c1652f0a50a        2 minutes ago       375 MB

nginx                       1                   2f24e0f40c85        About an hour ago   181.2 MB

centos                      1                   385c6554f48e        3 days ago          196.7 MB

docker.io/training/webapp   latest              6fae60ef3446        21 months ago       348.7 MB

webapp                      1                   6fae60ef3446        21 months ago       348.7 MB

[root@localhost ~]# docker run -d -it --name db mysql:1 /bin/bash

8f96883620812e2abdddc5e46bec48449924557dfa10e974b7ca0ee2ef89ce7c

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES

8f9688362081        mysql:1             "/bin/bash"         27 seconds ago      Up 26 seconds                                                      db

[root@localhost ~]# docker run -d -P --name wec --link db:db webapp:1 python app.py

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

223ba1ec1b986d14cb9394a62ac839705aebab6a8d7dca33b8e3ad7bf549c119

[root@localhost ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES

223ba1ec1b98        webapp:1            "python app.py"     10 seconds ago      Up 8 seconds        0.0.0.0:32770->5000/tcp                        wec

8f9688362081        mysql:1             "/bin/bash"         4 minutes ago       Up 4 minutes                                                       db

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






      本文转自Mr_chen  51CTO博客,原文链接:http://blog.51cto.com/metis/1945274,如需转载请自行联系原作者




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 Docker 容器
Docker安装默认存储路径修改与镜像恢复
Docker安装默认存储路径修改与镜像恢复
232 0
|
7月前
|
存储 缓存 应用服务中间件
Docker 镜像解密:分层存储与镜像构建原理
Docker 镜像解密:分层存储与镜像构建原理
226 0
|
7月前
|
存储 持续交付 Docker
Docker 镜像解密:分层存储与构建原理多角度解析
Docker 镜像解密:分层存储与构建原理多角度解析
124 0
|
5月前
|
存储 Kubernetes Linux
解决Linux中/var/lib/docker/磁盘空间过大及k8s存储卷磁盘空间使用率过高的问题
解决Linux中/var/lib/docker/磁盘空间过大及k8s存储卷磁盘空间使用率过高的问题
186 0
|
7月前
|
Cloud Native 网络安全 数据安全/隐私保护
【云原生】Docker网络Overlay搭建Consul实现跨主机通信
【云原生】Docker网络Overlay搭建Consul实现跨主机通信
193 0
|
6月前
|
存储 传感器 物联网
如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信
如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信
324 0
如何在Docker中配置Mosquitto MQTT代理,以便在容器化环境中运行和管理MQTT通信
|
7月前
|
存储 边缘计算 数据管理
Docker 存储驱动解析:选择最适合你的存储方案,优化容器化部署性能和数据管理
Docker 存储驱动解析:选择最适合你的存储方案,优化容器化部署性能和数据管理
165 0
|
6天前
|
存储 缓存 运维
【Docker 专栏】Docker 镜像的分层存储与缓存机制
【5月更文挑战第8天】Docker 镜像采用分层存储,减少空间占用并提升构建效率。每个镜像由多个层组成,共享基础层(如 Ubuntu)和应用层。缓存机制加速构建和运行,通过检查已有层来避免重复操作。有效管理缓存,如清理无用缓存和控制大小,可优化性能。分层和缓存带来资源高效利用、快速构建和灵活管理,但也面临缓存失效和层管理挑战。理解这一机制对开发者和运维至关重要。
【Docker 专栏】Docker 镜像的分层存储与缓存机制
|
7天前
|
存储 数据管理 数据安全/隐私保护
【Docker专栏】Docker存储卷管理:数据持久化的关键
【5月更文挑战第7天】本文探讨了Docker容器中数据持久化的关键——存储卷,包括其独立于容器生命周期的特性、数据共享与迁移能力。Docker提供默认、命名、数据卷容器和挂载宿主机目录四种卷类型。创建与管理涉及`docker volume create`、`ls`、`run`等命令。最佳实践建议使用命名存储卷,定期备份,避免存储敏感数据,并清理未使用卷。了解和有效管理存储卷能提升容器灵活性和数据管理效率。
【Docker专栏】Docker存储卷管理:数据持久化的关键
|
9月前
|
自然语言处理 数据可视化 关系型数据库
SolidUI社区-独立部署 和 Docker 通信分析
SolidUI社区-独立部署 和 Docker 通信分析
66 0