Docker开发实践笔记三

一、容器网络基础

做为一个寄宿在宿主主机上的容器,咱们要想办法让外部网络可以访问到它,这样才可以使用其提供的服务。当docker启动时,它会在宿主主机上建立一个名为docker0的虚拟网络接口。linux下能够经过:ifconfig命令查看,windods下使用ipconfig查看。html

1.1 暴露网络端口python

Docker中运行网络应时,要让外部能访问这里须要经过-P或-p参数来指定端口映射。经过端口映射来实现端口暴露是容器对外提供服务的基础方法。mysql

-P(大写):Docker会在宿主主机上随机为应用分配一个49000~49900内的未被使用的端口,并将其映射到容器开放的网络端口(即经过EXPOSE配置的端口)。linux

这里以官方的一个培训项目示例:git

docker run -d -P training/webapp python app.py

使用下面的命令能够查看到运行分配的端口号。
docker ps

上面的32768就是随机分配的端口,每次运行时分配的可能都不同,5000是容器暴露出来的端口。这样经过http://localhost:32768 就能访问服务了。web

-p(小写):它能够指定宿主主机上的端口映射到容器内部指定的开放端口,格式有以下3种:sql

ip:hostPort:containerPort //指定ip和端口与容器开放的端口绑定docker

docker run -d -p 192.168.0.1:8000:5000 training/webapp python app.py

ip::containerPort //指定ip的随机端口与容器开放的端口绑定数据库

docker run -d -p 192.168.0.1::5000 training/webapp python app.py
//至关于省略了端口号全部两个冒号连在一块儿了

hostPort:containerPort  //宿主主机上全部的网络接口的指定的端口都会绑定(好比你可使用localhost、局域网ip、主机名等加端口访问服务)。ubuntu

docker run -d -p 8000:5000 training/webapp python app.py

容器的全部配置信息能够经过下面的命令查看:

docker inspect 容器ID或名称

 

二、数据卷

Docker中的数据能够存储在相似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷能够用来存储Docker应用的数据,也能够用来在Docker容器间进行数据共享。
数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,相似在系统中使用 mount 挂载一个文件系统。

数据卷是一个可供一个或多个容器使用的特殊目录,使用它能够达到以下目的。

1)绕过“拷贝写”系统,以达到本地磁盘IO的性能,(好比运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,因此是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
2)绕过“拷贝写”系统,有些文件不须要在docker commit打包进镜像文件。
3)数据卷能够在容器间共享和重用数据
4)数据卷能够在宿主和容器间共享数据(共享单个文件,也能够是socket)
5)数据卷数据改变是直接修改的
6)数据卷是持续性的,直到没有容器使用它们。即使是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其余的容器使用数据卷,那么里面的数据都不会丢失。
 

2.1 建立、挂载数据卷

有两种方式建立数据卷,具体以下:

1.在Dockerfile中,使用VOLUMN指令,如:VOLUME /var/lib/mysql

2.在命令行中使用docker run时,使用-v参数建立数据卷并将其挂载到容器中

docker run -d -P -v /webapp /training/webapp python app.pyp

上面只是定义了一个/webapp的数据卷,并无指定宿主机上的目录,docker会自动分配一个具备惟一名字的目录给该数据卷。


1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统能够为容器提供一些稳定的特性或者数据共享。数据卷能够在多个容器之间共享
2)建立数据卷,只要在docker run命令后面跟上-v参数便可建立一个数据卷,固然也能够跟多个-v参数来建立多个数据卷,当建立好带有数据卷的容器后,
   就能够在其余容器中经过--volumes-froms参数来挂载该数据卷了,而无论该容器是否运行。也能够在Dockerfile中经过VOLUME指令来增长一个或者多个数据卷。
3)若是有一些数据想在多个容器间共享,或者想在一些临时性的容器中使用该数据,那么最好的方案就是你建立一个数据卷容器,而后从该临时性的容器中挂载该数据卷容器的数据。
   这样,即便删除了刚开始的第一个数据卷容器或者中间层的数据卷容器,只要有其余容器使用数据卷,数据卷都不会被删除的。
