八大核心命令和一些常用的辅助命令–是从

前言

本讲是Docker系列课程的单独部分,重点介绍八个核心命令和一些常用的辅助命令,如inspect、logs、push、commit等。如果你想熟悉使用这些命令通过部署 Tomcat 容器(从查找镜像、拉取、运行,最后到删除),按 Enter。

一、服务启动命令1.Docker 服务启动和停止命令(Linux 基础)

service docker start #启动docker 
service docker restart #重启docker 
service docker status #查看运行状态
service docker stop #停掉服务

systemctl start docker  #启动docker
systemctl restart docker  #重启docker
systemctl status docker  #查看运行状态
systemctl enable docker #设置开机自动启动

2.docker 容器启动和停止命令

docker ps #查看正在运行的容器
docker run -d --name nginx-v1 nginx:latest #启动容器
docker start redis #启动一个或多个已经被停止的容器
docker restart redis  #重启容器
docker stop nginx-v1 #根据容器名称停掉指定容器
docker kill redis  #杀掉一个运行中的容器

温馨提示:

对于初学者,不知道什么时候用docker start,什么时候用docker run。总之,当你需要运行一个容器的时候端口镜像是什么意思,不管怎样,直接运行 docker run -d 就可以了,甚至不用 -p。

引起的问题:docker ps -a,你会发现同一个镜像在后台有多个容器的多个副本,其中大部分是Exited,可能只有一个up online。

这个时候是不是很迷茫,迫不及待想用docker rm $(docker ps -qa) 把所有的容器都去掉,然后重新docker run,当然可以这样,但是如何避免这个问题再次出现?

最好的办法,每次要docker run -d,先用命令docker ps -a查看后台容器,是否已经有你需要的容器,其状态为Exited,如果有,你只需要通过 docker start 命令启动它。如果您想详细了解 Docker 容器的各种状态,请单击此处带您快速了解。

提示:

当 docker [停止 | start |restart ]是容器ID,如果容器有唯一的前缀,容器ID可以写成前两个字母/数字,而不是全部。

图片[1]-八大核心命令和一些常用的辅助命令–是从-老王博客

二、八个核心命令1.docker pull 从远程仓库提取镜像

语法:docker pull 镜像名称

tags 表示标签。如果不加该参数,默认拉取最新版本。

docker pull tomcat  #默认就是获取latest最新版
docker pull tomcat:latest  #明确指定获取最新版
docker pull tomcat:8.5.46-jdk8-openjdk   #拉取指定版本镜像

2.docker images 查看本地下载的镜像

查看已下载的本地图片列表

docker images #列出本地镜像
docker images -a  #列出本地镜像(含中间映像层)
docker images -q  #只显示镜像ID
docker images -qa #只显示镜像ID(含中间映像层)

docker images --digests #显示镜像摘要信息(DIGEST列)
docker images --no-trunc  #显示镜像完整信息

3.docker run 启动容器

语法:docker run 镜像名称

如果不运行docker pull命令,而是直接运行docker run命令,run命令会自动运行pull从远程仓库提取镜像,然后自动运行容器。

–name 指定容器的名称

-e 设置环境变量,可以看出覆盖了Dockerfile中的ENV环境变量

-p 需要手动指定一个或多个映射端口号,格式为:host(主机)端口:容器端口-p 80:8080

-P Docker会随机映射一个49000到49900的端口到容器内部开放的网络端口

-it where,-i 以交互模式运行容器; -t 为容器重新分配一个伪输入终端

-d 后台运行容器,返回容器ID(不带此参数,容器运行在前台窗口,窗口关闭,然后关闭)

#docker run -d --name nginx-v2 nginx:latest  后台运行容器

-v 将宿主机目录挂载到容器中;格式:主机目录:容器目录

注意:除了冒号端口镜像是什么意思,可以用空格代替前后两个目录路径。

