前言
本讲是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.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
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)。
注意:在构建过程中,整个构建映像上下文文件(递归)首先发送到 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
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.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 的登录名
登录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
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)网络模式|桥接模式|主机模式|无模式|容器模式|自定义模式
请登录后发表评论
注册
社交帐号登录