1) docker安装
为非root用户添加组权限
sudo usermod -aG docker youname
。添加完成它后注销重新登录以更新group缓存官网主站的docker hub实在太慢了,先替换为mirror。国内目前提供mirror的有官方mirror,ustc,daocloud, aliyun, 网易docker。参考国内 docker 仓库镜像对比,以及docker镜像说明。在我的ubuntu环境下,只需要在
/etc/docker/
目录下新建一个daemon.json
文件,然后加入
- 1
- 2
- 3
- 1
- 2
- 3
2) docker非常有用的命令
基本使用可以参考菜鸟教程
- docker rename my-container-xxx new-container-yyy 重命名一个已经存在的docker
- docker stop $(docker ps -a -q) 停止所有container
- docker container prune 或者 docker rm $(docker ps -a -q) 清除所有的container
- docker inspect xxx_container 查看容器的一些基本信息
3) docker volume
docker volume是个比较复杂的概念,用来实现docker容器和host之间以及容器间的文件共享通信。
首先明确几个概念:
- container只要你不显式rm是长期存在的
- volume不是为了持久化
- volume是为了容器及容器产生的数据分离
docker的文件系统是由多个文件系统叠加而成的
启动一个容器时, 在只读层上添加一个读写层,故只要容器存在(不论容器start或stop),在容器内所做的修改在再次进入容器的时候都能看到。然而当容器没rm的时候,你所做的修改都会丢失。这个时候我们可以通过自建volume来挂载一个host的目录到docker容器中。
挂载后的volume就像虚拟机中的共享文件夹一样。需要注意的是,在该volume中新建的文件的权限和docker中的一致,如果你用默认登录docker的话,看到的是root账户,新建的文件也都是root账户下的(即使在host机器中看来)
3.1) 初始化volume
查看挂载的详细情况可以通过
docker inspect my_container
来查看,目前是其中的mounts项
常见的两种方法有:
- 运行时通过
-v
参数指定新建- 下面的命令将host机器中的
/myhostpath/source
目录(如果不存在会新建)挂载到docker容器中的/mydockerpath/dest
目录, 注意host的路径请用绝对路径,否则会定位到docker的系统目录,如/var/lib/docker/volumes
docker run -v /myhostpath/source:/mydockerpath/dest -ti image /bin/bash - 下面的命令讲host中的某个目录(具体可以通过docker instpect查看)挂载到docker容器的
/mydockerpath/dest
目录
docker run -v /mydockerpath/dest -ti image /bin/bash
- 下面的命令将host机器中的
- Dockerfile中通过
VOLUME
命令来指定- Dockerfile文件中写
FROM debian:wheezy
VOLUME /data
- Dockerfile文件中写
- 运行时–volumes-from 来继承别的容器的volume
- 下面的命令创建一个image的容器,该容器继承了container1的volume定义,包括路径名
docker run --volumes-from container1 -ti image /bin/bash
- 下面的命令创建一个image的容器,该容器继承了container1的volume定义,包括路径名
3.2) 删除volume
这个功能可能会更加重要,如果你已经使用docker rm来删除你的容器,那可能有很多的孤立的Volume仍在占用着空间。
Volume只有在下列情况下才能被删除:
该容器是用docker rm -v命令来删除的(-v是必不可少的)。
docker run中使用了--rm参数
即使用以上两种命令,也只能删除没有容器连接的Volume。连接到用户指定主机目录的Volume永远不会被docker删除。及通过-v显式指定的host端目录是不会别删除的
除非你已经很小心的,总是像这样来运行容器,否则你将会在/var/lib/docker/vfs/dir目录下得到一些僵尸文件和目录,并且还不容易说出它们到底代表什么。
4) Dockerfile
4.1) Dockerfile简介:
参考官方简介
Dockerfile是用来build自己的image是用的脚本文件,文件中有多个命令,docker服务先扫描一遍Dockerfile文件,无错的话依次执行其中的命令。注意命令是独立执行的,没有上下文,每次都像是独立执行,只commit结果,故你执行RUN cd /tmp
对别的命令并没有任何影响。由于独立执行,故每次的执行结果可以做缓存以加速build过程。每个命令的执行结果被打patch到基础image(即你FROM的那个镜像)
5) 从container中调用host的x服务
如果你用docker来进行算法类学习,常有需要用x服务进行绘图统计, 这个时候就需要我们的容器调用host端的x服务。
参考ros的说明,其中介绍了常见的几种方法,下面介绍个人觉得最有用的方
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
上面启动脚本中做了以下的几点:
- 将系统的账户信息挂入容器,同时以当前用户登陆,挂载了用户目录,对于修改目录下的文件,在host中能看到同账户的生成的文件
- 共享/tmp/.X11-unix目录下的socket文件,用来调用x服务。同时由于账户信息没有变,所以不需要xhost授权
- privileged参数用来使得container能够访问host的所有device(比如常见的摄像头)