docker run -it -v /suzhu_data:/contain_data nginx:1.12 /bin/bash  #启动容器时,直接指定挂载映射目录,并进入容器内部
exit #退出容器

宿主机本地路径suzhu_data目录和容器contain_data路径映射(大致可以认为容器的contain_data是宿主机suzhu_data目录的硬链接,注意:现实中是不允许创建硬链接的目录);通常,宿主目录存放着经常需要更改的文件。

挂载的好处:多个容器都映射到同一个host目录,方便统一管理(类似于Tomcat集群,所有Tomcat Webapps目录指向同一个web项目目录,每次部署,只需要部署一个复制)。

-v参数的扩展用法:

挂载时,可以指定可读的挂载方式。如果不想修改宿主机在容器内的挂载目录,可以写:-v /suzhu_data:/contain_data:ro,其中ro-read only表示。默认情况下,可以在容器内修改宿主机的源挂载目录。

–rm 容器退出时自动清理容器内部的文件系统(通常用于一次性测试环境),同时也清理容器的匿名数据卷。

所以,执行带有 –rm 命令选项的 docker run 命令,相当于在容器退出后执行 docker rm -v(这个 -v 和 docker run -v 是回显)。

docker run --rm nginx:test
#等价于
docker run --rm=true nginx:test

-rm参数的扩展用法:常与sleep结合使用,表示多少秒后容器会自毁(消失)。

docker run -d --rm nginx:alpine  sleep 10 #容器后台阻塞运行10秒后自动销毁,可以不停的用docker ps -a 来查看验证
docker run -d --name mybox busybox  sleep 10  
docker run -d --name mybox busybox /bin/sh -c "while true; do sleep 10; done" #容器后台阻塞运行10秒后自动销毁,-c是-command的意思,后面跟cmd命令(while true是一个死循环,10秒后自动结束)

–restart=always 如果启动过程有问题,尝试一直重启

docker pull registry  #拉取精简版本地仓库
docker images  #查看镜像
docker run -d -p 5000:5000 --restart=always --name registry registry:latest #启动镜像

-它打开一个新终端并交互进入容器(应该在最后指定/bin/bash方法);与-d一起使用时,不会进入容器。

注意:这个写法相当于docker run命令和docker exec -it命令合并的效果(区别是:前者同时运行到容器中,如果exit退出容器,容器状态(通过docker)ps -a view)会立即变成Exited状态;后者不同,以这种方式进入容器,然后exit退出容器,不会主动影响容器的原始状态)。

docker run  -it --name mytomcat -p 8080:8080 tomcat:8.5.46-jdk8-openjdk  /bin/bash

图片[2]-八大核心命令和一些常用的辅助命令–是从-老王博客

4.docker ps 查看正在运行的镜像列表

不带参数,默认只显示正在运行的容器(状态为UP online)

-a 列出所有容器;-n 显示最近创建的指定数量的容器;–no- trunc 不截断输出

docker ps -l #显示最近创建容器 
docker ps -n 3 #显示最近创建的3个容器 
docker ps --no-trunc  #不截断输出

5.docker rm 容器 id 删除容器

-f 表示强制删除,remove 使用容器时,不需要写全名,可以是前两个字符(如果前两个字符不重复),以备不时之需使用docker stop容器ID,先停止容器,然后rm删除容器。

docker ps -a     #查看需要被删除的容器
docker rm -f 9c  #容器名称首字母
docker rm -f eb  #容器名称首字母
docker rm -f 31  #容器名称首字母
docker rm -f tomcat7 #强制删除容器
docker rmi -f redis tomcat nginx #一次删除多个容器

扩展:删除所有容器的 3 种方法

docker rm $(docker ps -a -q)
docker rm -f $(docker ps -aq)  
docker ps -a -q | xargs docker rm  #通过管道,把前面的命令交给后面

扩展名:批量创建目录(类似上面的用法)

#mkdir $(seq -f ‘testg’ 1 5) seq 命令详情

#seq -f “testg” 1 5 | xargs mkdir

-v 删除与容器关联的卷及其在主机上的映射目录

注意:这个-v呼应了docker run -v的参数,删除的也是run-v时指定的映射目录

可以使用docker inspect命令查看“Mounts”挂载部分,可知数据目录挂载在容器内部,默认为“Source”:“/var /lib/docker/volumes*** “

docker rm -f   tomcat7 #仅删除容器本身
docker rm -fv  tomcat7 #彻底级联删除

6.docker rmi 删除镜像

语法:docker rmi 镜像名称:

docker images #查看所有镜像
docker rmi -f  tomcat:latest #-f强制删除指定版本的tomcat镜像

7.docker exec -it 从宿主机,进入容器

docker ps  #查看正在运行的容器
docker exec -it mynginx /bin/bash 
docker exec -it mynginx /bin/sh /root/runoob.sh  #进入容器的同时,运行runoob.sh脚本
exit #退出容器

./bin/bash 和 /bin/sh

两个脚本的权限不同; /bin/sh 相当于 /bin/bash –posix;两者的区别,就是bash没有开启posix模式

#ll /bin/sh
lrwxrwxrwx. 1 root root 4 Jan 7 2022 /bin/sh -> bash
#ll /bin/bash
-rwxr-xr-x. 1 root root 938768 Jan 7 2022 /bin/bash

8.docker build 使用 Dockerfile 构建镜像

这个命令的操作一般在这种情况下需要切换到Dockerfile所在的目录,然后运行docker build。当然,如果 Dockerfile 在其他目录,也可以使用 docker build -f 指定 Dockerfile 的位置(可以是远程地址)。

–file,-f指定Dockerfile脚本路径(该文件是镜像构建脚本的集合,类似于xx.sh脚本)

docker build -f /path/to/a/Dockerfile .  #明确指定Dockerfile的路径
docker build github.com/creack/docker-firefox #也可以使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像

–build-arg 创建镜像时设置一些参数,可以指定环境常量,会覆盖Dockerfile中同名的常量

示例:如果 Dockerfile 具有以下环境常量

ENV http_proxy ""
ENV https_proxy ""

p>

然后在 docker build 命令运行时,仍然可以使用 –build-arg 覆盖 Dockerfile 中这个常量的值

docker build
--build-arg http_proxy=http://10.188.61.2:8118
--build-arg https_proxy=https://10.188.61.2:8118
-f Dockerfile . -t imagename:tag

–tag, -t 图片和Tag的名称,通常为name:tag或name;一个构建中可以为一个图像设置多个标签。

docker images #查看镜像列表
docker build -t nginx:env . 
docker build  .  -t nginx:env #两种写法均可,前面是容器名称,后面是标签
docker build -t coonote/ubuntu:v1 .  
docker build -t test/myapp .

三、docker build .Extension 点

表示在构建镜像时,需要打包上传到Docker服务器引擎中的文件目录,以便Dockerfile中的COPY或ADD命令自动关联和使用。

当前目录可以用.表示。它不是当前目录。您需要手动指定上下文目录。不要写一个。 (这个目录一般是构建docker镜像项目的根目录,但是最好不要在/root根目录下,这样会造成不必要的资源浪费。原来几十M的镜像可能会变成更多超过 10 G)。

图片[3]-八大核心命令和一些常用的辅助命令–是从-老王博客

注意:在构建过程中,整个构建映像上下文文件(递归)首先发送到 Docker 守护程序(服务器),供 Dockerfile 中的 ADD 和 COPY 命令使用。构建成功后,会返回新镜像的ID,Docker daemon会自动清理发送的构建镜像上下文。

结论:不是指Dockerfile所在的目录。简单理解就是它只代表宿主机的当前目录,而Dockerfile恰好在当前目录下。如果 Dockerfile 不在当前目录下,需要使用 -f 去手动指定 Dockerfile 的位置。

。点,它指的是构建上下文,需要上传Dockerfile中的ADD和COPY命令所需要的文件的上下文目录(这样这两个命令就可以使用上下文中的文件,就像使用自己本地的一样) files 同),构建结束后会自动清理上下文文件。

注意:这个点的功能在网上很多地方都有用到。这是回避和模棱两可的。本次讲座将其分解,分享给大家。

四、常用命令1.docker search 搜索图片

docker search helloword
docker search ubuntu
docker search nginx 

图片[4]-八大核心命令和一些常用的辅助命令–是从-老王博客

2.docker inspect image/container 获取容器/镜像的元数据详情

docker inspect nginx

-f , –format : 返回指定值的模板文件

语法:docker inspect -f ${format} ID|NAME

-s , –size 如果是容器,则显示文件的总大小

p>

语法:docker inspect -s ID|NAME

–type 返回指定类型的 JSON 语法:docker inspect –type JSON ID|NAME

3.docker tag 自定义图片的标签

功能:

类似于虚拟机中的快照。添加标签后,不仅可以保存最新版本的镜像,还可以保存历史版本新版本的镜像,方便新版本镜像出现问题时进行版本回溯。

注意:实际工作中需要修改图片名,否则无法上传(push)到本地仓库(上传时需要指定仓库,如果仓库名相同,可以:标签版本号)。

docker images #查看镜像列表
docker tag ubuntu:latest aliyun/ubuntu:v1 
docker images #可以看到两个镜像的名称不同,镜像ID相同

这时候会有问题,直接通过image ID,系统会提示:image is reference in multiple repositories。

镜像在多个仓库中使用,不知道删除哪个。

所以需要根据镜像名+版本号删除

#docker rmi ubuntu:latest

4.docker login /logout 登录/退出官方仓库Docker Hub

#docker login
#password:
Login Succeeded

注意:如果没有账号,可以注册

图片[5]-八大核心命令和一些常用的辅助命令–是从-老王博客

5.docker push 将镜像推送到你自己的 github 远程仓库

docker pull nginx
docker images
docker tag nginx:latest xxxx_login_name/nginx:v1 #给镜像打标签
docker images
docker push xxxx_login_name/nginx:v1

注意:xxxx_login_name 是你登录 github 的登录名

图片[6]-八大核心命令和一些常用的辅助命令–是从-老王博客

登录Docker账号后,就可以看到刚刚上传的镜像了。

6.docker history 查看指定镜像的创建历史

参数:-H显示图片的大小和日期; –no-trunc 显示完整的提交记录;- q 仅列出提交 ID

#docker history -H redis
#docker history runoob/ubuntu:v3

7.docker save 将指定的镜像保存为 tar 存档

#docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

8.docker load 导入使用 docker save 命令导出的镜像

#docker load -i my_ubuntu_v3.tar

9.docker info 显示 Docker 系统信息,包括镜像和容器的数量

#docker info

10.docker version 显示 Docker 版本信息

#docker version

11.docker cp 主机和容器之间的文件(文件夹)相互拷贝

参数-r是递归复制

1.从宿主机拷贝文件到容器

该命令需要在容器内使用 docker exec -it 执行。前面的绝对路径是宿主机的路径,后面的路径是容器内部的路径(可以是相对路径)

#docker cp -r /root/doc/htmls /usr/local/tomcat/webapps  从宿主机向容器复制文件

2.从容器复制文件到宿主机

命令可以直接在host中执行,前面指定容器的名字(通过docker ps -a获取)

#docker cp  container_name:/var/logs /host/path   从容器向宿主机复制文件

注意:无论容器是否启动,复制命令都会生效。如果复制的内容有重复,不问直接覆盖。

12.docker top 显示容器的运行过程

语法:docker top CONTAINER [ps OPTIONS]

