一、需求

  公司本地环境上了xen和kvm,但上周,CTO跑过来跟我说,你这几天熟悉一下docker,公司打算利用docker做自动化持续集成,和快速部署,原有测试环境,可以先跑着。我想起去年,申请购入一本docker入门书,然后用了一个星期看完了,也总算有初步认识与运用。

   正如前人所说,好记性不如烂笔头,我一般看完一本书,都会总结一下。以下书里讲到,我把它敲下来放到博客上,随时查阅!

二、镜像相关

1、如何批量清理临时镜像文件?

docker rmi $(docker p_w_picpaths -q -f dangling=true)

2、如何查看镜像支持环境变量?

docker run IMAGE env

3、本地的镜像文件都存放哪里?

与docker相关本地资源都存放在/var/lib/docker/目录树下,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体镜像层次文件。疑问的是,在我centosy6.5下找不到aufs这个目录

4、构建Docker镜应该遵循哪些原则?

整体原则上,尽量保持镜像功能的明确和内容精简,要点包括:尽量选取满足需求但较小的基础系统镜像,例如大部分时候可以选择debian:wheezy镜像,仅有85M大小清理编译生成文件,安装包的缓存等临时文件安装各个软件时候要指定准确版本号,并避免引入不需要的依赖。从安全角度考虑,应用要尽量使用系统的库和依赖如果安装应用的时候需要配置一些特殊的环境变量,在安装后要还原不需保持的变量值使用Docker创建镜像时候要添加.dockerignore文件或使用干净的工作目录

三、容器相关的

1、容器退出后,通过docker ps 命令查看不到,数据会丢失么?

容器退出后会处于终止(exited)状态,此时可以通过docker ps -a 查看,其中数据也不会丢失,还可通过docker start 命令来启动。只有删除掉容器才会清除所有数据

2、如何停止所有正在运行的容器?

docker kill $(docker ps -q)

3、如何清理批量后台停止的容器?

docker rm $(docker ps -a -q)

4、如何给容器指定一个固定的IP地址,而不是每次重启容器IP地址都会变?

参考本书第20章,会涉及到点对点连接创建和pipwork工具

5、如何临时退出一个正在交互的容器的终端,而不是终止它?

按ctrl-P ,ctrl -q 。如果按Ctrl -c 往往会让容器应用进程终止,进而会终止容器。疑问,我的centos6.5和ubuntu 下,这个这两人个键无法启作用

6、很多应用容器都是默认后台运行的,怎么查看它们的的输出和日志信息?

docker logs 后面跟容器名称或ID信息

7、使用“docker port” 命令映射容器的端口时,系统报错Error:No public port '80' published ofr e7d817698b6f,是什么意思

创建镜像时Dockerfile要指定正确的EXPOSE的端口容器启动时指定PublishALLPort=true

8、可以在一个容器中同时运行多个应用进程吗?

一般不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制。比如supervisord来管理所运行的进程。可以参考https://docs.docker.com/article/using_supervisord/

9、如何控制容器占用系统资源(CPU,内存)的份额?

在使用docker create 创建容器或使用docker run 创建并启动容器的时候,可以使用-c|--cpu-share[=0]参数来调整容器使用CPU的权重;使用-m|--memory[=MEMORY]参数来调整容器使用内存大小

四、仓库相关

1、仓库(Repository),注册服务器(Registy),注册索引(Index)有何关系?

仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。注册服务器是存放实际镜像文件的地方。注册索引则负责维护用户的账号,权限,搜索,标签等管理。因此注册服务器利用注册索引来实现认证等管理

2、从非官方仓库(例如dl.dockerpool.com)下载镜像时候,有时候提示“Error:Invalid registry endpoint https://dl.dockerpool.com:5000/v1/.......”?

Docker自1.3.0版本后,加强了对镜像的安全性的验证,需要手动添加对非官方仓库的信任编辑Docker配置文件,其其添加:DOCKER_OPTS="--insecure-registry dl.dockerpool.com:5000"之后,重启docker服务

