docker 三大组件

  • 仓库(reposity)
  • 镜像(image)
  • 容器(container)

仓库:即存储镜像的地方,docker hub提供了仓库,我们也可以自建仓库。
镜像:容器是由镜像启动生成,而容器commit后可以生成新的镜像。镜像只是可读的,操作都在容器中进行。
容器:用来开发,运行的实例。

docker进入容器中操作的命令 exec

docker exec -it [容器tag] bash

exec 是docker原生提供登入容器内部命令, 如果希望在容器内部执行多个命令 加-it 以root身份登陆容器。 可以在容器内启动sshd服务来响应用户登陆,但是存在进程开销和被攻击风险,违反docker“一个容器一个进程”原则

与docker run image echo hello 的区别是这个命令对image的操作,是以image 创建一个container 然后echo hello 每次都会创建一个新的container,而exec是对container的操作

docker history image 查看镜像分了多少层

docker 镜像分层有两个特性

  1. 已有的分层可读不可改,防止共用的底层一个文件被修改,所有上层镜像都发生变化(当底层镜像修复bug 如何处理?)
  2. 上层优先级高于底层优先级

所以对于一个镜像想修改底层配置文件的正确方法是: 新生成一个容器,有了自己的可修改层a,修改后生成新的镜像,此时a也变为不可修改层了

修改一个文件生成新的镜像需要:

  1. 在原来的镜像基础上生成一个容器 (docker run),这样才会有一个新的可读写的空白层
  2. 在容器中做更改
  3. docker commit 生成新的镜像

但是这样分层存在问题

  1. aufs 最多支持128层
  2. 许多上层应用镜像都是基于相同的底层镜像,一旦基础镜像有需要修复,如bug修复,耀(neocomplcache_start_auto_complete)Œ基于它之上的千万个镜像,都要通过容器的方式生成新的镜像 -解决方式:dockerfile

dockerfile用户处理镜像构建问题,docke-compose用于处理编排多个容器问题

  1. dockerfile: 构建镜像;
  2. docker run: 启动容器;
  3. docker-compose: 启动服务;