#docker top redis 列出redis容器中运行进程
#docker top gitlab  列出所有正在运行的进程
#docker top gitlab | grep redis  过滤出redis相关进程

13.docker port 查看容器暴露的端口

#docker ps 获取容器id
#docker port e93e695d65

图片[7]-八大核心命令和一些常用的辅助命令–是从-老王博客

14.docker logs 查看容器日志

参数:-f 跟踪日志输出(实时刷新); -t 显示时间戳; –tail 只列出最新的N个容器日志;

#docker logs rabbitmq
docker logs -f -t --tail=20 redis
docker logs --since="2022-05-21" --tail=10 redis  查看自2022-05-21后最新的10条日志

15.docker commi 提交镜像到仓库

语法:docker commit -a=”author” -m=”Description” -c container id 目标镜像名称:[TAG]

参数:-a 提交图片的作者; -c 使用 Dockerfile 命令创建镜像; -m 提交时的描述文本; -p 提交时,暂停容器

注意:Docker容器运行过程中会产生数据。如果没有通过 docker commit 生成新的镜像,从而将数据保存为镜像的一部分,那么当容器为(rm 命令)时,数据就没有了。

点击这里了解容器和镜像的关系。

docker commit -a="myredis test" -m="my redis" [redis容器ID]  myredis:v1.1

实践练习

#1、随意通过拉取一个Tomcat镜像
docker pull tomcat 
#2、很激动的启动默认的tomcat,发现这个默认的tomcat页面来了个大大的404惊喜。原因是:官方的镜像默认webapps下面是没有文件
docker run -d -p 8080:8080 tomcat
#3、进入容器内部
docker exec -it 64357165e00e
#4、同cp命令拷贝文件进去(从宿主机向容器复制文件)
cp -r webapps.dist/* webapps
#5、将操作过的容器通过commit提交为一个镜像。我们以后就使用我们修改过的镜像即可
docker commit -a="succ" -m="add webapps app" 64357165e00e mytomcat:v1 
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
#6、查看自己创建的镜像
docker images mytomcat:v1
EPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mytomcat           v1                  37af1236adef        15 seconds ago      329 MB

五、docker build 和 docker commit 的关系

区别和联系:两者都是构建的自定义图像,但构建方式不同。

从上面的内容可以知道docker build有个隐藏参数-f。这种方式构建自定义镜像时,需要指定一个Dockerfile并依赖Dockerfile。

Docker 提交是不同的。它不依赖任何 Dockerfile。您可以随时在主机的任何目录中执行此操作。例如,您在容器中添加了配置或在 yum 中安装了一些东西。软件安装好后,需要将这些配置持久化到镜像中,此时可以使用docker commit进行操作。

六、总结

以上内容比较重要,重点介绍Docker核心命令及周边常用命令。

如果你是初学者,通过浏览Tomcat镜像从下载到部署到移除,可以对Docker命令的使用有一个初步的了解和理解。进阶课程请看笔记中的两章6、7。

结束备注

本讲内容提取自Docker入门到进阶,使原文更加有序和重点突出。是使用docker前必须掌握和理解的一些知识点,希望对大家有所帮助。

注意事项

您可能还对以下内容感兴趣,以及给爱学习的您的注意事项

1、Linux环境快速安装Docker、Windows10+专业版环境安装Docker

2、如何获取最新版本的Docker |如何获取Tomcat/JDK/Nginx的指定版本镜像

3、配置阿里云图片加速器,提升图片下载速度

4、Dockerfile 八个核心命令 | Dockerfile 构建你自己的镜像

5、Docker 容器 | Dockerfile 优化

p>

6、Docker 容器声明周期 |杀死并停止|暂停和取消暂停

7、Docker 镜像分层 |镜像与容器的关系

8、Docker学习:五种容器(3+2)网络模式|桥接模式|主机模式|无模式|容器模式|自定义模式

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论