4)不能使用docker export、save、cp等命令来备份数据卷的内容,由于数据卷是存在于镜像以外的。备份的方法能够是建立一个新容器,挂载数据卷容器,同时挂载一个本地目录,
   而后把远程数据卷容器的数据卷经过备份命令备份到映射的本地目录里面。以下:
   # docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
5)也能够把一个本地主机的目录当作数据卷挂载在容器上,一样是在docker run后面跟-v参数,不过-v后面跟的再也不是单独的目录了,它是[host-dir]:[container-dir]:[rw|ro]这样格式的,
   host-dir是一个绝对路径的地址,若是host-dir不存在,则docker会建立一个新的数据卷,若是host-dir存在,可是指向的是一个不存在的目录,则docker也会建立该目录,而后使用该目录作数据源。

docker run -d -P --name webapp -v `pwd`:/webapp training/webapp python app.py 
//用pwd获取当前绝对路径

注意事项:若是容器内部已经存在/webapp目录,那么挂载宿主目录以后,它的内容将会被覆盖。(不过通常不会直接在容器中写重要的数据,是吧!)

须要注意的是,Dockerfile并不支持挂载本地目录到数据卷,也就是说不能在Dockerfile文件中使用VOLUME指令挂载本地目录到数据卷,主要是由于不一样操做系统 的目录格式不尽相同。为了保证Dockerfile的可移植性,因此不支持这种方式,只能经过-v参数的形式挂载。

挂载目录后面能够跟上目录的操做权限,默认是RW权限。使用格式以下:

docker run -d -P -v `pwd`:/webapp:ro training/webapp python app.py
docker run -d -P -v `pwd`:/webapp:rw training/webapp python app.py

除了挂载主机目录外,也能够挂载主机的文件做为数据卷:

docker run --rm -it -v d:/test.txt:/test.txt ubuntu:latest /bin/bash  
//挂载的这个文件必需要存在,不然docker会建立同名的目录,好比上面的test.txt文件不存在时会建立一个test.txt的目录。

 

2.1 数据卷容器

数据卷容器故名思义是指一个专门用于挂载数据卷的容器,以供其余容器引用和使用。它主要是用在多个容器须要从一处得到数据时。在实际操做时,须要将数据容器命名,有了肯定的容器名以后,对它有依赖关系的其它容器就能够经过--volumes-from引用它的数据卷。

首先,创建一个数据卷容器,名为test_dbdata,并为该容器新建一个数据卷/dbdata。具体操做为:

docker run -d -v /dbdata --name test_dbdata training/postgres

接着建立一个容器db1,它引用test_dbdata的数据卷,具体操做为:

docker run -d --volumes-from=test_dbdata --name db1 training/postgres

能够经过docker inspect test_dbdata/db1 来查看容器挂载信息。

从inspect信息中能够看到他们的数据卷是同样的。须要说明的是,数据卷一旦声明,它的生命周期和声明它的那个容器就无关了。当声明它的容器中止了,数据卷依赖存在,除非全部引用它的容器都被删除了而且显式地删除了该数据卷。此外,一个容器引用一个数据卷容器时,并不要求数据卷容器是运行的。一个数据卷容器能够被多个容器引用。

docker run -d --volumes-from=test_dbdata --name db2 training/postgres

此外,数据卷容器还能够级联经引用。例如,新建一个容器db3,它能够引用db1的数据卷。

docker run -d --volumes-from=db1 --name db3 training/postgres

不管是声明数据卷的容器仍是后续引用该数据卷的容器,容器的中止和删除都不会致使数据卷自己删除。若是须要删除数据卷,那么须要删除全部依赖它的容器,而且在删除最后一个依赖容器时加入-v标志。这里,假如test_dbdata、db一、db2都已经邮件了,那么删除db3时加上-v参数就能够删除数据卷。

