什么是 Docker 镜像(image)?
- 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象;
- 镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包;
- 镜像可以运行一个或多个容器,同时镜像也可以停止某个容器的运行,并从中创建新的镜像;
镜像(iamge)的分类
镜像(image)常用命令
# 下载镜像(默认从远程公有镜像仓库服务Docker Hub中下载);
docker image pull
# 从Docker Hub的 apline 仓库中拉取【标签/版本】为latest的镜像;
docker image pull alpine:latest
# 从Docker Hub的 nginx 仓库中拉取【标签/版本】为latest的镜像;
docker image pull nginx:latest
# 拉取仓库中的全部镜像,参数 -a 所有all;
docker image pull -a nginx/xxx
# 列出本机Docker主机上存储的镜像(不显示标注内容),参数-a 所有all;
docker image ls -a 或者 docker images -a
# 查看 nginx 镜像安装信息;
docker image history nginx
# 查看 ubuntu 镜像分层信息,展示镜像所有细节(包含镜像层数据和元数据);
docker image inspect ubuntu:latest
# 删除 ubuntu:latest 镜像;
docker image rm ubuntu:latest
# 构建一个全新的镜像;
docker image build
查看镜像管理(command)命令配置参数
# 显示 image 对应管理命令的配置参数
docker image [具体命令名称] --help
参数过滤 --filter
# 返回悬虚(dangling/没有标签的镜像被称为悬虚镜像,在列表中展示为<none>:<none>)镜像;
docker image ls --filter dangling=true
# 移除全部的悬虚镜像,如果添加了-a 参数,Docker 会额外移除没有被使用的镜像(那些没有被任何容器使用的镜像);
docker image prune
Docker 目前支持如下的过滤器:
- dangling:可以指定 true 或者 false,仅返回悬虚镜像(true),或者非悬虚镜像(false)。
- before:需要镜像名称或者 ID 作为参数,返回在之前被创建的全部镜像。
- since:与 before 类似,不过返回的是指定镜像之后创建的全部镜像。
- label:根据标注(label)的名称或者值,对镜像进行过滤。
Docker image 命令应用示例
# reference 完成过滤并且仅显示标签为 latest 的示例;
docker image ls --filter=reference="*:latest"
# 参数 --format 通过 Go 模板对输出内容进行格式化,只返回 Docker 主机上镜像的大小属性;
docker image ls --format "{{.Size}}"
# 返回全部镜像,但是只显示仓库、标签和大小信息;
docker image ls --format "{{.Repository}}: {{.Tag}}: {{.Size}}"
CLI
方式搜索 Docker Hub
=》返回官方[official]或非官方[automated]镜像
# 简单模式,搜索所有“NAME=nginx”字段中包含特定字符串的仓库;
docker search nginx
# 返回 nginx 的内容只显示官方镜像;
docker search nginx --filters "is-official=true"
# 返回 nginx 的内容只显示非官方镜像;
docker search nginx --filters "is-automated=true"
# 说明:`docker search` 默认情况下,`Docker` 只返回 `25` 行结果 ,
# 可以通过参数 `--limit` 增加返回内容的行数,最多 `100` 行;
例如:docker search nginx --limit 60
Docker 文件操作
# 编辑index.html文件信息,vim 可能需要安装,Linux默认 vi;
vi/vim index.html
# 复制拷贝index.html文件到docker容器里面,后跟容器ID:存放路径;
docker cp index.html 41c15dlacff0://usr/share/nginx/html
# 删除镜像文件,后面可以是镜像名称或者镜像ID;
docker rm nginx
# 参数 -f 强行删除,且无提示;
docker rm -f xxx
# 删除文件夹及其子文件夹中的的所有文件,参数 -r 向下递归删除;
docker rm -rf xxx
# 移动或重命名;
docker mv
# 移动Dockerfile到 ../chait/下面;
docker mv Dockerfile ../chait/
# 重命名为docfile;
docker mv Dockerfile docfile
# 提交文件,参数 -m 文件名称,后跟原来镜像ID,新的镜像名称;
docker commit -m 'xxx' 41c15dlacff0 newimagename
Linux 常用基础命令
Linux 文件操作
# 查看该路径下面的所有文件;
ls
# 新增文件夹;
mkdir xxx
# 编辑文件;
vi / vim xxx
# 删除文件,参数-f 强制删除;
rm -f xxx
# 删除目录及所有子目录和文件,参数 -r 向下递归, -f 强制删除;
rm -rf xxx
# 查看文件内容;
cat xxx
# 退出并保存编辑内容;
:wq
# 安装 lrzsz 文件上传工具;
sudo apt install lrzsz
# 文件上传,基于 lrzsz;
rz
查看端口号
# 切换 root 用户;
su root
# 输出端口信息;
lsof -i:port
# 查看所有开启的端口号;
netstat -aptn
# 查看所有使用 udp 协议的端口号;
netstat -nupl
# 查看所有使用 tcp 协议的端口号;
netstat -ntpl
Linux 重启命令
# 重新启动
reboot [-n] [-w] [-d] [-f] [-i]
# 参数说明:
-n : 在重开机前不做将记忆体资料写回硬盘的动作
-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
-f : 强迫重开机,不呼叫 shutdown 这个指令
-i : 在重开机之前先把所有网络相关的装置先停止
除了上面的 reboot
命令,我们还可以使用 shutdown
命令
# 立刻重启
shutdown -r now
# 过10分钟自动重启
shutdown -r 10
# 在时间为20:35时候重启
shutdown -r 20:35
说明:如果是通过shutdown
命令设置重启的话,可以用shutdown -c
命令取消重启;
Linux 关机命令
# 立刻关机(一般加 -p 关闭电源)
halt [-n] [-w] [-d] [-f] [-i] [-p]
# 参数说明:
-n : 在重开机前不做将记忆体资料写回硬盘的动作
-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
-d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d)
-f : 强迫重开机,不呼叫 shutdown 这个指令
-i : 在重开机之前先把所有网络相关的装置先停止
# 立刻关机
poweroff
# 立刻关机
shutdown -h now
# 10分钟后自动关机
shutdown -h 10
说明:如果是通过shutdown
命令设置关机的话,可以用shutdown -c
命令取消关机;
删除资源,快速清理(暴力)
# 删除所有docker主机上面的image镜像, 参数 `-f` 强制删除
rm $(docker image ls -a) -f
# 删除所有 `docker` 主机上面的 `container` (容器 id 删除)
docker container rm $(docker container ls -aq)
(推荐)优雅方式:stop
再 rm
=》先暂停,在删除;
重启 doker 服务
# 启动 docker 服务;
systemctl start docker
# 重启守护进程 daemon;
sudo systemctl daemon-reload
# 重启 docker 服务;
systemctl restart docker
# 重启 docker 服务;
sudo service docker restart
# 关闭 docker 服务;
service docker stop
# 关闭 docker 服务;
systemctl stop docker
镜像(image)的命令集合
# 查看 image 所有管理命令
docker image --help
什么是 Docker 容器(container)?
容器(container)是镜像(image)的运行实例,一个镜像可以创建多个容器(1:n);
1、容器 & 虚拟机(VM)的区别?
容器启动更快并且更轻量级,与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。
2、镜像 & 容器的区别?
- 状态不同,镜像是构建时(
build-time
)结构,容器是运行时(run-time
)结构; - 镜像只读不可写入,容器即可读取也可写入;
3、镜像 & 容器的关系?
- 一个镜像可以构建多个容器,1:n 一对多关系;
- 容器的设计初衷就是快速和小巧,所以镜像通常都比较小。
- 容器的创建依赖镜像基础;
docker container run
docker service create
从某个镜像启动一个或多个容器。一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。尝试删除镜像而不停止或销毁使用它的容器,会导致出错;
关于镜像的说明
1、镜像通常比较小
【容器(container)目的】就是运行应用或者服务,这意味着容器的镜像中必须包含应用/服务运行所必需的操作系统和应用文件。
但是,容器又追求快速和小巧,这意味着构建镜像的时候通常需要裁剪掉不必要的部分,保持较小的体积。
例如:Docker 镜像通常不会包含 6 个不同的 Shell
让读者选择,通常情况 Docker
镜像中只有一个精简的 Shell
,甚至没有 Shell
。
2、镜像中还不包含内核
容器都是共享所在 Docker
主机的内核。所以有时会说容器仅包含必要的操作系统(通常只有操作系统文件和文件系统对象)。
提示:Hyper-V
容器运行在专用的轻量级VM
上,同时利用VM
内部的操作系统内核。
Docker
官方镜像 Alpine Linux
大约只有 4MB
,可以说是 Docker
镜像小巧这一特点的比较典型的例子。
但是,镜像更常见的状态是如 Ubuntu
官方的 Docker
镜像一般,大约有 110MB
。这些镜像中都已裁剪掉大部分的无用内容。
3、Windows 镜像要比 Linux 镜像大一些(这与 Windows OS 工作原理相关)
比如:
- 未压缩的最新
Microsoft .NET
镜像(microsoft/dotnet:latest
)超过1.7GB
。 Windows Server 2016 Nano Server
镜像(microsoft/nanoserver:latest
)在拉取并解压后,其体积略大于1GB
。
容器(container)常用命令
# 指定了启动所需的镜像以及要运行的应用;
docker container run <image> <app>
# 启动 ubuntu 容器,并运行 Bash Shell 作为其应用;
docker container run -it ubuntu /bin/bash
# 启动 nanoserver 容器,并运行 PowerShell 作为其应用;
docker container run -it microsoft- /powershell:nanoserver pwsh.exe
# 命令会在前台启动一个 Ubuntu 容器,并运行 Bash Shell;
docker container run -it ubuntu /bin/bash
【Ctrl+PQ】会断开 Shell 和容器终端之间的链接,并在退出后保持容器在后台处于运行(UP)状态。
参数 -it
可以将当前终端连接到容器的 Shell
终端之上。
容器随着其中运行应用的退出而终止,其中 Linux
容器会在 Bash Shell
退出后终止,而 Windows
容器会在 PowerShell
进程终止后退出。验证方法就是启动新的容器,并运行 sleep
命令休眠 10s
,容器会启动,然后运行休眠命令,在 10s 后退出,执行如下命令:
docker container run alpine:latest sleep 10
docker container
其他命令
# 列出所有在运行(UP)状态的容器。如果使用 -a 标记,还可以看到处于停止(Exited)状态的容器。
docker container ls
# 命令会在容器内部启动一个 Bash Shell 进程,并连接到该 Shell(用于创建容器的镜像必须包含 Bash Shell,该命令在将 Docker 主机 Shell 连接到一个运行中容器终端时非常有用);
docker container exec -it <container-name or container-id> bash
# 停止运行中的容器,并将状态置为 Exited(10s 停止);
docker container stop <container-name or container-id>
# 重启 Exited 状态的容器;
docker container start <container-name or container-id>
# 删除停止运行的容器;
docker container stop <container-name or container-id>
# 显示容器的分层配置细节和运行时信息;
docker container inspect <container-name or container-id>
容器(container)命令集
# 查看容器所有管理命令
docker container --help
检查 Docker daemon(守护进程)
docker version
如果 server
部分中包含了错误码,表示 Docker daemon
很可能没有运行,或者当前用户无权限访问;
解决 Linux 中无权限访问
- 确认当前用户是否属于本地
Docker UNIX
组,如果不是,通过【usermod -aG docker <user>
】添加,退出重新登录Shell
,修改生效; - 用户属于
docker
用户组,可能是Docker daemon
没有运行导致,根据Docker
主机的操作系统选择如下对应的命令检查daemon
状态;
//使用 Systemd 在 Linux 系统中执行该命令
$ service docker status
docker start/running, process 29393
//使用 Systemd 在Linux 系统中执行该命令
$ systemctl is-active docker
active
//在Windows Server 2016的 PowerShell 窗口中运行该命令
> Get-Service docker
Status Name DisplayName
------ ---- -----------
Running Docker docker
Docker 命令集
# 查看 docker 中所有管理命令;
docker --help
# 查看 docker 信息;
docker --info
管理命令 Management Commands
: