文章内容参考了《Docker容器实战:原理、架构与应用》。
镜像和容器
- 容器:运行在操作系统上的一个进程,只不过加入了对资源的隔离和限制。在Docker中,其容器技术的三大核心功能:CGroups(限定进程资源使用)、Namespace(划分不同命名空间)、UnionFS(处理分层镜像功能)。
- 镜像:容器中的文件系统,有Layered FS组成,并且它是只读。当容器运行时,会在镜像上加一个可读可写层。
tips:Docker的镜像最初是从官方的仓库拉去获得的,之后通过docker run
即可启动一个容器运行。当需要将容器转化为镜像时,可以通过docker commit
进行转化。
常用命令
docker info # 查看基本信息
docker pull ubuntu # 拉取镜像
docker run -i -t ubuntu /bin/bash # -i 表示可交互容器, -t 关联到容器的stdin和stdout
docker ps -a # 查看所有容器
docker images # 列出所有镜像
docker logs # 日志
docker stop/start/restart/kill
架构
采用C/S架构,Client与Daemon进行交互,Daemon负责拉取镜像、编译镜像、运行和发布容器。二者可以运行在同一个系统上,也可以通过远程方式进行访问,它们是在Socket上通过RESTful API进行交互。
- Daemon
- Client
用户访问docker的渠道,通过它对Daemon进行访问控制。 - Image
只读的模板,它用来创建容器。每个Image包含多个层,使用Union File System来将这些层组合层一个Image。其可以将文件和目录进行透明的层叠组装,然后形成一个单独的文件系统。它是一种增量式修改(执行一条命令、添加文件或文件夹、创建环境变量、指定启动时运行参数等),如更新程序救护新建一个层。 - Registry
存放Image的仓库,可以使用公有或私有的Registry来进行上传和下载。公共的位于Docker Hub。 - Container
包含应用程序运行所需要的所有环境,源于一个Image,其可以启动和停止等,每个容器都是完全隔离和安全的。一个容器有操作系统、用户文件和元数据构成,当容器运行时会在Union FS的顶层增加文件层。
主要技术
- Namespaces
- PID Nam espace:进程的隔离
- NET Namespace:网络接口
- IPC Namespace:进程间通信
- MNT Namespace:Mount点
- UTS Namespace:隔离内核和版本信息
- Control Groups:限制容器使用的硬件资源,如内存、CPU等
- Union File Sytsem:对文件系统进行分层,包括AUFS、Btrfs、VFS、DevicemapperFS等
在容器中运行web应用
docker pull tplatform/apache-php:latest # 拉取镜像
docker run -d -p 80:80 tplatform/apache-php:latest # -d 表示后台运行, -p 指定主机和容器和端口映射
docker ps # 查看当前运行容器
# 修改页面内容
docker exec -it 618756bf2040 /bin/bash # 在指定的容器内运行命令
# 持久化容器
docker commit 618756bf2040 my-apache-php # 提交容器的更改
搜索和Push
docker search mysql # 搜索
# 需要先tag镜像,然后在push
docker tag --help
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
根据dockerfile编译镜像
vim ~/myimage/Dockerfile
FROM ubuntu:latest
MAINTAINER XXX XX
CMD echo "hello, world"
# 编译
docker build .
docker run <image id>
docker rmi -f <image id> # -f表示强制删除
docker run格式
docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- 前后台运行-d和-it
- 容器的标识:–name属性在创建容器时指定名字
- PID设置
docker run -it --pid=host ubuntu /bin/bash # 共享主机的PID Namespace,否则pid从1开始
PID TTY TIME CMD # ps -ef 查看
11776 pts/0 00:00:00 sudo
11777 pts/0 00:00:00 docker
11826 pts/0 00:00:00 bash
11877 pts/0 00:00:00 ps
- UTS设置
--uts # 可以使容器与主机使用相同的hostname和domain
- IPC设置
--ipc # 进程间通信的支持,可以和主机共享
- 网络设置
--dns=[] # 设置dns
--net="bridge" # 默认,容器通过veth连接到主机的桥接上
none # 不使用网络
host #与主机相同的网络
container:<name:id> # 使用其他容器的网络
network # 用户自定义的网络,使用docker network create创建
--net-alias=[] # 网络别名
--add-host="" # 添加ip到host的解析规则
--mac-address=""
--ip==""
--ip6=""
- 重启策略
--restart # 指定容器退出后的行为,当重启时可以使用docker ps或docker events查看相关信息
No # 没有任何重启操作,默认
On-failure # 有错重启
Always # 无论处于什么状态都重启,回在deamon启动时,附带自启动
Unless-stoopped # 不会随daemon启动
CGroups控制
- 用户态内存控制
- 内核态内存控制
- CPU控制
- 磁盘IO控制
- 设备读写速率控制
- 内存耗尽时的行为
特权模式和Capabilities
--privileged
--cap-add
--cap-drop
--device # 希望使用某个设备
日志驱动
--log-driver=VALUE
Image默认参数
- CMD:默认命令或属性
- ENTRYPOINT:默认执行的命令
- EXPOSE:导出的端口
- ENV:环境变量
- VOLUME:卷挂载
- USER
- WORKDIR