docker笔记

1) docker安装

  • 按照官网说明安装Docker,这个安装并不包含镜像安装

  • 为非root用户添加组权限sudo usermod -aG docker youname。添加完成它后注销重新登录以更新group缓存

  • 官网主站的docker hub实在太慢了,先替换为mirror。国内目前提供mirror的有官方mirror,ustc,daocloud, aliyun, 网易docker。参考国内 docker 仓库镜像对比,以及docker镜像说明。在我的ubuntu环境下,只需要在/etc/docker/目录下新建一个daemon.json文件,然后加入

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
  • 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 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 
  • Dockerfile中通过VOLUME命令来指定 
    • Dockerfile文件中写 

      FROM debian:wheezy 
      VOLUME /data 
  • 运行时–volumes-from 来继承别的容器的volume 
    • 下面的命令创建一个image的容器,该容器继承了container1的volume定义,包括路径名 

      docker run --volumes-from container1 -ti image /bin/bash 

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的说明,其中介绍了常见的几种方法,下面介绍个人觉得最有用的方

docker run -it \
    --name YOURNAME \
    --user $(id -u) \
    --env="DISPLAY" \
    --workdir="/home/$USER" \
    --volume="/home/$USER:/home/$USER" \
    #--volume="/etc/group:/etc/group:ro" \ 这个可能会影响到一些软件的安装
    --volume="/etc/passwd:/etc/passwd:ro" \
    --volume="/etc/shadow:/etc/shadow:ro" \
    --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
    --volume="/etc/sudoers:/etc/sudoers:ro" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    --privileged \
    --rm \
    ubuntu:16.04  bash

# 注意上面的--user $(id -u), 在老版本的docker中 可以使用 --user $USER, 但新版本的docker貌似讲--user操作排在了--volume的后面,但是用uid没有这个风险
  • 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(比如常见的摄像头)
分割线
感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS