😊docker命令

(一)docker 基础命令

启动docker

systemctl start docker

关闭docker

systemctl stop docker

重启docker

systemctl restart docker

docker设置随服务启动而自启动

systemctl enable docker

查看docker 运行状态

------如果是在运行中 输入命令后 会看到绿色的active

systemctl status docker

查看docker 版本号信息

image-20200521111253771

docker 帮助命令

忘记了某些命令便可使用此进行查看与回顾

比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用

image-20200521111620131

(二)docker 镜像命令

查看自己服务器中docker 镜像列表

搜索镜像

image-20200521112530211

拉取镜像 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本

拉取最新版 mysql

image-20200521113237254

咱再来拉取一个指定版本号 镜像 至于版本号呢 可以在docker hub中查看

docker官方镜像搜索

image-20200521113551977

例如 拉取 mysql 5.7.30 ------------------这里出现了一些小东西 感觉挺新奇的 随着学习深入再回过头来看吧

image-20200521113845254

为什么提示文件存在 >>>> 请戳: docker 文件分层与数据卷挂载

运行镜像 ----咱拉取一个tomcat 跑起来试一试

ex:

image-20200521114405215

发现咱运行后 出现tomcat 默认占用的8080 端口 说明该镜像已经是启动了 ,但是 咱好像鼠标没有回到咱服务器上了 ,这怎么办呢 ?

使用 Ctrl+C (注:此方式虽然可以退出容器,但此种命令操作方式却是错误的,详细缘由请见下文的容器命令)

docker中 run 命令是十分复杂的 有什么持久运行 映射端口 设置容器别名 数据卷挂载等


一通测试,发现我们拉了好多镜像了,但我们现在根本用不着,这些无用镜像怎么删除呢?

删除镜像 ------当前镜像没有被任何容器使用才可以删除

强制删除镜像

镜像的基础命令就到这里 下方会使用更复杂的 docker run 命令 来根据镜像启动容器

保存镜像 将我们的镜像 保存为tar 压缩文件 这样方便镜像转移和保存 ,然后 可以在任何一台安装了docker的服务器上 加载这个镜像

命令:

exmaple:

在这里插入图片描述

保存镜像任务执行完毕,我们来看下指定位置下是否有该tar?

在这里插入图片描述

加载镜像 任何装 docker 的地方加载镜像保存文件,使其恢复为一个镜像

在这里插入图片描述

加载文件 恢复为镜像

在这里插入图片描述

查看镜像 测试镜像功能是否正常

我们来把解压的镜像 run一下。

在这里插入图片描述

(三)docker 容器命令

前言已经说了 docker 容器 就好比 咱java中的new出来对象(docker run 镜像 产生一个该镜像具体容器实例),docker 容器的启动需要 镜像的支持

先放上 docker 容器查看命令

查看正在运行容器列表

查看所有容器 -----包含正在运行 和已停止的

容器怎么来呢 可以通过run 镜像 来构建 自己的容器实例

运行一个容器

例如我们要启动一个redis 把它的别名取为redis001 并交互式运行 需要的命令 —我这里指定版本号为5.0.5

image-20200521141429893
image-20200521141530871

发现看到了 redis 使用了6379 端口 那么我们在关闭防火墙或开启了安全组的情况下 是否可以进行访问呢?

为了 区分 咱们使用linux 命令 查看一下

image-20200521142934877

**惊讶的发现,我们redis容器启动占用的 6379端口netstat 没有显示出来?什么情况?赶紧使用 redis desktop manger 连接测试一下 **

image-20200521143043536

为什么不行呢 已经确定了 docker 中 redis 容器已经是在运行中 且占有端口 6379啊?

因为:占用的6379端口 仅仅是在容器中内部本身的端口,与宿主机的6379端口并无联系,我们通过宿主机Ip:6379访问此redis示例,那自然是找不到的哟!


这里,来补充一点Docker容器的知识!

每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器))

image-20210905223422100

这是Docker 一大特点,每个容器之间环境都是隔离的!!!

我们甚至可以在一个服务器上,使用docker镜像,来跑出N个 mysql实例(尽管,他们的默认端口都是一样的,但还是那句话,容器间,环境是隔离的。A容器中的3306 与B容器的3306毫无关系,因为其不在一个世界呀!)

默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…

如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个正式的概念叫做 容器端口映射

有了端口映射,我们就可以将宿主机端口与 容器端口绑定起来,比如 我们建立宿主机的6379端口与容器redis6379端口绑定起来,那么再访问宿主机Ip:6379 就可以访问到对应容器了!

接下来 进行 容器端口映射演示

首先停止容器

image-20200521143812702

然后删除容器 -----不经意间 咱发现已经运行过这么多容器了 咱进行清理一下

image-20200521143956423
image-20200521144335238

这样 容器就已经删除完毕了 ,咱们接着弄 前边说的 端口映射

容器端口与服务器端口映射

命令:

还是使用前方的 redis 镜像 尝试 将6379端口 映射到服务器的8888 如果成功了的话 那么咱们访问服务器的8888端口就会访问到咱们的 docker 中 的容器 redis002

-p 8888:6379 解析 将容器内部的 6379端口与docker 宿主机(docker装在哪太服务器 那台服务器 就是其数组机)8888 端口进行映射 那通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口了

image-20200521144826072

在运行后 发现服务器的 8888 端口显示已被docker-proxy 所占用了 那么此时咱再用工具进行连接测试呢?

image-20200521161729868

那么容器端口映射有没有什么限制呢?

有的,虽说每个容器之间,环境都是隔离的,但是宿主机每个端口都是一个,8888端口被redis002容器绑定了,那么其他所有的容器都不可以使用8888这个端口了!!!


有时候,我们需要进入容器内部,修改其配置文件,那么如何才能进入容器内呢?

进入容器方式一 这里咱就进入 前面的 redis001容器

image-20200521141914333

可以看到 我已经从主机alibyleilei 跳到了容器ID 对应下的 /data 已经是进入到容器内部了

进入容器方式二 —推荐使用 exec 方式

那怎么退出容器呢 ?

从容器内 退出到自己服务器中 需注意 两个退出命令的区别

停止容器

重启容器

启动容器

kill 容器

容器文件拷贝 —无论容器是否开启 都可以进行拷贝

查看容器日志

image-20200521204550123

我们在运维的时候,通常给一些软件喜欢设置开机自启动,例如 mysql、redis,这样测试环境服务器重启时可节省不少运维时间成本,那么我们如果是docker容器 是否也可以设置开机自启动容器呢?

答案是 OKKKKK!

启动容器时,使用docker run命令时 添加参数--restart=always 便表示,该容器随docker服务启动而自动启动

ex:

这个时候有小伙伴着急了,我都已经启动一个容器好久了,跑了很多数据了,现在才告诉我可以设置自启动?我把容器删了再启动,我数据咋办???

哎!小伙汁,这个时候不要慌,我告诉你两个办法!

方法一:担心数据丢了,这说明你在跑容器的时候没有进行数据挂载吧???

你问我,什么是数据挂载?

简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!

具体请参考:docker 文件分层与数据卷挂载

命令:

如此操作,就将 容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件

示例:

此方法完了你很无语?那还不是得删容器?是呀!没错!那么为什么你有数据恢复需求而没有想到数据持久化,数据恢复备份,数据卷挂载?自己DEMO的吃亏,是为了平时开发少扣脑壳多摸鱼!

方法二:不想删容器,又想让这个容器设置开机自启动,那么我们修改其启动配置即可!

命令:

如上,虽然不删容器就设置了自启动需求满足了,但是,危不危险,这个容器有没有需要数据恢复的情况?自己考量吧!!!

更换容器名

想给容器换个霸气炫酷吊炸天的名字?

ex:

image-20210917205221992

(四)自己提交一个镜像

我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像,这时候我们就需要使用 commit 命令来构建一个新的镜像

我们拉取一个tomcat镜像 并持久化运行 且设置与宿主机进行端口映射

访问 咱的端口 发现访问404 这是因为咱配置了阿里云镜像后 所拉取得镜像都是最基础班的 仅仅包含其容器必要数据 例如 容器中 vim vi ll 命令都没有

image-20200521195641404
image-20200521195934938

咱们的webapps 下一个文件都没有 ,访问肯定404罗

不断查看 发现咱 webapps.dist 下是有文件的 我们把它拷贝的webapps 下 然后打包成一个新的镜像 后 访问查看是否进入到首页 不进入404页面

image-20200521200509889

exit 退出容器

使用 提交命令 将在运行的tomcat 容器 打包为一个全新的镜像 名字为tom Tag为1.0

image-20200521200732680 为了区分 咱停止并删除之前tomcat 的容器 image-20200521201009678

接下来 运行咱自己打包的镜像 tom:1.0

设置容器名字为lei 映射端口为6500:8080

image-20200521202016653
image-20200521201958111

访问6500 端口进入到了 tomcat 首页 说明 咱commit 镜像成功了

(五)docker 运维命令

可能有时候发布会遇到如下错误:

这个错误是docker在写入的时候报错无机器无空间

image-20220120111317635

查看docker工作目录

image-20220120105454769

查看docker磁盘占用总体情况

查看Docker的磁盘使用具体情况

image-20220120105618983

删除 无用的容器和 镜像

清除所有无容器使用的镜像

注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止

查找大文件

image-20220120112409172

查找指定docker使用目录下大于指定大小文件

ex:我这里是查找 /var/lib/docker/overlay2/* 开头的且大于100m的文件

image-20220120111526448

这有帮助吗?