docker 初识
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 镜像分层有两个特性
- 已有的分层可读不可改,防止共用的底层一个文件被修改,所有上层镜像都发生变化(当底层镜像修复bug 如何处理?)
- 上层优先级高于底层优先级
所以对于一个镜像想修改底层配置文件的正确方法是: 新生成一个容器,有了自己的可修改层a,修改后生成新的镜像,此时a也变为不可修改层了
修改一个文件生成新的镜像需要:
- 在原来的镜像基础上生成一个容器 (docker run),这样才会有一个新的可读写的空白层
- 在容器中做更改
- docker commit 生成新的镜像
但是这样分层存在问题
- aufs 最多支持128层
- 许多上层应用镜像都是基于相同的底层镜像,一旦基础镜像有需要修复,如bug修复,耀(neocomplcache_start_auto_complete)基于它之上的千万个镜像,都要通过容器的方式生成新的镜像 -解决方式:dockerfile
dockerfile用户处理镜像构建问题,docke-compose用于处理编排多个容器问题
- dockerfile: 构建镜像;
- docker run: 启动容器;
- docker-compose: 启动服务;