五、配置相关

1、Docker的配置文件在哪里,如何修改配置?

Ubutu系统配置文件是/etc/default/docker,centos系统配置文件放在/etc/sysconfig/docker。我以centos6.5来[root@master ~]# cat /etc/sysconfig/docker# /etc/sysconfig/docker## Other arguments to pass to the docker daemon process# These will be parsed by the sysv initscript and appended# to the arguments list passed to docker -d other_args='--insecure-registry 10.1.9.214:5000'#other_args='--iptables=true'DOCKER_CERT_PATH=/etc/docker # Resolves: rhbz#1176302 (docker issue #407)DOCKER_NOWARN_KERNEL_VERSION=1 # Location used for temporary files, such as those created by# # docker load and build operations. Default is /var/lib/docker/tmp# # Can be overriden by setting the following environment variable.# # DOCKER_TMPDIR=/var/tmp#other_args="-b=br0"

2、如何更改Docker默认存储位置?

Docker 的默认存储位置是/var/lib/docker,如果希望将docker的本地文件存储其他分区,可以使用Linux软件连接方式来实现

六、Docker与虚拟化

1、Docker 和LXC(Linux Container)有何不同?

LXC利用Linux上相关技术实现了容器。Docker则在如下几方面进行了改进:移值性: 通过抽象容器配置,容器可以实现从一个平台移植到另一个平台;镜像系统:基于AUFS的镜像系统为容器的分发带来了很多便利,同时共同的镜像层只需存储一份,实现高效率的存储;版本管理:类似于Git的版本管理理念,用户可以更方便的创建,管理镜像文件;仓库系统:仓库系统大大降低了镜像分发和管理成本;周边工具:各种工具(配置管理,云平台)对Docker的支技,以及基于Docker的PasS,CI等系统,让Docker的应用更加方便和多样化。

2、Docker与Vagrant有何不同?

两者定位不同Vagrant类似于Boot2Docker(一款运行Docker的最小内核),是一套虚拟机的管理环境。Vagrant可以在多种系统上和虚拟机软件中运行,可以在windowns,Mac等非Linux平台上为Docker提供支技,自身具有较好包装性和移值性。原生Docker自身只能运行在Linux平台上,但启动和运行的性能都要比虚拟机要愉,往往更适合快速开发和部署应用的场景。简单来说:Vagrant适合来管理虚拟机,而Docker适合用来管理应用环境。

3、开发环境Docker和Vagrant该如何选择?

Docker不是虚拟机,而是进程隔离,对于资源消耗很少。但需要Linux环境支技。Vagrant是虚拟机做的封装,虚拟机本身会消耗资源。如果本地使用OSX或者Windows环境,那就开虚拟机,单一开发环境下vagrant更简单;多环境开发下推荐vagrant里再使用Docker进行环境隔离

七、其他问题

1、如何将一台宿 主主机的docker环境迁移 到另外一台宿主主机?

停止Docker服务。将整个docker存储文件夹复制到另外一台宿主主机,然后调整另外一台宿主主机配置即可

2、创建Docker空器后,在宿主机用“ip netns show”为何看不到容器的网络名字空间?

Docker在创建容器后,删除了/var/run/netns目录的网络名字空间文件。因此,可以手动恢复它。首先,使用下面的的命令查看容器进程信息,比如这里的1234.docker inspect --format='``.`State`.`Pid`' $container_id1234接下来,在/proc目录 下,把对应的网络名字空间文件链接到/var/run/netns目录。ln -s /proc/1234/ns/net /var/run/netns/然后,可以通过正常系统命令来查看或操作容器命名空间了,如ip netns show1234

疑问:Centos6.5的内核已经支持network namespace, 但安装的iproute版本过低,不支持ip nets 命令。升级iproute 至 iproute-2.6.32-130.el6ost.netns.2.x86_64。