点击蓝字关注我们
大家好,我是杰哥
上周我们通过几个问题,让大家对于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 containerId
2)docker start
启动一个或多个已经被停止的容器
docker start containerId
3)docker stop
停止一个正在运行的容器
docker stop containerId
4)docker restart
重启容器
docker restart containerId
5)docker kill
杀掉一个运行中的容器
docker kill containerId
相比kill,stop给了容器自行处理结束的时间,更为优雅
6)docker rm
删除容器,与kill的效果一样,即直接删除当前的容器
docker rm containerId
7)docker pause
暂停正在运行的容器
docker pause containerId
8)docker unpause
恢复运行容器
docker unpause containerId
9)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 ps
2)docker inspect
查看容器具体信息
docker inspect containerId
3)docker top
查看容器中运行的进程信息,支持 ps 命令参数
docker top containerId
4)docker attach
连接到正在运行中的容器
docker attatch containerId
5)docker logs
查看容器日志
docker -f --tail=10 containerId
6)docker export
将文件系统作为一个tar归档文件导出到STDOUT
docker export containerId
7)docker port
列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
docker port
8)docker commit
提交镜像,即从容器创建一个新的镜像
docker commit containerId
9)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 webapps2mv 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实战开启
往期精彩回顾
SpringCloud篇章
Spring Cloud(十三):Feign居然这么强大?
Spring Cloud(十):消息中心篇-Kafka经典面试题,你都会吗?
Spring Cloud(九):注册中心选型篇-四种注册中心特点超全总结
Spring Cloud(四):公司内部,关于Eureka和zookeeper的一场辩论赛
Spring Cloud(一):我与导师的对话:你真的了解zookeeper吗?
..........
Spring Boot篇章
Spring Boot(八):Spring Boot的监控法宝:Actuator
Spring Boot(七):你不能不知道的Mybatis缓存机制!
Spring Boot(六):那些好用的数据库连接池们
Spring Boot(四):让人又爱又恨的JPA
SpringBoot(一):特性概览
..........
翻译
如何成为谷歌开发专家(GDE)— 实用指南
使用 CSS 提升页面渲染速度
WebTransport 会在不久的将来取代 WebRTC 吗?
.........
职业、生活感悟
你有没有想过,旅行的意义是什么?
程序员的职业规划
让程序员崩溃的十个瞬间!第6个简直不能忍!
聊聊这次换工作经历
欢迎大家关注们的公众号,一起持续性学习吧~