docker rm -v db3

2.2 数据的备份与恢复

利用数据卷容器,还能够进行数据的备份和恢复等。

一、备份、恢复

利用数据卷容器,咱们能够备份一个数据卷容器的数据。

首先,创建一个数据卷容器,相关操做为:

docker run -d -v /dbdata --name dbdata training/postgress

这样,数据都保存到了容器的/dbdata目录,这里要备份/dbdata目录到本地,相关操做为:

docker run --volumes-from dbdata -v ${pwd}:/backup ubuntu tar cvf /backup/backup.tar /dbdata

这里建立了一个新的数据卷容器,并引用了dbdata数据卷容器,当前目录挂载到新的数据卷容器/backup目录,这样当前目录就和/backup目录是同一个目录了,容器中的数据写到/backup目录亦即写到了宿主机的当前目录。

恢复的过程其实就是将原来tar cvf打包的数据,使用tar xvf解压到数据卷。

注意:在windows中若是使用git-bash的命令行来运行命令,pwd获得的路径不认,能够直接写绝对路径,格式是:/d/docker_data d表示d盘。就是原来的 d:/ 换成了/d。

很详细的讲解数据卷、及备份恢复的文章:

Docker容器学习梳理--Volume数据卷使用

2.3 容器链接

前面咱们使用了-P或-p来暴露容器端口,以供外界使用该容器。还有另外一种容器对外提供服务的方法——容器链接。容器链接包含源容器和目标容器:源容器是提供服务的一方,对外提供指定服务;目标容器链接到源容器后,就可使用其所提供的服务。容器链接依赖于容器名,因此当须要使用容器链接时,首先须要命名容器,而后使用--link参数进行链接。

链接的格式为:--link name:alias,其中name是源容器的名称,alias是这个链接的别名。下面是一个链接的示例:

docker run -d --name dbdata training/postgres
上面的命令先创建了一个数据库的容器,使用下面的命令链接它。
docker run -d -P --name web --link dbdata:db training/webapp python app.py

经过docker inspect web能够查看到链接信息。

经过这种方法,dbdata容器为web容器提供了服务,但并无使用-P或-p对外暴露端口,这使得源容器dbdata更安全。那web容器是如何使用dbdata的服务呢?

Docker给目标容器提供了以下两种方式来暴露链接提供的服务:

  • 环境变量
  • /etc/hosts文件

下面分别说明它们。

1 环境变量

当两个容器链接互联以后,Docker将会在目标容器中设置相关的环境变量,以便在目标容器中使用源容器提供的服务。链接环境变量的命令格式为<alias>_NAME,其中alias是--link参数中的别名。例如web容器链接dbdata容器,参数为--link dbdata:webdb,那么在容器中则有环境变量WEBDB_NAME=/web/webdb。

通常状况下,可使用evn命令来查看一个容器的环境变量,相关代码为:

docker run --rm --name web --link dbdata:webdb training/webapp env

下面是显示结果:

2 /etc/hosts文件

查看目标容器的/etc/hosts配置文件,具体操做以下:

docker run -i -t --rm --name web2 --link dbdata:webdb training/webapp /bin/bash

能够看到,容器链接webdb对应的ip地址,该ip地址即为dbdata容器的地址,容器对webdb链接的操做将映射到该地址上。

2.4 代理链接

上面说的容器链接都是在同一个宿主主机上的链接,要实现跨主机的容器链接,目前可使用ambassador模式来实现跨主机链接,这种模式叫代理链接。

现阶段代理的实现方法有多种,下面收集了一些方案(若有最好的方便欢迎留言)

http://blog.csdn.net/shanyongxu/article/details/51398574

http://blog.csdn.net/magerguo/article/details/72123515

http://www.bijishequ.com/detail/445655?p=

http://blog.51cto.com/renyongfan/1812825

相关文章
相关标签/搜索