什么是Docker 镜像(image)?

  • 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象;
  • 镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包;
  • 镜像可以运行一个或多个容器,同时镜像也可以停止某个容器的运行,并从中创建新的镜像;

【镜像(iamge)的分类】


【镜像(image)常用命令】

  • docker image pull =》下载镜像(默认从远程公有镜像仓库服务Docker Hub中下载);
  • docker image pull alpine:latest =》从Docker Hub的 apline 仓库中拉取【标签/版本】为latest的镜像;
  • docker image pull nginx:latest =》从Docker Hub的 nginx 仓库中拉取【标签/版本】为latest的镜像;
  • docker image pull -a nginx/xxx =》拉取仓库中的全部镜像,参数 -a 所有all;
  • docker image ls -a 或者 docker images -a =》列出本机Docker主机上存储的镜像(不显示标注内容),参数-a 所有all;
  • docker image history nginx =》查看 nginx 镜像安装信息;
  • docker image inspect ubuntu:latest =》查看 ubuntu 镜像分层信息,展示镜像所有细节(包含镜像层数据和元数据);
  • docker image rm ubuntu:latest =》删除 ubuntu:latest 镜像;
  • docker image build =》构建一个全新的镜像;

【查看镜像管理(command)命令配置参数】

  • docker image [具体命令名称] --help =》显示 image 对应管理命令的配置参数

【参数过滤 --filter】

  • docker image ls --filter dangling=true =》返回悬虚(dangling/没有标签的镜像被称为悬虚镜像,在列表中展示为<none>:<none>)镜像;

  • docker image prune =》 移除全部的悬虚镜像,如果添加了-a 参数,Docker 会额外移除没有被使用的镜像(那些没有被任何容器使用的镜像);

Docker 目前支持如下的过滤器:
    dangling:可以指定 true 或者 false,仅返回悬虚镜像(true),或者非悬虚镜像(false)。
    before:需要镜像名称或者 ID 作为参数,返回在之前被创建的全部镜像。
    since:与 before 类似,不过返回的是指定镜像之后创建的全部镜像。
    label:根据标注(label)的名称或者值,对镜像进行过滤。

    docker image ls --filter=reference="*:latest" =》 reference 完成过滤并且仅显示标签为 latest 的示例;
    docker image ls --format "{{.Size}}" =》 参数 --format 通过 Go 模板对输出内容进行格式化,只返回 Docker 主机上镜像的大小属性;
    docker image ls --format "{{.Repository}}: {{.Tag}}: {{.Size}}" =》返回全部镜像,但是只显示仓库、标签和大小信息;

【CLI 方式搜索 Docker Hub】=》返回官方[official]或非官方[automated]镜像

  • docker search nginx =》简单模式,搜索所有“NAME=nginx”字段中包含特定字符串的仓库;
  • docker search nginx --filters "is-official=true" =》返回 nginx 的内容只显示官方镜像;
  • docker search nginx --filters "is-automated=true" =》返回 nginx 的内容只显示非官方镜像;

注:【docker search】默认情况下,Docker 只返回 25 行结果 ,可以通过参数 --limit 增加返回内容的行数,最多100行;

例如:docker search nginx --limit 60

【Docker 文件操作】

  • vi/vim index.html =》编辑index.html文件信息,vim 可能需要安装,Linux默认 vi;
  • docker cp index.html 41c15dlacff0://usr/share/nginx/html =》 复制拷贝index.html文件到docker容器里面,后跟容器ID:存放路径;
  • docker rm nginx =》 删除镜像文件,后面可以是镜像名称或者镜像ID;
  • docker rm -f xxx =》 参数 -f 强行删除,且无提示;
  • docker rm -rf xxx =》 删除文件夹及其子文件夹中的的所有文件,参数 -r 向下递归删除;
  • docker mv =》 移动或重命名;
  • docker mv Dockerfile ../chait/ =》 移动Dockerfile到 ../chait/下面;
  • docker mv Dockerfile docfile =》重命名为docfile;
  • docker commit -m 'xxx' 41c15dlacff0 newimagename =》 提交文件,参数 -m 文件名称,后跟原来镜像ID,新的镜像名称;

【Linux 文件操作】

  • ls =》 查看该路径下面的所有文件;
  • mkdir xxx =》 新增文件夹;
  • vi / vim xxx =》编辑文件;
  • rm -f xxx =》 删除文件,参数-f 强制删除;
  • rm -rf xxx =》 删除目录及所有子目录和文件,参数 -r 向下递归, -f 强制删除;
  • cat xxx =》 查看文件内容;
  • :wq =》 退出并保存编辑内容;
  • sudo apt install lrzsz =》安装lrzsz文件上传工具;
  • rz =》文件上传,基于 lrzsz;

【查看端口号】

  • su root =》切换root用户;
  • lsof -i:port =》输出端口信息;
  • netstat -aptn =》查看所有开启的端口号;
  • netstat -nupl =》查看所有使用udp协议的端口号;
  • netstat -ntpl=》查看所有使用tcp协议的端口号;

【Linux重启命令 】
    1、reboot 
    2、shutdown -r now 立刻重启
    3、shutdown -r 10 过10分钟自动重启
    4、shutdown -r 20:35 在时间为20:35时候重启

    如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启;

【Linux关机命令】
    1、halt   立刻关机(一般加-p 关闭电源)
    2、poweroff 立刻关机 
    3、shutdown -h now 立刻关机
    4、shutdown -h 10 10分钟后自动关机 

    如果是通过shutdown命令设置关机的话,可以用shutdown -c命令取消关机;

【快速清理(暴力)】

  • rm $(docker image ls -a)  -f =》删除所有docker主机上面的image镜像, 参数 -f 强制删除
  • docker container rm $(docker container ls -aq) =》删除所有docker主机上面的container (容器Id删除)

优雅方式:stop 再 rm=》先暂停,在删除;

【重启doker服务】

  • systemctl start docker =》启动docker服务;
  • sudo systemctl daemon-reload =》重启守护进程daemon;
  • systemctl restart  docker =》重启docker服务;
  • sudo service docker restart =》重启docker服务;
  • service docker stop =》关闭docker服务;
  • systemctl stop docker =》关闭docker服务;

【镜像的命令集合】

  • docker image --help =》查看 image 所有管理命令


什么是Docker 容器(container)?

  • 容器是镜像的运行实例,一个镜像可以创建多个容器;
  • 容器与虚拟机的区别:容器启动更快并且更轻量级,与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。

【镜像 & 容器的区别】

  • 状态不同,镜像是构建时(build-time)结构,容器是运行时(run-time)结构;
  • 镜像只读不可写入,容器即可读取也可写入;

【镜像 & 容器的关系】

  • 一个镜像可以构建多个容器,1:n 一对多关系;
  • 容器的设计初衷就是快速和小巧,所以镜像通常都比较小。命令【docker container run 】和【 docker service create】=》从某个镜像启动一个或多个容器。一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。尝试删除镜像而不停止或销毁使用它的容器,会导致出错;

镜像通常比较小

容器目的就是运行应用或者服务,这意味着容器的镜像中必须包含应用/服务运行所必需的操作系统和应用文件。

但是,容器又追求快速和小巧,这意味着构建镜像的时候通常需要裁剪掉不必要的部分,保持较小的体积。

例如,Docker 镜像通常不会包含 6 个不同的 Shell 让读者选择——通常 Docker 镜像中只有一个精简的Shell,甚至没有 Shell。

 

镜像中还不包含内核——容器都是共享所在 Docker 主机的内核。所以有时会说容器仅包含必要的操作系统(通常只有操作系统文件和文件系统对象)。提示:Hyper-V 容器运行在专用的轻量级 VM 上,同时利用 VM 内部的操作系统内核。

 

Docker 官方镜像 Alpine Linux 大约只有 4MB,可以说是 Docker 镜像小巧这一特点的比较典型的例子。

但是,镜像更常见的状态是如 Ubuntu 官方的 Docker 镜像一般,大约有 110MB。这些镜像中都已裁剪掉大部分的无用内容。

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> =》指定了启动所需的镜像以及要运行的应用;
  • docker container run -it ubuntu /bin/bash =》启动 ubuntu 容器,并运行 Bash Shell 作为其应用;
  • docker container run -it microsoft- /powershell:nanoserver pwsh.exe =》启动 nanoserver 容器,并运行 PowerShell 作为其应用;
  • docker container run -it ubuntu /bin/bash =》命令会在前台启动一个 Ubuntu 容器,并运行 Bash Shell;

【Ctrl+PQ】会断开 Shell 和容器终端之间的链接,并在退出后保持容器在后台处于运行(UP)状态。

参数 -it 可以将当前终端连接到容器的 Shell 终端之上。容器随着其中运行应用的退出而终止,其中 Linux 容器会在 Bash Shell 退出后终止,而 Windows 容器会在 PowerShell 进程终止后退出。验证方法就是启动新的容器,并运行 sleep 命令休眠 10s,容器会启动,然后运行休眠命令,在 10s 后退出 =》docker container run alpine:latest sleep 10

  • docker container ls =》列出所有在运行(UP)状态的容器。如果使用 -a 标记,还可以看到处于停止(Exited)状态的容器。
  • docker container exec -it <container-name or container-id> bash  =》命令会在容器内部启动一个 Bash Shell 进程,并连接到该 Shell(用于创建容器的镜像必须包含 Bash Shell,该命令在将 Docker 主机 Shell 连接到一个运行中容器终端时非常有用);
  • docker container stop <container-name or container-id> =》停止运行中的容器,并将状态置为 Exited(10s 停止);
  • docker container start <container-name or container-id> =》重启 Exited 状态的容器;
  • docker container stop <container-name or container-id> =》删除停止运行的容器;
  • docker container inspect <container-name or container-id> =》显示容器的分层配置细节和运行时信息; 

【容器(container)命令集】

  • docker container --help =》查看容器所有管理命令

【检查Docker daemon(守护进程)】

如果 server 部分中包含了错误码,表示 Docker daemon 很可能没有运行,或者当前用户无权限访问;

【解决Linux中无权限访问】

  1. 确认当前用户是否属于本地 Docker UNIX 组,如果不是,通过【usermod -aG docker <user>】添加,退出重新登录Shell,修改生效;
  2. 用户属于 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 --help =》查看 docker 中所有管理命令;
  • docker --info =》查看 docker 信息;

  •  管理命令 Management Commands:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