5.docker容器及相关命令
docker中的容器实际上就是宿主机中的一个进程
目录
1.1??如果没有指定的镜像的话,docker会尝试从源拉取
3??以新的进程进入正在启动的容器内部 docker exec -it [容器ID] /bin/bash
5??以当前的进程进入正在启动的容器内部 docker attach
13??将docker export生成的tar文件加载为镜像 docker import
15??停止暂停容器对外的服务 docker unpause
1??创建并启动容器 docker run
1.1??如果没有指定的镜像的话,docker会尝试从源拉取
如果源里面没有就会报错
1.2??给容器起名字 --name
比如我像给hello-world这个镜像启动的容器命名为something
- 如果你不手动起名字,那么docker会帮你起一个,比如我之前运行的recursing_lumiere
1.3??交互方式启动(-i)与弹出客户端(-t)
我们以ubuntu的镜像为例,如果你直接运行ubuntu的镜像就会退出,因为镜像中没有需要执行的应用
运行后我们发现路径就变了,此时我们已经进入到了ubuntu这个镜像的系统中
- -i -t 可以简写成-it
可以输入 exit 然后按回车退出
/bin/bash是在容器中运行bash shell(可以理解为打开一个终端),有时候需要加,有时候不用加。比如ubuntu你不用加也能打开,不过你加上之后也没有什么问题。加与不加主要是看dockerfile,有的dockerfile中的最后一句人家有写你就不用加,他要是没写且你想进终端你就得加
/bin/bash对应的是这里的command
1.4??指定端口 -p
我们以tomcat:8.5.49为例,tomcat是一种java web服务器解决方案。对标python的话可以理解为uwsgi,uwsgi是一种python web服务器解决方案
- tomcat8.5.49以后的启动方式略有不同
输入 docker run -p 8888:8080 tomcat:8.5.49
- 冒号前的8888是指你要映射出来的端口,因为你只放docker中你访问不到,只能映射到宿主机上访问
- 冒号后的8080是指docker里面的端口,tomcat默认的端口是8080
- 由于是前台运行,所以该终端一直会是阻塞状态。你如果按ctrl+c,那么tomcat这个服务就断了
使用宿主机访问 127.0.0.1:8888 可以看到tomcat
如果你在启动的时加入了-it,那么运行后按ctrl+p+q,那么就会将docker的服务放到后台运行,并且你也能退到docker中干点儿别的
- -it少一个都不行
按下ctrl+p+q后,可以看一下该容器的状态,发现它并不是Exit,而是正在执行的状态。并且在PORTS的位置可以看到端口状况,8888是宿主机的端口,8080是docker内部的端口。前面0.0.0.0是IPV4的写法,后面连续三个冒号是IPV6的写法
- COMMAND是tomcat在dockerfile中就写了的,我没有对COMMAND做任何操作
按下ctrl+p+q后,使用宿主机访问127.0.0.1:8888依然可以访问到tomcat
1.5??自动分配端口 -P
输入docker run -it -P tomcat:8.5.49
按ctrl+p+q退出来,之后查看docker ps -a,之后发现系统自动分配了一个端口32769
之后使用宿主机访问127.0.0.1:32769可以访问tomcat
1.6??后台运行(以守护进程方式运行) -d
- 后台运行也需要有交互的东西,如果你后台运行一个ubuntu然后ubuntu中什么都没开,那么ubuntu的容器也会被关闭
docker run -d -p 8888:8080 tomcat:8.5.49
访问 127.0.0.1:8888 可以正常访问
2??查看运行中的容器 docker ps
- 容器在运行完容器内的应用会后自动终止,如果是终止状态的 STATUS 就会显示为 Exited。如果不想在运行后终止,那么容器应用不能立即结束(比如搞个服务,它一直在那里运行)
可以加入参数-a查看所有容器
可以加入参数-s查看容器大小。实际73.6kB,虚拟出来507MB
除-a,-s之外,还有其他参数,比如
- -filter 过滤
- -n 显示最新创建的若干个(是创建不是运行),比如我要看最新创建的6个,那么就写 docker ps -n 6
- -l 显示最新创建的1个(是创建不是运行),docker ps -l
- --no-trunc 不省略输出
- -q 只显示容器ID
3??以新的进程进入正在启动的容器内部 docker exec -it [容器ID] /bin/bash
我们以tomcat:8.5.50为例,以tomcat:8.4.49的方式启动tomcat:8.5.50后访问127.0.0.1:8888会显示404
能显示404代表容器已经启动成功了
我们可以进入该容器
出现404的原因是webapps这个文件夹没有东西
我们现在讲webapps.dist覆盖掉webapps。首先删除webapps这个文件夹,然后给webapps.dist改名为webapps
替换后等待一会儿可以访问到tomcat的主页
在终端中输入 exit 然后按回车可以退出容器内部
除了-it以外常用的参数还有-u、-w
-u是选择用户的,-w可以选择进入后的工作目录
最后的 /bin/bash 是进入容器,如果你不希望进入容器但又希望查询容器内部的某些信息,那么你可以将命令替换掉/bin/bash,比如我现在想看看进入工作目录后有哪些文件,那么我就用ls替换掉/bin/bash
4??删除容器 docker rm
一般我们会直接使用 docker rm -f [容器ID]
比如我现在想删除 98f8 这个容器
删除后98f8这个容器就没了
当容器正在运行状态的时候仅使用rm不能删除
docker rm -f 可以强制删除
5??以当前的进程进入正在启动的容器内部 docker attach
我们现在后台运行一个ubuntu,进入ubuntu,按ctrl+p+q让其后台运行。此时的容器是开着的
docker exec是以一个新的进程进去容器内部,我们退出exec并不会关闭容器
docker attach是以当前的进程进入正在启动的容器内部,退出attach就会关闭容器
如果容器和tomcat一样是一直交互的那种,attach之后就不会给你打字的地方,因为这个容器现在正在阻塞的状态
你按ctrl+c可以终止阻塞的状态,然后再查看容器的状态就发现容器已经关闭了
有三个参数分别是
- --detach-keys 分离会话,用attach分离会话不如直接用exec
- --no-stdin 禁用输入,这个是防误触用的。默认为有输入。
- --sig-proxy 这个是多个客户端使用attach时,显示相同的输入与输出。默认显示的就是相同的输入与输出
6??启动容器 docker restart
使用start也行,一般我们都使用restart,因为restart可以替代start的功能
7??停止容器 docker stop
8??显示容器在宿主机的运行情况 docker top
我们在宿主机中查看进程对比一下,发现信息是一致的
我们简单说一下top中的内容
- UID 哪个运行运行的,我此时用的是sudo su,所以是root用户
- PID 当前进程ID
- PPID 当前进程的父进程ID
- C CPU占用率
- STIME 进程开始时间,我当前是11:11分启动的容器
- TTY 启动此进程的中断设备,这个没用到过,也不太懂
- CMD 启动进程的命令
我们查看help发现没有和其他的指令一样,写着有什么参数。这里我们可以看到[ps OPTIONS],[ps OPTIONS]表明和linux命令中ps的参数一致
比如我们使用ps -ef ,在这里也可以使用 docker top [容器ID] -ef
9??查看日志docker logs
可以查看启动容器的日志,也可以查看未启动容器的日志,比如查看未启动的ubuntu
下面是查看启动的tomcat
9.1??从指定时间到现在的日志 --since
--since 显示从什么时候开始的日志,比如我只想看2小时前到现在的日志,那么我就写 docker logs e025 --since '120m'
也可以给时间戳,时间戳的格式可以照着help文档中的内容来写
比如 docker logs e025 --since '2023-12-13T9:20:00Z'
- 时间要写0时区的时间,我现在在17点多开启了容器,那我就要写9点
9.2??最后n行 --tail
比如我现在只想看最后3行的内容,那么就写 docker logs [容器ID] --tail 3
- 一般来讲新的日志总是在最后,所以我们看最后3行,一般也是最新的3行
9.3??从日志的开头到指定的时间 --until
比如 docker logs e025 --until '2023-12-13T9:26:00z'
9.4??添加日志的时间戳 -t
我们做个对比
9.5??获得动态日志 -f
-f只能查看运行中的容器,通过-f查看日志后,终端会一直监听该容器
此时我们可以通过 docker attach 该容器,然后进行一些操作,比如输入 ps -ef 然后按回车
之后我们发现logs也会显示相同的内容
9.6??其他参数
- --details 显示额外的细节,作用不大
10??宿主机与容器复制文件 docker cp
使用cp命令不能在容器与容器间复制文件
10.1??从宿主机复制文件到容器中
- 可以复制到关闭的容器中,也可以复制到未关闭的容器中
我现在宿主机的home下有一个test.txt
里面的内容的hello world
我现在复制到 3c57 这个容器的/home下
发现可以成功复制进去
10.2??从容器复制文件到宿主机
- 可以从关闭的容器中复制,也可以从开启的容器中复制
我现在在容器中创建 do_something.txt 内容为 do something
将do_something.txt复制到宿主机上
发现可以成功复制
11??将容器保存为镜像 docker commit
- docker commit生成的镜像会保留镜像的全部信息。可以理解为与docker save ->docker load 的结果一样。与docker export -> docker import 的结果不同
我们首先准备一个容器,这个容器的/home下有一个test.txt,内容为 hello world
我们目前有如下镜像
在使用docker commit之前,我们先看一下参数
- -a 作者字符串
- -c 后面写dockerfile指令,也就是说在该容器下你可以使用dockerfile指令再对容器进行修改,之后保存到镜像
- -m 提交信息,比如说是这一次提交修改了什么东西
- -p 提交时暂停容器
我们下面简单用一下。docker commit -a "[作者名称与邮箱]" -m "[提交信息]" [容器ID] [镜像的名称与tag]
- 如果不写镜像名与tag,生成镜像的时候REPOSITORY与TAG就会为none
发现可以成功添加,之后我们运行一下,运行后发现可以找到 /home/test.txt 并且内容正确
镜像的作者与提交的信息可以通过查看镜像元信息找到
12??将容器保存为tar文件 docker export
比如现在我想把 3805 这个容器转换为 tar 文件
执行 docker export -o [tar文件名称] [容器ID]
执行过后发现产生了suyu_ubuntu.tar这个文件
使用export导出的tar文件是不能通过docker load 读取的
- 有时通过docker export导出的镜像会比原本的镜像体积(docker save镜像的体积)小,原因是通过export的镜像删除了之前的历史记录(docker export导出的镜像只有一层)与一些注释。
通过export导出的tar文件可以通过docker import 生成镜像
13??将docker export生成的tar文件加载为镜像 docker import
docker import参数如下
- -c 在tar文件的基础上添加dockerfile语句修改镜像
- -m 提交镜像时的信息,可以在镜像的元信息中查到
- --platform 支持的平台,如果镜像可以支持多架构可以写,不支持多架构不用写
我们下面用上面export出来的tar文件做个例子,导入之前的镜像列表是这样的
执行 docker import [export导出的tar文件] [镜像名:标签]
- 如果不写[镜像名:标签]会生成虚悬镜像
14??暂停容器对外的服务 docker pause
docker的暂停状态是 容器依然在运行,但里面的服务就停止了,比如你访问tomcat的首页,此时会一直转,不报错,但也没有响应结果
15??停止暂停容器对外的服务 docker unpause
16??强制停止容器 docker kill
17??仅创建容器 docker create
- docker create基本上不用,如果想深入了解可以看一下这个?061-docker create命令详解_哔哩哔哩_bilibili
参数与docker run 相似,我们简单用一下
- 默认后台运行,所以不用写-d,写了会报错,因为docker create没有-d这个参数
启动的时候就当关闭的容器启动就行了
启动后可以访问到tomcat的主页
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!