Docker篇(二):Docker实战,命令解析
wptr33 2024-11-12 14:21 44 浏览
大家好,我是杰哥
上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术
所以,本周我们将进入Docker的实战
进入实战前,先回顾一下Docker的架构图
我们看到,Docker实际上使用的是客户端-服务器架构。我们是作为客户端向Docker发送命令,与Docker守护进程进行对话,由守护进程完成命令的分发、运行和构建动作。那么,也就是说,我们只要掌握了Docker的执行命令,也就自会使用Docker了
一 理论
Docker命令,混个眼熟
总得来说,Docker的命令,从操作对象来说,包含仓库、镜像以及容器的三种类型。其中,我们把容器的命令分为容器生命周期管理和容器的操作命令,并加入进了简单却很重要的帮助命令
温馨提示1
结合github思想以及linux命令知识,进行对比理解这些命令,方可快速get哦~
1 帮助命令
1)docker version
显示docker的版本信息
2)docker info
比docker version更强大。除了显示docker的版本信息外,还显示docker的系统信息,包括镜像和容器等
我们可以看到,docker中的容器总数,正在运行、暂停以及停止状态的个数,还有镜像的个数等信息
3)docker help
不得不说,它是最万能的命令,也是我们可以用来自己学习docker命令的最全最便捷的资料
执行docker help,可以看到会显示三类命令的使用说明:docker已经给定的配置命令、管理命令以及我们常用的操作命令三类。而实际上,我们只需要关心第三类即可
事先声明
以下说的image,指的是镜像名称:TAG的组合。若只有镜像名称,则表示该镜像的TAG为latest
2 仓库命令
即操作对象为仓库的相关命令,包括登录到仓库、从仓库拉取镜像、往仓库上传本地镜像以及从仓库中查找镜像等命令
1)docker login
登录到docker hub
- docker login -u 用户名 -p 密码
2)docker pull
从镜像仓库中拉取或者更新指定镜像
- docker pull image
3)docker push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
- docker push image
4)docker search
从docker hub上查找镜像
- docker search image
3 本地镜像管理
1)docker images
- 列出本地镜像列表
- docker images
2)docker rmi
- 删除镜像
- docker rmi image
3)docker build
- 构建镜像,用来将一个Dockerfile构建成镜像
- docker build [OPTIONS] PATH | URL | -
4)docker history
- 查看指定镜像的创建历史
- docker history image
5)docker save
- 将指定镜像保存为tar文件
- docker save -o test.tar image
6)docker load
- 导入使用docker save保存的tar镜像
- docker load --input test.tar
4 容器生命周期管理
容器的生命周期管理命令,即对容器进行新建、启动、停止、暂停、删除等操作,可以参考线程的生命周期来对比学习
1)docker run
运行镜像,相当于新建一个容器
docker run containerId2)docker start
启动一个或多个已经被停止的容器
docker start containerId3)docker stop
停止一个正在运行的容器
docker stop containerId4)docker restart
重启容器
docker restart containerId5)docker kill
杀掉一个运行中的容器
docker kill containerId- 相比kill,stop给了容器自行处理结束的时间,更为优雅
6)docker rm
删除容器,与kill的效果一样,即直接删除当前的容器
docker rm containerId7)docker pause
暂停正在运行的容器
- docker pause containerId
8)docker unpause
恢复运行容器
docker unpause containerId9)docker create
创建容器
docker create containerId与docker run image表达的效果一样
10)docker exec
在运行中的容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]- -d :分离模式: 在后台运行
- -i :即使没有附加也保持STDIN 打开
- -t :分配一个伪终端
5 容器操作
包括对容器的查看、容器日志获取等命令
1)docker ps
查看容器列表
docker ps2)docker inspect
查看容器具体信息
docker inspect containerId3)docker top
查看容器中运行的进程信息,支持 ps 命令参数
docker top containerId4)docker attach
连接到正在运行中的容器
docker attatch containerId5)docker logs
查看容器日志
docker -f --tail=10 containerId6)docker export
将文件系统作为一个tar归档文件导出到STDOUT
docker export containerId7)docker port
列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
docker port8)docker commit
提交镜像,即从容器创建一个新的镜像
docker commit containerId9)docker cp
用于容器与主机之间的数据拷贝
docker cp CONTAINER:SRC_PATH DEST_PATH|好了,浏览完这些常用的命令,接下来就进入实战啦
可能你会觉得,这些命令大部分都很生疏呀
没关系,从实战中学习,边练边学,谁不是从跑起来一个demo开始慢慢学习一门技术的?用着用着就熟悉啦
我们通过在docker中安装运行一个tomcat来进行这些命令的实际应用
二 实战
Docker安装tomcat
1 查看本地镜像 docker images
2 删除不再使用的镜像 docker rmi imageId
删除掉不再使用的hello-world镜像吧,执行docker rmi bf756fb1ae65
提示
Error response from daemon: conflict: unable to delete bf756fb1ae65 (must be forced) - image is being used by stopped container a95514aca795那就使用强制删除命令:docker rmi -f imageId,即删除命令后加"-f"
提示删除成功
3 检验
再次运行docker images,查看当前的镜像,hello-world镜像已被成功删除
4 搜索镜像
执行docker search tomcat
会出来一堆镜像,默认是按照star的数量排序的,并且前几个往往标明了是官方版(official),一般默认是选择第一个啦
5 拉取镜像至本地
选择好镜像以后,我们执行docker pull tomcat从仓库中,将该镜像拉取到本地
在不指定版本时,它下载的就默认是latest,即最新版本的tomcat
6 查看镜像
执行docker images
我们看到,本地就多了一个latest版本的tomcat,大小为649M
什么?wait a moment......
649M?!这......也太大了吧,大家不是都说docker的镜像比较小吗?我这是不是哪里出现问题了?
是呀,最开始我也怀疑呀!
但是,经过一步深入探究,就慢慢豁然开朗了
来来来,你可以细品一下
Tips1
你也知道,docker的出现,就是为了解决传统从开发到运维之间的交付缓慢等问题。它最终是将软件和软件运行环境,即代码及其运行需要的环境打包为一个镜像包,进行交付的
那么,也就是说,tomcat镜像就不仅仅包含tomcat,还包含tomcat运行的各种环境:kernel、centos以及java环境这些咯
这不,一下子就恍然大悟了!
好,顺利地消除了疑问,那就继续往下走
7 运行镜像
执行docker run命令,运行tomcat镜像,即创建一个tomcat容器
docker run --name tomcat
-itd
--privileged=true
-v /Users/wangjie/Downloads/documents/webapp:/usr/local/tomcat/webapps/webapp
-p 8080:8080
tomcat运行一个名称为tomcat的tomcat镜像,开启运行权限,并指定容器卷:指定本地目录和docker目录的相互映射(其实就是相互共享,感兴趣可以测试一下),并指定映射端口为8080
Tips2
选项 | 简写 | 说明 |
–detach | -d | 在后台运行容器,并且打印容器id。 |
–interactive | -i | 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。 |
–volumn | -v | 绑定一个容器卷 |
–tty | -t | 分配一个伪tty,一般与 -i 连用 |
8 查看容器
执行docker ps,查看当前的容器列表
发现tomcat已经成功运行,并且容器号为f4d4541dfead
9 查看容器日志
执行
docker logs -f --tail=10 f4d4541dfead查看tomcat的日志
其中-f和--tail与linux中的相应命令的含义完全一致,即
-f:跟踪日志输出
--tail:显示尾部(最新)多少行数的日志信息我们看到,在docker中已经成成功启动了一个端口为8080的tomcat服务器
由于在启动的时候我们也通过“-p 8080:8080”做好了主机与docker的8080端口的映射。
那么按照正常逻辑来讲,我们请求链接:http://localhost:8080/,页面就会显示tomcat的介绍页面
带着期待,进入测试环节~
10 测试
访问链接:http://localhost:8080/
奇怪,居然是404?
莫慌,回想一下,既然正常启动了,就首先肯定不是服务本身的问题,那就要么是端口映射不正确、防火墙未关闭。检查过,这些可能的原因全部被排除了
那会是什么原因呢?
404的话,难道,是webapps下没有对应的html文件?!这,不太可能吧,一边摇着头一边进行排查
1)进入tomcat根目录
执行命令
docker exec -it 6ea8e9882ae6 /bin/bash进入tomcat容器的根目录
Tips3
docker attach 也可以直接进入正在运行的tomcat容器,也就是说
docker attach 6ea8e9882ae6与命令
docker exec -it 6ea8e9882ae6 /bin/bash是相同的效果
但是,本人在真实测试的时候,执行前者,却根本卡住进不去,于是索性采用了后者,难道是最新版本将docker attach命令给排除了?! 有可能呢,所以建议大家进入容器可以采用 docker exec命令即可
2)进入webaps目录
并没有东西,但是查看webapps.dist下是有文件的,这,那就试试把这个文件换成webapps
于是分别执行
mv webapps webapps2
mv webapps.dist/ webapps备份好之前的webapps目录,然后将webapps.dist目录名称修改为webapps
重新刷新页面
你说神奇不神奇,这就成功了!
11 暂停容器
执行docker pause f4d4541dfead,暂停当前容器
12 恢复容器
执行docker unpause f4d4541dfead,恢复已暂停的容器
13 重启容器
执行docker restart f4d4541dfead,重启容器
14 杀掉tomcat容器
执行docker kill f4d4541dfead,杀掉正在运行的容器
15 查看端口
执行命令
docker port f4d4541dfead查看该tomcat对外映射的端口情况
16 导出容器为一个tar包
执行命令
docker export -o tomcat-`date +%Y%m%d`.tar f4d4541dfead导出tomcat容器为一个名为tomcat-当前日期.tar的tar文件
查看当前目录,就存在了这个文件
17 创建新镜像
说实话,在进行tomcat安装之前,我并不知道过程中会出现这个小插曲(启动之后并不能直接访问的问题)。不过也刚好,干脆我们把这个修改之后的tomcat容器,重新创建为一个新的镜像
1)创建镜像
执行命令
docker commit 6ea8e9882ae6 mytomcat:1.1那么,我们以后使用的话就可以直接使用我们自己创建的这个镜像了
试着运行一下我们自己的这个镜像,
2)运行镜像
执行命令
docker run --name mytomcat
-itd
--privileged=true
-p 8088:8080 mytomcat:1.1启动镜像
3)页面测试
成功运行~
到现在为止,docker命令的实战环节结束~
温馨提示2
此时再回过头浏览一下那些命令,学习效果会更佳哦~
三 总结
总而言之
好了,Docker实战篇圆满结束~我们分别总结了以下几种类型的命令:
1 帮助命令
2 仓库命令
3 本地镜像管理命令
4 容器生命周期管理命令
5 容器操作命令
并通过在docker中安装运行tomcat镜像的实战操作,实际应用了这些命令,让大家对于这些命令也有了进一步的认识(当然我这边列出来的并不是docker的所有命令,你也可以自己去再探索剩余的命令,进行练习),个人觉得受益匪浅,相信对你会有帮助。只要你跟我一样,也去实践了一遍~
因为,真正动手实践,与你知道了理论的效果,还是不一样的
嗯,就这样。每天学习一点,时间会见证你的强大~
下期预告:
Docker篇(三):Dockerfile实战开启
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
