之前部署了Linux下部署docker记录(0)-基础环境安装,接下来看看Docker Volume的使用。
Docker volume使用
1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享。数据卷可以在多个容器之间共享。
2)创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然你也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,你就可以在其他容器中通过--volumes-froms参数来挂载该数据卷了,而不管该容器是否运行。你也可以在Dockerfile中通过VOLUME指令来增加一个或者多个数据卷。
3)如果有一些数据想在多个容器间共享,或者想在一些临时性的容器中使用该数据,那么最好的方案就是你创建一个数据卷容器,然后从该临时性的容器中挂载该数据卷容器的数据。
例如如下操作:
启动一个名为xqsj_Container容器,此容器包含两个数据卷/var/volume1和/var/volume2
注意这一个容器创建后,并没有进入到容器内,它的作用只是创建了连个数据卷;后两个容器创建后可以进入~
[[email protected] ~]# docker run -v /var/volume1 -v /var/volume2 --name xqsj_Container centos /bin/bash
[[email protected] ~]#
创建App_Container容器,挂载xqsj_Container容器中的数据卷
[[email protected] ~]# docker run -t -i --rm --volumes-from xqsj_Container --name App_Container centos /bin/bash
[[email protected] /]# ls /var/volume1 //发现这两个数据卷都存在
[[email protected] /]# ls /var/volume2
[[email protected] /]# echo "this is volume1" > /var/volume1/test1
[[email protected] /]# echo "this is volume2" > /var/volume1/test2
或者再创建一个容器,挂载App_Container中从xqsj_Container挂载的数据卷
[[email protected] ~]# docker run -t -i --rm --volumes-from App_Container --name LastApp_Container centos /bin/bash
[[email protected] /]# ls /var/volume1
test1
[[email protected] /]# ls /var/volume2
test2
[[email protected] /]# cat /var/volume1/test1
this is volume1
[[email protected] /]# cat /var/volume2/test2
this is volume2
列出所有的容器
[[email protected] ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4c27e360614 centos "/bin/bash" 38 seconds ago Up 37 seconds LastApp_Container b9891bcdfed0 centos "/bin/bash" About a minute ago Up About a minute App_Container 1d6f0591b781 centos "/bin/bash" About a minute ago Exited (0) About a minute ago xqsj_Container eaf66f1e43ab centos "/sbin/init" 2 hours ago Up 2 hours 0.0.0.0:8888->8080/tcp hungry_khorana
列出目前正在运行的容器
[[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4c27e360614 centos "/bin/bash" 41 seconds ago Up 40 seconds LastApp_Container b9891bcdfed0 centos "/bin/bash" About a minute ago Up About a minute App_Container eaf66f1e43ab centos "/sbin/init" 2 hours ago Up 2 hours 0.0.0.0:8888->8080/tcp hungry_khorana
可以将这个docker主机添加到DaoCloud云平台里面管理,在DaoCloud上可以看到该docker主机的容器情况,并登陆到容器的控制台里
即使删除了刚开始的第一个数据卷容器或者中间层的数据卷容器,只要有其他容器使用数据卷,数据卷都不会被删除的。
也可以把一个本地主机的目录当做数据卷挂载在容器上,同样是在docker run后面跟-v参数,不过-v后面跟的不再是单独的目录了,它是[host-dir]:[container-dir]:[rw|ro]这样格式的,host-dir是一个绝对路径的地址,如果host-dir不存在,则docker会创建一个新的数据卷,如果host-dir存在,但是指向的是一个不存在的目录,则docker也会创建该目录,然后使用该目录做数据源。例如:
[这个在Linux下部署docker环境记录这一篇文档中已经说明]
不能使用docker export、save、cp等命令来备份数据卷的内容,因为数据卷是存在于镜像之外的,但是总会有变通方法的,如下:
# docker run -rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
创建一个新容器,挂载数据卷容器,同时挂载一个本地目录,然后把远程数据卷容器的数据卷通过备份命令备份到映射的本地目录里面。
--------------------------------------------------------------------------------------------------------------------------------------
注意下面四个命令:
开启/停止/重启container
# docker start/stop/restart <container>
再次运行某个container(包括历史container)
#docker start [container_id]
连接一个正在运行的container实例(即实例必须为start状态,可以多个窗口同时attach一个container实例);前提是docker ps命令后有这个容器的活跃ID存在
#docker attach [container_id]
启动一个container并进入交互模式(相当于先start,在attach);前提是docker ps命令后有这个容器的活跃ID存在
#docker start -i <container>
注意:当一个容器创建成功并进入到容器后,别手动ctrl+d退出来。窗口若是关闭了,只要是正在运行的状态,就可以使用attach进入
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4c27e360614 centos "/bin/bash" 41 seconds ago Up 40 seconds LastApp_Container
b9891bcdfed0 centos "/bin/bash" About a minute ago Up About a minute App_Container
eaf66f1e43ab centos "/sbin/init" 2 hours ago Up 2 hours 0.0.0.0:8888->8080/tcp hungry_khorana
[[email protected] ~]# docker attach b4c27e360614
[[email protected] /]#
[[email protected] ~]# docker attach b9891bcdfed0
[[email protected] /]#
由于eaf66f1e43ab这个容器将dbus等服务启动起来了,它的进入方式跟其他的有别。参考:http://www.cnblogs.com/kevingrace/p/6234600.html
[[email protected] ~]# docker exec -it eaf66f1e43ab /bin/bash
[[email protected] /]#
[[email protected] ~]# docker start -i App_Container //按住ctrl+c或回车都行
[[email protected] /]#
注意:
docker attach后再一次查看的时候Exited(0)已经没有了,也就是说明该容器已经从终止的状态变为了正在运行的状态
命令执行成功后,会发现已经进入该容器了,而且之前的操作的文件依然存在
如果命令执行后没有反应的话,再一次点击回车即可
docker attach也就是将后台容器切换到前台
使用image创建container并进入交互模式, login shell是/bin/bash
#docker run -i -t <image> /bin/bash
映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port映射到一个动态端口。
#docker run -i -t -p <host_port:contain_port> <image> /bin/bash
注意:
使用start是启动已经创建过得container,使用run则通过image开启一个新的container。
检查某个特定的容器
检查某一特定容器可以使用docker inspect命令,后面跟容器的名称或唯一ID。
# docker inspect [OPTIONS] Container|IMAGE|TASK [CONTAINER|IMAGE|TASK...]
Docker自动创建的容器名称同样是不方便记忆的,但我们可以在运行容器时使用--name参数为其指定一个名称,命令格式为docker run --name=<yourname>。
[[email protected] ~]# docker inspect App_Container
使用logs命令查看守护式容器
可以通过使用docker logs命令来查看容器的运行日志,其中--tail选项可以指定查看最后几条日志,而-t选项则可以对日志条目附加时间戳。使用-f选项可以跟踪日志的输出,直到手动停止。
# docker logs [OPTIONS] CONTAINER
[[email protected] ~]# docker logs App_Container
查看运行中容器内的进程
# docker top CONTAINER [ps OPTIONS]
[[email protected] ~]# docker logs App_Container
在运行中容器内启动新进程
虽然Docker鼓励我们一个容器只运行一个服务,但是当我们需要对运行中的容器进行监控、维护和管理时,通常需要为运行中的容器启动新进程。
# docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
这条命令与docker run极为相似,也可以使用-i、-t和-d等参数。
[[email protected] ~]# docker exec -i -t App_Container /bin/bash
-i: –interactive 采用交互式创建容器
-t: –tty 为容器提供终端
查看root密码
ocker容器启动时的root用户的密码是随机分配的。所以,通过这种方式就可以得到容器的root用户的密码了。
#docker logs 5817938c3f6e 2>&1 | grep ‘User: ‘ | tail -n1
--------------------------------------------------------------------------------------------------------------------------------------