一、数据管理容器中管理数据主要有两种方式:1、数据卷 2、数据卷容器1.数据卷数据卷是一个可供容器使用的特殊目录,它绕过文件系统可以提供很多有用的特性:数据卷可以在容器之间共享和重用对数据卷的修改会立
一、数据管理
容器中管理数据主要有两种方式:1、数据卷 2、数据卷容器
1.数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用
数据卷的使用,类似linux下对目录或文件进行mount操作
在用docker run命令的时候,使用 -v 标记可以在容器内创建一个数据卷,多次使用-v标记可以创建多个数据卷
下面的命令加载主机的/opt目录到容器的/webapp目录,本地目录的路径必须是绝对路径,如果目录不存在,docker会自动创建。docker挂载数据卷的默认权限是rw
# docker run -d -P --name web -v /opt:/webapp training/webapp python app.py95d6dbfe0fbf86740821286dad883b03d40caf2006ab91402eeaf35c163b8b1d# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES95d6dbfe0fbf training/webapp "python app.py" 6 seconds ago Up 4 seconds 0.0.0.0:32769->5000/tcp web# docker exec -ti 95d6dbfe0fbf /bin/bashroot@95d6dbfe0fbf:/opt/webapp# lsProcfile app.py requirements.txt tests.pyroot@95d6dbfe0fbf:/opt/webapp# cd /webapproot@95d6dbfe0fbf:/webapp# ls
2.数据卷容器
如果需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器就是一个普通的容器,专门用它提供数据卷供其他容器挂载。
首先创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata
[root@master blog]# docker run -it -v /dbdata --name dbdata ubunturoot@3efac2b025dd:/# lsbin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr varroot@3efac2b025dd:/# exitexit在其它容器中使用--volumes-from来挂载dbdata中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷[root@master blog]# docker run -it --volumes-from dbdata --name db1 ubunturoot@eb86f0ab91a8:/# exitexit[root@master blog]# docker run -it --volumes-from dbdata --name db2 ubunturoot@4c8d946a3e2a:/# exitexit此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,在其它容器都可以看到。[root@master blog]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4c8d946a3e2a ubuntu "/bin/bash" 59 seconds ago Exited (0) 55 seconds ago db2eb86f0ab91a8 ubuntu "/bin/bash" About a minute ago Exited (0) About a minute ago db13efac2b025dd ubuntu "/bin/bash" 3 minutes ago Exited (0) About a minute ago dbdata[root@master blog]# docker start 3efac2b025dd3efac2b025ddroot@master blog]# docker exec -ti 3efac2b025dd /bin/bashroot@3efac2b025dd:/# lsbin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr varroot@3efac2b025dd:/# cd /dbdataroot@3efac2b025dd:/dbdata# lsroot@3efac2b025dd:/dbdata# touch testroot@3efac2b025dd:/dbdata# lstestroot@3efac2b025dd:/dbdata# exitexit在db1容器和db2容器中会发现/dbdata目录下会有test文件
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示的使用docker rm -v 来指定同时删除的关联容器。
3.利用数据卷容器迁移数据
利用数据卷容器对其中的数据卷进行备份、恢复、以实现数据的迁移
二、网络基础配置
docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务
1. 端口映射访问容器
在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用的。要想从外部访问这些应用时,可以通过-P或-p参数来指定端口映射。当使用-P参数时,Docker会随机映射一个端口至容器内部开放的网络端口
[root@master blog]# docker run -d -P training/webapp python app.pyUnable to find image 'training/webapp:latest' locallyTrying to pull repository docker.io/training/webapp ... latest: Pulling from docker.io/training/webappe190868d63f8: Pull complete 909cd34c6fd7: Pull complete 0b9bfabab7c1: Pull complete a3ed95caeb02: Pull complete 10bbbc0fc0ff: Pull complete fca59b508e9f: Pull complete e7ae2541b15b: Pull complete 9dd97ef58ce9: Pull complete a4c1b0cb7af7: Pull complete Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d90fee4690c19ec45b5b21a1e588dcf338300c7408d128f6c561413e52d7eec12[root@master blog]# docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES90fee4690c19 training/webapp "python app.py" About a minute ago Up 59 seconds 0.0.0.0:32768->5000/tcp infallible_wing
此时可以看到,本地主机的32768端口映射到容器的5000端口。访问宿主主机的49115端口即可访问容器内Web应用提供的界面信息。可以通过docker logs命令来查看应用的信息
[root@master blog]# docker logs -f infallible_wing * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)10.104.203.95 - - [17/Jul/2017 02:55:45] "GET / HTTP/1.1" 200 -10.104.203.95 - - [17/Jul/2017 02:55:45] "GET /favicon.ico HTTP/1.1" 404 -
-p可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。支持的格式ip:hostport:containerport | ip::containerport | hostport:containerport
可以使用docker port来查看当前映射的端口配置,也可以查看到绑定的地址
[root@master blog]# docker port 90fee4690c195000/tcp -> 0.0.0.0:32768
2.容器互联实现容器间通信
容器的连接系统是除了端口映射外另一种可以与容器中应用进行交互的方式。它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息
连接系统依据容器的名称来执行。因此需要自定义一个好记的容器命名。使用--name标记可以为容器自定义命名
[root@master blog]# docker run -d -P --name web training/webapp python app.py91766288187a096a3888de1aa8e3ec0273776803a2a90b7e66ec561416b56e76[root@master blog]# docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES91766288187a training/webapp "python app.py" 5 seconds ago Up 2 seconds 0.0.0.0:32769->5000/tcp web
使用--link参数可以让容器之间进行安全的交互
先创建一个新的数据库容器
[root@master blog]# docker run -d --name db training/postgres710464ff25fada5b927e443f0fc9f0472fc23dbfb38d107cfcece297f32ec55d
删除之前创建的web容器
[root@master blog]# docker rm -f webweb
创建一个新的web容器,连接到db容器
[root@master blog]# docker run -d -P --name web --link db:db training/webapp python app.py6532bac5761b3969aaa79ed4f5639a32938f7c764ff79b4ece8bf3469baf7359
此时,db容器和web容器建立互联关系
--link的参数格式为 --link name:alias ,其中name是要连接的容器的名称,alias是这个连接的别名
[root@master blog]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6532bac5761b training/webapp "python app.py" 11 seconds ago Up 8 seconds 0.0.0.0:32770->5000/tcp web710464ff25fa training/postgres "su postgres -c '/usr" About a minute ago Up About a minute 5432/tcp db[root@master blog]# docker exec -ti 6532bac5761b /bin/bashroot@6532bac5761b:/opt/webapp# lsProcfile app.py requirements.txt tests.pyroot@6532bac5761b:/opt/webapp# cat /etc/hosts127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.7 db 710464ff25fa172.17.0.6 6532bac5761bdocker 添加 hosts信息到父容器的/etc/hosts文件[root@master blog]# docker exec -ti 6532bac5761b envPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=6532bac5761bDB_PORT=tcp://172.17.0.7:5432DB_PORT_5432_TCP=tcp://172.17.0.7:5432DB_PORT_5432_TCP_ADDR=172.17.0.7DB_PORT_5432_TCP_PORT=5432DB_PORT_5432_TCP_PROTO=tcpDB_NAME=/web/dbDB_ENV_PG_VERSION=9.3HOME=/root以DB_开头的环境变量是供web容器连接db容器使用