百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Docker篇(二):Docker实战,命令解析

wptr33 2024-11-12 14:21 27 浏览

大家好,我是杰哥


上周我们通过几个问题,让大家对于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的组合。若只有镜像名称,则表示该镜像的TAGlatest


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 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实战开启

相关推荐

每天一个编程技巧!掌握这7个神技,代码效率飙升200%

“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...

Git重置到某个历史节点(Sourcetree工具)

前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...

git工作区、暂存区、本地仓库、远程仓库的区别和联系

很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...

解锁人生新剧本的密钥:学会让往事退场

开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...

Reset local repository branch to be just like remote repository HEAD

技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...

Git恢复至之前版本(git恢复到pull之前的版本)

让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...

如何将文件重置或回退到特定版本(怎么让文件回到初始状态)

技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...

git如何正确回滚代码(git命令回滚代码)

方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...

[git]撤销的相关命令:reset、revert、checkout

基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...

利用shell脚本将Mysql错误日志保存到数据库中

说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...

MySQL 9.3 引入增强的JavaScript支持

MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...

python 连接 mysql 数据库(python连接MySQL数据库案例)

用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...

mysql导入导出命令(mysql 导入命令)

mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库  mysqldump-u用户名-p数据库名>导出的文件名  mysqldump-uw...

MySQL-SQL介绍(mysql sqlyog)

介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...