关键词:
一、数据管理
用户在使用docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的分享,这必然涉及容器的数据管理。 容器数据的管理主要两种方式: 数据卷 数据卷容器
1、数据卷
(1)数据卷的概念
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
1>数据卷可以在容器之间共享和重用。
2>对数据卷的修改会立马生效。
3>对数据卷的更新,不会影响镜像。
4>卷会一直存在,直到没有容器使用。
5>数据卷的使用,类似于Linux 下对目录或文件进行mount 操作
创建数据卷 docker run 在使用时,后面可加 -v 标记,可以在容器内创建一个数据卷。多次使用-v 标记可以创建多个数据卷。
[[email protected] ~]# 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。
[email protected]:/ ctrl+p ctrl+q # [[email protected] ~]#
[[email protected] ~]# 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
[[email protected] ~]# ls /html/
[[email protected] ~]# echo "123123" > /html/index.html
浏览器访问宿主机5000 端口查看
[[email protected] ~]# echo "123" > /html/index.html //只要修改宿主机/html 里的内容,容器里的/usr/share/nginx/html 跟着变
docker 挂载数据卷的默认权限是读写(rw),用户也可以通过,ro 指定为只读:
[[email protected] ~]# docker run -it -p5001:80 --name we1 -v /html1:/usr/share/nginx/html:ro nginx:1 /bin/bash
[email protected]:/# /etc/init.d/nginx start
[email protected]:/# ctrl+p ctrl+q [[email protected] ~]#
[[email protected] ~]# 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)创建数据卷容器
[[email protected] ~]# 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
[[email protected] ~]# docker run -it -v /dbdata --name dbdata centos:1 /bin/bash //创建一个数据卷容器,并在其中创建一个数据卷挂载到/dbdata
[[email protected] /]# exit
[[email protected] ~]# docker run -it --volumes-from dbdata --name test1 centos:1 /bin/bash
//--volumes-from 来挂载dbdata 容器中的数据卷,创建test1 和test2 两个容器,查看数据是否同步
[[email protected] /]# 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
[[email protected] /]#
[[email protected] /]# ls dbdata/
[[email protected] /]# touch /dbdata/aaa
[[email protected] /]# ls dbdata/
aaa
[[email protected] /]# exit
exit
[[email protected] ~]# docker run -it --volumes-from dbdata --name test2 centos:1 /bin/bash
[[email protected] /]# 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
[[email protected] /]# ls dbdata/
aaa //测试文件还在
[[email protected] /]# exit
Exit
3、利用数据卷容器迁移数据
(1)备份
[[email protected] ~]# 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)恢复
[[email protected] ~]# docker run -it -v /dbdata --name dbdata2 centos:1 /bin/bash // 创建一个带有数据卷的容器:dbdata2
[[email protected] /]# exit
[[email protected] ~]# 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
[[email protected] ~]# 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 中定义的端口范围作
为一个本地端口,随后将这个本地端口映射到容器内部开放的网络端口
[[email protected] ~]# docker run -d -P webapp:1 python app.py
9276997c8e3e3a2bee9cb48737bbfa27faa4577d811e2e3f0e5fddd590121a46
[[email protected] ~]# 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
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
2>小写p
-p :指定要映射的端口,并且在一个指定端口上只可以绑定一个容器
格式:
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
ip:主机端口:容器端口 | ip::容器端口 | 主机端口:容器端口
映射所有接口地址
[[email protected] ~]# 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
[[email protected] ~]# docker run -d -p 5000:5000 -p 3000:80 webapp:1 python app.py
7181e66382876d61601bc8c3dc635db09b1c63868c8d2d0ed372b455901b5db2
[[email protected] ~]# 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
[[email protected] ~]# docker run -d -p 127.0.0.1:6000:5000 webapp:1 python app.py
bc861a62448423350151b8ef7ec31a18925d7d92938de4769135a349a16ffa0e
[[email protected] ~]# 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
[[email protected] ~]# curl http://127.0.0.1:6000
Hello world![[email protected] ~]#
映射到指定地址的任意端口,使用ip::containerPort 格式,在本地主机会自动分配一个端口
[[email protected] ~]# docker run -d -p 127.0.0.1::5000 webapp:1 python app.py
3b2b1c871b29673ae1eb702d45b8f6085656f6196cb6d80c11250a58da646d0a
[[email protected] ~]# 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 参数可以容器之间安全的进行交互
[[email protected] ~]# cat mysql5.tar |docker import - mysql:1
sha256:8c1652f0a50af3ac76b630185cc2fb6cc525ec8d47fe13287573e9623d5a899a
[[email protected] ~]# 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
[[email protected] ~]# docker run -d -it --name db mysql:1 /bin/bash
8f96883620812e2abdddc5e46bec48449924557dfa10e974b7ca0ee2ef89ce7c
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f9688362081 mysql:1 "/bin/bash" 27 seconds ago Up 26 seconds db
[[email protected] ~]# docker run -d -P --name wec --link db:db webapp:1 python app.py
// --link 参数的格式: --link name:alias , 其中name 是要链接的容器的名称,alias 是这个链接的别名
223ba1ec1b986d14cb9394a62ac839705aebab6a8d7dca33b8e3ad7bf549c119
[[email protected] ~]# 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 容器建立互联关系
本文出自 “Dr小白” 博客,请务必保留此出处http://1213503.blog.51cto.com/1203503/1945274
docker与宿主通信突然断了
参考技术Adocker网卡地址冲突。docker网络模式默认使用的bridge模式,当创建容器时,每个容器会有它自己的虚拟网络接口连接到桥接网络docker0,并获取一个ip。可以通过ifconfig查看docker0的信息,使用route-n命令可以看到。docker网段... 查看详情
docker关于docker网络隔离与通信详解
一、Docker的网络概念docker受一个github上的issue启发,引入了容器网络模型(containernetworkmodel,CNM),容器网络模型主要包含了3个概念network:网络,可以理解为一个Driver,是一个第三方网络栈,包含多种网络模式:单主机网络模... 查看详情
docker数据管理与网络通信(代码片段)
文章目录一、Docker镜像的创建方法1.基于已有镜像创建2.基于本地模板创建3.基于Dockerfile创建二、Docker的数据管理1.数据卷1.1创建数据卷1.2挂载主机目录作为数据卷2.数据卷容器三、Docker网络通信1.Docker网络模式2.Docker自定义网络1.... 查看详情
docker服务端与客户端通信方式
docker的服务端与客户端间可以通过unix、tcp方式进行通信。但默认情况下,服务端只监听本地unix接口/var/run/docker.sock,所以客户端只能在服务端所在的机器上使用该unix接口控制服务端。客户端若想在与服务端进行跨机器通信,就... 查看详情
Maven 与 Mac 上的 Docker 守护程序通信的正确设置是啥?
】Maven与Mac上的Docker守护程序通信的正确设置是啥?【英文标题】:WhatisthepropersetupforMaventocommunicatewithDockerdaemononMac?Maven与Mac上的Docker守护程序通信的正确设置是什么?【发布时间】:2017-02-1123:55:12【问题描述】:我一直在尝试... 查看详情
docker安全问题(client端与daemon的通信安全)(代码片段)
Docker安全及日志管理一.Docker容器与虚拟机的区别1.隔离与共享2.性能与损耗二.Docker存在的安全问题1.Docker自身漏洞2.Docker源码问题3.Docker架构缺陷与安全机制4.Docker安全基线标准三.容器相关的常用安全配置方法四.限制流量流向五.... 查看详情
docker数据管理与网络通信(代码片段)
Docker镜像的创建方法Docker镜像除了是Docker的核心技术之外也是应用发布的标准格式。一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常... 查看详情
在 docker 中使用 Spark JobServer 与 Spark 通信
】在docker中使用SparkJobServer与Spark通信【英文标题】:CommunicationwithSparkusingSparkJobServerindocker【发布时间】:2016-05-0513:39:31【问题描述】:我已经在单一模式下启动了spark集群。start-master.sh-h10.0.0.56start-slave.shspark://10.0.0.56:7077我可以... 查看详情
docker数据管理与网络通信(代码片段)
Docker镜像Docker镜创建三种方法基于已有的镜像创建基于已有镜像创建只要使用dockerscommit命令。实质就是把一个容器里面运行的镜像程序以及该程序的运行环境打包起来生成新的镜像-m说明信息-a作者信息-p生产过程中停止容器的... 查看详情
docker数据管理与网络通信(代码片段)
Docker(六)数据管理在Docker中,为了方便查看容器内产生的数据或者将多个容器中的数据实现共享,就涉及到容器的数据管理操作管理Docker容器中数据主要有两种方法:数据卷<DataVolumes>数据卷容器<DataVolumesContainer>数据... 查看详情
docker网络与存储(代码片段)
Docker的网络和存储1.1Docker的4种网络模式host模式众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PIDNamespace隔离进程,MountNamespace隔离文件系统,NetworkNamespace隔离网络等。一个NetworkNamespace提供了一份独立的网络环境,... 查看详情
在 docker-compose 中通过 tcp 与 Nest.js 微服务通信
】在docker-compose中通过tcp与Nest.js微服务通信【英文标题】:TalkingtoNest.jsmicroserviceovertcpindocker-compose【发布时间】:2020-03-1212:43:30【问题描述】:代码和更多文档可以在这个repo中找到预期行为:在使用和不使用docker运行应用程序... 查看详情
docker网络与存储
第1章docker网络类型1.1docker共有四种网络类型:类型说明None不为容器配置任何网络功能,没有网络 --net=none 只有一个环回地址Container与另一个运行中的容器共享Network Namespace,--net=container:containerIDHost与主机... 查看详情
docker数据管理与网络通信之镜像的创建方法(代码片段)
Docker镜像的创建方法Docker镜像除了是Docker的核心技术之外,也是应用发布的标准格式。一个完整的Docker镜像可以支撑一个Docker容器的运行,在Doker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最... 查看详情
无法通过弹性搜索与 dockerized 进程进行通信,并显示“所有已配置的节点都不可用”
】无法通过弹性搜索与dockerized进程进行通信,并显示“所有已配置的节点都不可用”【英文标题】:Failedtocommunicateadockerizedprocesswithelasticsearchwith"Noneoftheconfigurednodesareavailable"【发布时间】:2016-10-2305:22:36【问题描述】:... 查看详情
docker+openvswitch实现主机与容器的网络通信
...:安装openvswitchovs创建br0,br1,并启动两个不加载网络的docker容器将容器关联网桥br0,并设置ip、vlan创建veth0与veth1网卡对创建netns名称空间,并添加veth0.0和veth1.0接口,并配置相关信息将veth0.1 查看详情
docker学习docker容器网络通信原理分析(代码片段)
概述自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求。而容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信。而本文将分别针对... 查看详情
无法将 mysql docker 容器与 Spring Boot 应用程序链接 - 通信链接失败
】无法将mysqldocker容器与SpringBoot应用程序链接-通信链接失败【英文标题】:Unabletolinkmysqldockercontainerwithspringbootapplication-Communicationslinkfailure【发布时间】:2019-06-2112:54:06【问题描述】:我是Docker新手。我正在使用SpringBoot微服务... 查看详情