前言
docker是现在最流行的应用容器引擎
本篇将介绍常用的一些命令:帮助命令、镜像命令、容器命令,并完全实现一遍
可以把docker容器看作简易版的Linux环境
实际上大部分Linux命令在Docker也可以运行
帮助命令
docker version
得到客户端、服务器的信息
docker info
也是打印docker的信息,不过这里打印的是docker镜像、容器等信息
docker --help
和Linux的指令一样,这个指令能够得到docker的所有的命令参数、命令集合
并且在输入其他命令时也可以在后面带上--help
获得相关参数
例如:docker run --help
这才是官方文档,在实际遇到问题时主要还是靠help命令
镜像命令
docker images
:显示本地镜像
当前只有一个hello-world镜像,
可以看出有5个属性:
repository表示镜像的仓库源、tag镜像标签、image id镜像id,created创建时间,size大小
同一个仓库源可以有多个tag,表示不同的版本,repository:tag定义不同的镜像,不指定标签默认是latest
相关参数: 我们可以通过help命令查询docker image --help
-a
列出本地所有的仓库,含中间映像层,默认情况会过滤中间映像层
-q
只显示iamge id
--digests
显示镜像的摘要信息,这在我们下载镜像时显示的摘要
--no-trunc
显示完整的镜像信息,前面的image id只截取了12位,实际上完整信息还有很多,这个命令是显示完整信息
docker search
:查找镜像
docker search 镜像名
命令从docker hub查找对应的镜像,虽然我们配置了阿里云下载镜像,但是查找镜像还是在docker hub上查找
例如:docker search tomcat
在docker hub上查找:
命令:
其中automated是自动构建,official是指官方版,stars就类似与github的stars,点赞数,description是描述信息
相关参数:
-s
列出点赞数不小于指定值的镜像
--no-trunc
显示完整的描述信息
--automated
显示存在automated属性的镜像
这里stars>50并且存在automated属性的镜像只有一个
docker pull
:下载镜像
默认是去docker hub下载,因为外网的原因下载会很慢,建议使用国内的阿里云等
docker pull tomcat,没有写版本号,自动下载最新版Using default tag: latest
docker rmi
:删除镜像
删除镜像:docker rmi 镜像名:版本号
,如果不写版本号默认删除latest最新版
也可以用镜像id:docker rmi imageid:tag
但当该镜像正在运行时,会删除失败
可以加上-f
强制删除
删除多个:docker rmi -f 镜像名:版本号 镜像名:版本号
,以空格分隔
latest可以省略
删除全部:可以使用组合命令实现:docker rmi -f $(docker images -q)
删除命令可以使用$()得到子命令的结果,docker images -q
得到所有的镜像id
容器命令
有镜像才有容器
docker run
:启动
启动镜像,创建容器:docker run [option] 镜像名
有很多相关参数,可以通过docker run --help
查看
常用的参数有:
--name 容器名
:给容器重命名-d
:后台运行容器,并返回容器id(守护式容器,类似与Linux守护线程)-i
:交互模式运行容器,也就是我将会在前台使用该容器进行shell操作-t
:为容器重新分配一个伪输入终端,通常与-i同时使用-P
:随机端口映射-p
:指定端口映射,有四种格式:ip::hostPort:containerPort
;ip::containerPort
;hostPort:containerPort
;containerPort
这里以一个centos镜像为例:
下载了一个centos镜像,仅215mb,可以看出docker镜像确实是Linux的精简版
交互模式运行并分配伪端口,容器命名为mycentos
可以看到,centos名字发生了改变,进入了docker的centos系统
可以进docker内的centos查看,可以看到这就是一个centos
docker run -it centos /bin/sh 也是启动
守护式容器
当使用docker run -d centos
后台运行容器,与交互式不同,仅输出容器id,并且依旧是当前界面
守护式容器必须要有前台程序
docker容器后台运行,没有前台程序,如果不是一直挂起的命令,后台程序会自动退出
交互式容器-it
与守护式容器-d
docker ps
:列出运行容器
接上面的步骤,可以再启动一个终端查看docker ps
可以看到:
容器id就是前面终端的id,images镜像,
command启动容器时运行的命令,“/bin/bash”
说明这个容器的初始进程为bash进程
created创建时间
status状态:正在运行且运行了3分钟
ports是 容器的端口信息和使用的连接类型(tcp\udp)
name是我们设置的容器名,如果没有设置随机分配默认名
相关参数:
-a
:列出当前所有运行的容器+历史上运行过的容器-l
:显示最近创建的容器-n
:显示最近创建的n个容器,docker ps -n 3
-q
:只显示容器编号,静默模式--no-trunc
:不截断输出
实际上通过--hlep
可以显示所有参数,所有的指令都可以通过--help
获得:
退出容器
有两种退出容器的方式:
-
输入exit:停止容器并退出
-
ctrl+p+q:不停止容器退出
直接键盘快捷键控制
既然有不停止退出,当然有进入方法
进入正在运行的容器并以命令行交互
有两种进入方法:
docker attach 容器id
:直接进入容器,启动命令终端,不会启动新的进程docker exec 容器id
:在容器外执行(exec)容器的指令,可以启动新进程,当然也可以进入容器docker exec -it 容器id /bin/bash
运行一个centos容器,不停止容器退出
docker attach直接进入容器:
而docker exec是在主机执行容器的指令:
在我们的linux上执行docker容器的指令,执行完后还是在容器外
也可以-it
分配一个伪终端,/bin/bash
,进入容器
docker start
:启动容器
前面通过exit停止的容器,可以通过容器id或者名字启动docker start 596d58f5776a
这是启动停止容器
docker restart
:重启容器
输入容器id或者容器名重启
stop \ kill
:停止与强制停止
通过容器id或容器名可以停止
停止:docker stop
,温柔的停止
命令执行时,会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认的10秒,会继续发送SIGKILL的系统信号强行kill掉进程
强制停止:docker kill
,杀死容器
命令执行时会直接发出SIGKILL的系统信号,以强行终止容器中程序的运行
类似与Linux的kill -9
杀死进程
docker rm
:删除已停止的容器
没有运行容器:
实际上docker的会记住已经停止的容器,上面的ps指令就可以显示历史容器
同样,通过容器id或者容器名删除docker rm 596d58f5776a
rm 指令和上面的镜像删除 rmi类似:-f
强制删除,可以删除运行中的容器;删除多个、删除全部也一样的操作
docker logs
:日志信息
同样通过--help
显示相关参数信息:
命令:
docker logs [参数] 容器id/容器名
即可显示命令日志
常用的参数:
-t
:加上时间戳
--tail n
:打印最后日志条数
-f
:跟随最新的日志打印,也就是自动不停的追加,当有一个程序每隔1s打印一次,不加-f就只能显示一次,加了会自动显示最新的日志
这个可以写一个不断打印的shell脚本测试
每隔1s打印一次hello:docker run -d centos /bin/sh -c "while true;do echo hellp;sleep 1;done"
docker top
:查看容器内运行进程
在Linux的指令中,top也是显示运行进程:
在docker的top指令也是一样的:运行上面的循环打印命令,再docker top 容器id/容器名
即可显示该容器内运行的进程
docker inspect
:查看容器内部细节
docker镜像是嵌套形式的,inspect查看内部细节会以JSON字符串的形式显示
docker inspect 容器id/容器名
docker cp
:从容器内拷贝数据到主机
进入centos容器,创建一个文件test.txt
不停止容器退出centos:ctrl+p+q
将test.txt复制到root目录下:docker cp 容器id:文件地址 复制到的地址
不同端口启动docker容器:端口映射
前面的docker run
还有两个参数:
-P
:随机端口映射-p
:指定端口映射,有四种格式:ip::hostPort:containerPort
;ip::containerPort
;hostPort:containerPort
;containerPort
这个用tomcat演示,先现在镜像docker pull tomcat:8.0.52
:
碰到了一个问题:docker - 启动tomcat成功但无法打开8080
docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的
所以即使不想改变端口,如果需要在容器外访问也需要设置端口映射
用8088端口启动tomcat:docker run -it -p 8088:8080 tomcat:8.0.52
启动成功:
-p是自定义端口启动,-P是随机端口
再试试-P:
然后ctrl+p+q不停止退出,再查看tomcat运行情况:
发现随机到了32768端口,我们访问23768端口即映射到8080
docker commit
:提交镜像
我们可以对tomcat进行一定的修改再提交:
运行tomcat,并进入容器:docker exec -it 容器id /bin/bash
这样就可以查看到tomcat的文件,进入webapp内删除docs文件夹
可以查看确实是没有docs了
现在提交镜像:docker commit -a "zfk" -m "tomcat without docs" 082d295a3106 test/mytomcat:0.2
然后关闭原先的tomcat,再启动我们的test/mytomcat
在浏览器访问,点击docs,404,确实是我们的镜像
commit命令的参数:-a是添加作者,-m是注释
总结
docker容器的状态: