Docker 镜像(image)& 容器(container)
什么是Docker镜像(image)?镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象;镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包;镜像可以运行一个或多个容器,同时镜像也可以停止某个容器的运行,并从中创建新的镜像;【镜像(iamge)的分类】【镜像的命令集合】什么是Docker容器(container)?容器是镜...
什么是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中无权限访问】
- 确认当前用户是否属于本地 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 --help =》查看 docker 中所有管理命令;
- docker --info =》查看 docker 信息;
- 管理命令 Management Commands:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)