目录
Docker是什么
Docker解决什么问题
- 统一运行环境,测试环境和开发环境一致,版本和配置一致
- 标准化、快速化的系统平滑迁移
- 打破代码或程序即应用的观念,通过镜像将系统内核移除,自下向上打包应用,跨平台、跨服务器移植
新一代开发工程师:
coder -> programmer -> software engineer -> DevOps engineer
Docker的理念
基于Go语言实现,主要目标是:"Build, Ship and Run Any App, Anywhere"。通过对应用组件的封装、分发、部署和运行,使得App及其运行环境能够一次镜像,处处运行。
Docker解决了运行环境和配置问题的软件容器,方便持续集成,是一种有助于整体发布的容器虚拟化技术。Docker借鉴了标准集装箱的概念,集装箱运输货物,Docker运输软件。
一次构建,处处运行:
- 快速的应用交付和部署
- 便捷的升级和扩缩容
- 简单的系统运维
- 高效的计算资源利用
- 应用场景:
Docker基本组成
Docker本身是一个容器运行载体或管理引擎。将App和配置依赖一起打包为一个可交付的运行环境,即image镜像文件,然后通过这个镜像文件生成Docker容器实例。
镜像(image)
- 镜像是一个只读模板,用来创建Docker容器,一个镜像可以创建多个容器;
- 镜像相当于容器的源代码,类比Java代码:镜像->类模板;容器->new出来的实例对象
容器(container)
从面向对象角度来看:容器是用镜像创建的运行实例,类似于一个虚拟化的运行环境。提供一个标准的隔离环境,可以被启动、开始、停止、和删除。
从镜像容器角度来看:类似于一个简易版的Linux环境(包括root用户权限、进程空间、用户空间、网络空间)和运行在其中的应用程序。
仓库(registry)
- 集中存放镜像文件的地方,类似于Maven仓库、github仓库;
- Docker容器提供的官方仓库为Docker Hub;
- 仓库分为公开仓库和私有仓库,Docker Hub是最大的公开仓库,供用户免费下载使用
Docker平台架构
Docker是一个C/S架构,运行基本流程为:
- Docker Client和Docker Daemon建立通信,并发送请求给后者 Docker
- Daemon为架构主体,首先提供Docker Server功能,使其可以接受请求 Docker
- Engine执行,每一项工作都是以Job形式运行
- Job运行中,需要容器镜像时,从Registry中下载镜像,并通过镜像管理驱动(Graph driver)将下载的镜像以Graph存储
- 需要为Docker创建网络环境时,通过网络管理驱动(Network driver)创建并配置容器网络
- 需要限制Docker容器运行资源或执行用户指令时,通过Exec driver来完成
- Libcontainer是一个独立的容器管理包,Network driver和Exec driver通过它来实现具体对容器的操作
Docker基本实现原理
三步走:
- 使用操作系统的 namespace隔离系统资源技术,隔离:网络、PID进程、系统信号量、文件系统挂载、主机名、域名,来实现同一宿主机系统中,容器之间的隔离和互不干扰
powershell
# 进程
ps aux | grep ssh
# namespace
ls -lah /proc/pidxxx/ns/
- 使用操作系统的cgroups系统资源配额功能,限制资源:CPU、没存、块设备、网络
powershell
# 查看系统实现的资源限制
cat /proc/cgroups
- 通过OverlayFS数据存储技术,实现容器镜像的物理存储和新建容器存储
- OverlayFS是一种堆叠文件系统,依赖并建立在其它的文件系统之上,如:ext4fs、xfs等,OverlayFS不参与磁盘空间的划分,只是将原来系统文件中的文件和目录进行"合并",最终给用户呈现"合并"的文件,称为联合挂载技术
- Linux内核为Docker提供了两种驱动:Overlay和Overlay2。后者相对于前者有改进,在Inode利用率方面比Overlay更高效。
- OverlayFS的实现方式:
通过三个目录:lower目录、upper目录、work目录来实现。lower 目录可以是多个,upper 目录可以进行读写操作的目录,而 work 目录为工作基础目录,挂载后内容会被清空,并且在使用过程中其内容用户是不可见的,最后联合挂载完成之后给用户呈现的统一视图就被称为 merged 目录。
Docker常用命令
powershell
systemctl start docker # 启动docker
systemctl stop docker # 停止docker
systemctl restart docker # 重启docker
systemctl status docker # 查看docker状态
systemctl enable docker # 开机自动启动docker
docker info # 查看docker概要信息
docker images [-qa] # 列出本地主机上的镜像 -q: 只列出ID, -a: 列出所有,包括历史镜像
docker search redis(镜像名称) # 搜索镜像
docker pull mysql:5.7(镜像名称[:TAG]) # 拉取镜像,没有 TAG 就表示 latest
docker system df # 查看镜像、容器、数据卷所占的空间
# 删除镜像
docker rmi [-f] ubuntu
docker rmi [-f] mysql:5.7
# 强制删除所有镜像
docker rmi -f $(docker images -qa)
docker logs [-f] 容器名称|容器ID # 查看容器日志
docker top 容器名称|容器ID # 查看容器内运行的进程
docker inspect 容器名称|容器ID # 查看容器内部细节
docker exec -it 容器名称|容器ID [COMMAND] # 进入正在运行的容器并以命令行交互 eg:docker exec -it redis /bin/bash
# 容器和主机文件的互相拷贝
docker cp CONTAINER:SRC_PATH DEST_PATH|- # 拷贝容器中的文件到主机 eg: docker cp redis:/data/a.txt .
docker cp SRC_PATH|- CONTAINER:DEST_PATH # 拷贝主机文件到容器内
docker ps [-qa] # 列出当前正在运行的容器 -q: 只显示容器编号, -a: 列出所有,包括历史上运行过的
docker start/restart/stop 容器名称或容器ID
docker kill 容器名称或容器ID # 强制停止容器
docker rm [-f] 容器名称或容器ID # 删除已停止的容器
# 一次强制删除多个容器
docker rm -f $(docker ps -qa)
docker ps -qa | xargs docker rm -f
# 新建和启动容器,前提是有镜像
docker run [OPTIONS] 镜像名称|镜像ID [COMMAND] [ARG...]
# eg: docker run -it --name=ubuntu ubuntu:20.04 /bin/bash
- OPTIONS(可选项):
○ --name="容器名称",为容器指定一个名称。
○ -d:后台运行容器并返回容器 ID ,即启动守护式容器(后台运行)。
○ -i:以交互模式运行容器,通常和 -t 同时使用。
○ -t:为容器重新分配一个伪输入终端,通常和 -i 同时使用,即启动交互式容器(前台有伪终端,等待交互)。
○ -P:随机端口映射。
○ -p:指定端口映射。
○ --dns 8.8.8.8:指定容器使用的 DNS 服务器,默认和宿主一致。
○ --dns-search example.com:指定容器 DNS 搜索域名,默认和宿主一致。
○ -h "mars":指定容器的 hostname 。
○ -e username="dog":设置环境变量。
○ --env-file=[]:从指定文件读入环境变量。
○ --cpuset="0-2" or --cpuset="0,1,2":绑定容器到指定 CPU 运行。
○ -m:设置容器使用内存最大值。
○ --network="bridge":指定容器的网络连接类型,支持 bridge 、host 、none、container 四种类型,默认 bridge 。
○ --link=[]:添加链接到另一个容器。
○ --expose=[]:开放一个端口或一组端口。
○ --restart :指定重启策略,可以写 --restart=awlays 总是故障重启。
○ --volume , -v::绑定一个卷。一般格式为 主机文件或文件夹:虚拟机文件或文件夹 。 - COMMAND(启动命令)。
- ARG(启动参数)。
总结
命令 描述
attach 当前 shell 下 attach 连接指定运行镜像。
build 通过 Dockerfile 定制镜像。
commit 提交当前容器为新的镜像。
cp 从容器中拷贝指定文件或者目录到宿主机中。
create 创建一个新的容器,同 run,但不启动容器。
diff 查看 docker 容器变化。
events 从 docker 服务获取容器实时事件。
exec 在已存在的容器上运行命令。
export 导出容器的内容流作为一个 tar 归档文件[对应 import ]。
history 展示一个镜像形成历史。
images 列出系统当前镜像。
import 从tar包中的内容创建一个新的文件系统映像[对应 export ]。
info 显示系统相关信息。
inspect 查看容器详细信息。。
kill kill 指定 docker 容器
load 从一个 tar 包中加载一个镜像[对应 save ]。
login 注册或者登陆一个 docker 源服务器。
logout 从当前 Docker registry 退出。
logs 输出当前容器日志信息。
port 查看映射端口对应的容器内部源端口。
pause 暂停容器。
ps 列出容器列表。
pull 从docker镜像源服务器拉取指定镜像或者库镜像。
push 推送指定镜像或者库镜像至docker源服务器。
restart 重启运行的容器。
rm 移除一个或者多个容器。
rmi 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]。
run 创建一个新的容器并运行一个命令。
save 保存一个镜像为一个 tar 包[对应 load ]。
search 在 docker hub 中搜索镜像。
start 启动容器。
stop 停止容器。
tag 给源中镜像打标签。
top 查看容器中运行的进程信息。
unpause 取消暂停容器。
version 查看 docker 版本号。
wait 截取容器停止时的退出状态值。