Docker 学习总结(一)
《每天5分钟玩转Docker容器技术》总结
加速docker daocloud.io
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://a1152ee2.m.daocloud.io
systemctl restart docker.service
重启docker deamon服务
第二篇 容器技术
第二章 容器核心知识概述
2.1 什么是容器?
- 虚拟机需要安装整个操作系统
- 容器由应用程序本身和相关依赖组成,与操作系统的其他进程隔离
2.2 为什么需要容器?
- 开发:Build Once、 Run Anywhere
- 运维:Configure、 Run Anything
2.3 容器时如何工作的?
1、Docker 架构
- Docker 客户端:client
- Docker 服务端:Docker daemon
- Docker 镜像:Image
- Registry
- Docker 容器:Container
Docker 采用的是Client/Server架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个Host上,客户端也可以通过socket或REST API与远端的服务器通信。
2、Docker 客户端
- 最常用的Docker客户端是Docker命令,通过命令可以方便地在Host上构建和运行容器。
- 除Docker命令行工具,用户也可通过REST API与服务器通信
3、Docker服务器
- Docker daemon是服务器组件,以Linux后台服务的方式运行
- Docker daemon运行在Docker daemon上,负责创建、运行、监控容器,构建、存储镜像。
- 默认情况Docker daemon只能相应来自本地Host的客户端请求。如需允许远程客户端请求,需要在配置文件中打开TCP监听。
4、Docker镜像
- 看做只读模板,通过它创建Docker容器
5、Docker容器
- Docker镜像运行的实例
6、Registry 镜像仓库
第三章 docker镜像
3.1镜像的内部结构
- base镜像:不依赖其他镜像,从scratch构建,其他镜像可以以之为基础进行扩展
- Linux操作系统由内核空间和用户空间组成。镜像只提供用户空间的文件系统rootfs就够了
- 注:base镜像只是在用户空间与发行版一致,kernel版本与发行版不同
- 容器只能使用Host的kernel,且不能修改
- 只有当需要修改时才复制一份数据,称为”copy-on-write”
- Linux操作系统由内核空间和用户空间组成。镜像只提供用户空间的文件系统rootfs就够了
3.2 构建镜像
- docker commit 命令
- 运行容器、修改容器、将容器保存为新的镜像
- Dockerfile构建文件:
docker build
- 从base镜像运行一个容器
- 执行一条指令,对容器做修改
- 执行类似docker commit的操作,生成一个新的镜像层
- Docker再基于刚刚提交的镜像运行一个新容器
- 重复2-4步,直到Dockerfile中所有指令执行完毕
3.3 RUN vs CMD vs ENTRYPOINT
- RUN:执行命令并创建新的镜像层,RUN经常用于安装软件包
- CMD:设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令参数替换
- ENTRYPOINT:容器启动时运行的命令
最佳实践:
- 使用RUN指令安装应用和软件包,构建镜像
- 如果Docker镜像的用途是运行应用程序或服务,比如运行一个MySQL,应该优先使用Exec格式的ENTRYPOINT。CMD可以为ENTRYPOINT提供额外的默认参数,同时可利用docker run命令行替换默认参数
- 如果想为容器设置默认的启动命令,可使用CMD指令。用户可在docker run 命令行中替换此默认命令。
小结:
- 命令:
- images:显示镜像列表
- history:显示镜像构建历史
- commit:从容器创建新镜像
- build:从Dockerfile构建镜像\tag\pull
- push:将镜像上传到registry
- rmi:删除镜像
- search:搜索Docker Hub中的镜像
第四章 Docker 容器
4.1 运行容器
指定容器启动时执行命令的三种方式
- CMD命令
- ENTRYPOINT指令
- 在docker run 命令中指定
让容器长期运行
- -d:以后台方式启动容器
进入容器的两种方式
- docker attach:可以attach到容器启动命令的终端
- docker exec:
docker exec -it ID bash
以交互方式执行 - attach VS exec:
- attach直接进入容器启动命令的终端,不会启动新的进程
- exec则是在终端中查看命令的输出,并且可以启动新的进程
- 如果想在终端中查看启动命令的输出,用attach,其他用exec
运行容器的最佳实践
- 容器分为两类:服务类容器和工具类容器
- 服务类容器以daemon的形式运行,对外提供服务,如web、数据库等。如需排查错误,通过
exex -it
进入容器 - 工具类容器通常提供一个临时的工作环境,通常以
run -it
方式运行
- 服务类容器以daemon的形式运行,对外提供服务,如web、数据库等。如需排查错误,通过
4.2 stop/start/restart 容器
docker stop
:向该进程发送一个SIGTERM信号,如果想快速停止容器docker kill
发送SIGKILL信号docker start
可以保留容器第一次启动的所有参数docker run -d --restart=always nginx
- 无论容器因何种原因退出(包括正常退出),都立即重启
4.3 pause/unpause
- 暂停、恢复容器
4.4 删除容器
docker rm -v ${docker ps -aq}
删除所有已经退出的容器
4.6 资源限制
- 内存限制: -m 设置内存的使用限额
- CPU限额: -c 默认为1024,不是资源的数量,而是权重值(优先级)
Block IO 带宽限制
- –blkio-weight 与CPU类似设置的是相对权重值
4.7 实现容器的底层技术
4.7.1 cgroup 实现资源限额
- Linux通过cgroup可以设置进程使用CPU、内存和IO资源的限额。之前的–cpu-shares、-m、–device-write-bps实际就是在配置cgroup
- 在
/sys/fs/cgroup/cpu/docker
目录中,Linux会为每个容器创建一个cgroup目录
4.7.2 namespaces 资源隔离
- namespaces管理着host中全局唯一的资源,并让每个容器都觉得只有自己在使用它。实现了容器间资源的隔离。
Linux使用了6种namespaces
- Mount namespace:让容器看上去拥有整个文件系统
- UTS namespace:让容器拥有自己的hostname
- IPC namespace:让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与host和其他容器的IPC混在一起
- PID namespace:容器以进程的形式运行,使容器拥有自己独立的一套PID
- Network namespace:让容器又有自己独立的网卡、IP、路由等资源
- User namespace 让容器能够管理自己的用户,host不能看到容器中创建的用户
4.8 容器命令小结:
- create:创建容器
- pause\unpause:暂停、恢复容器
- stop:发送SIGTERM停止容器
- kill:发送SIGKILL快速停止容器
- start\restart:启动、重启容器
- attach:attach到容器启动进程的终端
- exec:在容器中启动新进程,通常使用
-it
参数 - logs:显示容器启动进程的控制台输出,用
-f
持续打印 - rmc:从磁盘中删除容器