容器启动流程与多架构镜像原理整合就形成了完整的容器启动流程。容器运行的本质Docker 容器是为了运行容器中的应用对外提供服务。应用运行完毕后容器就会自动终止。如果不想让容器启动后立即终止需要使容器应用不能立即结束。通常才用两种方式使应用处于与用户交互的状态或等待状态。容器创建并启动命令容器有两种运行模式交互模式与分离模式。以交互模式运行ubuntudocker run --name myubuntu -it ubuntu:latest /bin/bash--name : 指定当前容器名称为 myubuntu-it : 指定以交互模式运行容器且为容器分配一个伪终端。后面的/bin/bash 用于指定容器启动后要运行的命令。该命令会启动一个bash终端。运行命令后发现 命令行前面部分发生变化原来显示的是【rootdocker~】,现在变为rootde0940ad17dd:/#这就是docker生成的伪客户端而数字de0940ad17dd 表示docker容器ID。此时就可以对ubuntu系统执行命令了。执行exit 命令 可以退出应用。以交互模式运行tomcatdocker run --name mytomcat8 -it tomcat:8.5.32 /bin/bash通过ls -l 命令查看tomcat 根目录下的文件注意不支持ll命令。# 正式启动tomcat docker run --name mytomcat8081 -it -p 8081:8080 tomcat:8.5.32-p 指定端口映射格式为 暴露给宿主机的端口容器中应用的端口执行后tomcat启动此时可以在Windows的浏览器中通过ip:8081端口访问到tomcat.以分离模式运行tomcatdocker run --name tomcat01 -dp 8081:8080 tomcat:8.5.32 docker run --name tomcat02 -dp 8082:8080 tomcat:8.5.32 docker run --name tomcat03 -dp 8083:8080 tomcat:8.5.32-d 表示以分离模式运行容器即命令在后台运行命令的运行和宿主机的运行分离开来。现在已经启动了3个tomcat容器可以通过浏览器访问了。以分离模式运行ubuntudocker run -d ubuntu:latest该运行方式有一个问题虽然容器启动了但是docker ps 命令查看不到。docker ps -a 命令可以查看到该容器只不过其已经退出了。docker ps 查看的是up 状态的容器。容器创建命令docker create 命令仅创建容器但不启动用法与docker run 非常相似。但是没有-d 选项因为docker create 默认是采用后台方式运行的。容器退出命令# 退出并停止容器 exit # 退出不停止容器 CtrlPQ 快捷键容器状态查看命令docker ps # 查看所有正在运行的容器 docker ps -a # 查看所有容器 docker ps -q # 查看运行中的容器id docker ps -qa # 查看所有容器的ID docker ps -l # 查看最后创建的容器 docker ps -n 3 # 查看最后创建的n个容器容器再进行命令exec/attach 他们只能对正在运行的容器进行操作。新建进程进入容器exec# 先以分离模式运行tomcat容器 docker run --name mytom10 -dp 8081:8080 tomcat:8.5.32 # 使用exec命令进入此容器 docker exec -it mytom10 /bin/bash # 使用exit 退出容器此时tomcat容器并未结束说明exec命令会创建一个新的进程exit只是结束了这个新建的进程。 exit对比项docker execdocker attach进程行为新建独立进程非 PID1连接容器主进程 PID1退出影响退出不影响容器容器继续运行CtrlC 会停止容器需 CtrlPQ 安全分离终端独立性每个 exec 都是独立 shell多终端 attach 共享同一会话、同步输出常用场景日常进容器调试、改配置、查日志看主进程实时输出、接回前台交互容器外部操作容器exec上面的方法是进入到容器之后才对容器进行操作其实也可以不进入容器直接对容器进行操作。比如想查看tomcat容器工作目录中的文件直接在exec命令后紧跟执行的命令即可docker exec -it mytomcat02 ls -l容器附加标准输入# 先以交互方式运行一个ubuntu容器然后使用Ctrlpq 命令退出但不停止容器 docker run --name myubuntu -it ubuntu:latest /bin/bash # 然后使用attach 进入容器命令行此时再使用exit 命令退出容器。容器也就停止了。 # attach命令 没有另外创建新进程而是使用了容器进程所以exit 命令结束当前进程后容器就停止了。 docker attach myubuntu容器附加标准输出启动一个tomcat容器分离模式然后执行docker attach 可以看到占用了命令行但没有任何输出。此时的容器附加了标准输出只不过其输出的是tomcat的启停日志信息。docker run --name mytomcat -dp 8081:8080 tomcat:8.5.32 docker attach mytomcat通过ctrlC 可结束tomcat此时能看到停止日志显示出来。但是此时tomcat已经停止容器已经退出所以docker attach 命令也随之结束了。容器内进程查看命令#docker top 用于查看指定的正在运行的容器中的进程详情这个详情包括当前正在运行的命令 docker top myubuntu # 可以使用grep对结果进行过滤 docker top myubuntu | grep bin容器日志查看命令docker logs 【容器】# 查看指定容器中应用的运行日志不论容器是运行还是停止状态。 docker logs # 查看所有容器中应用的运行日志。 docker logs mytom3 # 选项-n 或--tail 可以指定要显示的最后几条日志 docker logs -n 5 mytomcat # --since指定显示从指定时间以来的日志。这个时间可以是绝对时间也可以是相对时长。 docker logs --since2022-08-11 --tail3 mytomcat # 显示近30分钟内产生日志中的最后3条m分。s:秒h:小时 docker logs --since30m --tail3 mytomcat # --until 指定也要显示截至到指定时间之前的日志这个时间可以是绝对时间也可以是相对时长。 docker logs --until2022-08-11 --tail3 mytomcat # 截至到5分钟之前的日志的最后3条 docker logs --until5m --tail3 mytomcat #查看日志的详细时间戳使用-t docker logs -t --tail3 mytomcat #查看动态日志使用-f 其会占用命令行一直等待日志输出 docker logs -f --tail3 mytomcat容器启停命令docker start myubuntu # 启动指定容器 docker restart myubuntu # 重启指定容器 docker stop myubuntu # 停止指定容器如果当前容器正在被其他进程访问则在访问结束后再停止 docker kill myubuntu # 强制停止指定容器 # 停止所有容器下面两个命令都可以 docker stop $(docker ps -qa) docker kill $(docker ps -qa) docker pause myubuntu # 暂停指定容器对外提供服务 docker unpause myubuntu # 解除暂停容器删除命令# 正常删除docker rm 在默认情况下要删除的容器必须是已停止的。 docker rm mytomcat # 强制删除加-f 无论容器是否停止都会删除 docker rm -f mytomcat # 删除所有容器 docker rm -f $(docker ps -qa)容器与宿主机文件传递将容器中文件复制到宿主机#将mytomcat容器的tomcat中webapps 目录复制到宿主机的当前目录 docker cp mytomcat:/usr/local/tomcat/webapps ./将宿主机文件复制到容器#将宿主机当前目录下的hw.tar 文件复制到mytomcat 容器的/usr/local/tomcat 目录中 # 要查看容器中是否存在hw.tar文件需要先启动该容器 docker cp ./hw.tar mytomcat:/usr/local/tomcatdocker cp 不支持容器间的文件传递。提交容器为镜像docker commit 命令可愿意将一个容器文件系统的当前快照生成为一个新的镜像。需求现在centOS容器中安装net-tools工具包。# 1. 先启动一个容器 docker run --name mycentOS -it centos:7 # 2. 安装net-tools 网络工具包 yum install -y net-tools # 3. 执行 ifconfig发现可以使用 ifconfig # 4. 生成镜像生成镜像的repository是centos7tag是net-tools # -a表示作者 -m表示提交时填的message docker commit -a “TOM” -m “ADD net-tools” mycentOS centos7:net-tools # 5. 然后就可以使用了 docker run --name mycuscentos -it centos7:net-tools生成悬虚镜像悬虚镜像是没有repository和tag的镜像。悬虚镜像一般是由一些失误操作产生的副产物一般要被清除掉。如果非要使用只能通过imageID来使用。下面的命令就会生成一个悬虚镜像。没指定repository和tagdocker commit -a “TOM” -m “ADD net-tools” mycentOS导入导出容器# 将tomcat:8.5.32镜像的容器tom 导出到当前/root目录的tomcat8.tar文件中 docker export -o tomcat8.tar tom # docker import 用于将指定的tar文件构建新的镜像。 docker import tomcat8.tar mytomcat:1.0与save/load命令对比export与saveexport作用于容器save作用在镜像但他们导出的结果都是tar文件export一次只能导出一个容器save一次可导出多个镜像export只对当前容器的文件系统快照进行导出其会丢弃原镜像的所有历史记录与元数据信息save则保存了原镜像的完整记录import与loadimport导入的是容器load加载的是镜像但最后都恢复为镜像import恢复的镜像只包含当前镜像一层load恢复的镜像与原镜像的分层相同import恢复的镜像是新镜像和原镜像的imageID不同load恢复的镜像与原镜像相同imageID相同import可以为导入的镜像指定repository和tag而load不行与docker commit 对比相同点docker import docker export 和docker commit 都能将一个容器变为一个镜像不同点docker import docker export 恢复的镜像只包含原容器生成的一层分层 docker commit 生成的镜像中包含原镜像的所有分层。docker system 命令集