Docker--容器常用命令

Docker容器

容器启动流程

与多架构镜像原理整合,就形成了完整的容器启动流程。

容器运行的本质

Docker 容器是为了运行容器中的应用,对外提供服务。

应用运行完毕后,容器就会自动终止。

如果不想让容器启动后立即终止,需要使容器应用不能立即结束。

通常才用两种方式:使应用处于与用户交互的状态等待状态

容器创建并启动命令

容器有两种运行模式:交互模式与分离模式。

以交互模式运行ubuntu

sh 复制代码
docker run --name myubuntu -it ubuntu:latest /bin/bash

--name : 指定当前容器名称为 myubuntu

-it : 指定以交互模式运行容器,且为容器分配一个伪终端。

后面的/bin/bash 用于指定容器启动后要运行的命令。该命令会启动一个bash终端。

运行命令后发现 命令行前面部分发生变化:

原来显示的是【root@docker~】,现在变为root@de0940ad17dd:/#,这就是docker生成的伪客户端,而数字de0940ad17dd 表示docker容器ID。

此时就可以对ubuntu系统执行命令了。

执行exit 命令 可以退出应用。

以交互模式运行tomcat

sh 复制代码
docker run --name mytomcat8 -it tomcat:8.5.32 /bin/bash

通过ls -l 命令查看tomcat 根目录下的文件,注意,不支持ll命令。

sh 复制代码
# 正式启动tomcat
docker run --name mytomcat8081 -it -p 8081:8080 tomcat:8.5.32

-p 指定端口映射,格式为 暴露给宿主机的端口:容器中应用的端口

执行后,tomcat启动,此时可以在Windows的浏览器中通过ip:8081端口访问到tomcat.

以分离模式运行tomcat

sh 复制代码
docker 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容器,可以通过浏览器访问了。

以分离模式运行ubuntu

sh 复制代码
docker run -d ubuntu:latest

该运行方式有一个问题:虽然容器启动了,但是docker ps 命令查看不到。

docker ps -a 命令可以查看到该容器,只不过其已经退出了。

docker ps 查看的是up 状态的容器。

容器创建命令

docker create 命令仅创建容器但不启动,用法与docker run 非常相似。但是没有-d 选项,因为docker create 默认是采用后台方式运行的。

容器退出命令

sh 复制代码
# 退出并停止容器
exit
# 退出不停止容器 Ctrl+P+Q 快捷键

容器状态查看命令

sh 复制代码
docker ps # 查看所有正在运行的容器
docker ps -a # 查看所有容器
docker ps -q # 查看运行中的容器id
docker ps -qa # 查看所有容器的ID
docker ps -l # 查看最后创建的容器
docker ps -n 3 # 查看最后创建的n个容器

容器再进行命令

exec/attach ,他们只能对正在运行的容器进行操作。

新建进程进入容器exec

sh 复制代码
# 先以分离模式运行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 exec docker attach
进程行为 新建独立进程(非 PID1) 连接容器主进程 PID1
退出影响 退出不影响容器,容器继续运行 Ctrl+C 会停止容器;需 Ctrl+P+Q 安全分离
终端独立性 每个 exec 都是独立 shell 多终端 attach 共享同一会话、同步输出
常用场景 日常进容器调试、改配置、查日志 看主进程实时输出、接回前台交互容器

外部操作容器exec

上面的方法是进入到容器之后才对容器进行操作,其实也可以不进入容器直接对容器进行操作。

比如想查看tomcat容器工作目录中的文件,直接在exec命令后紧跟执行的命令即可

sh 复制代码
docker exec -it mytomcat02 ls -l

容器附加标准输入

sh 复制代码
# 先以交互方式运行一个ubuntu容器,然后使用Ctrl+p+q 命令退出但不停止容器
docker run --name myubuntu -it ubuntu:latest /bin/bash
# 然后使用attach 进入容器命令行,此时再使用exit 命令退出容器。容器也就停止了。
# attach命令 没有另外创建新进程,而是使用了容器进程,所以exit 命令结束当前进程后,容器就停止了。
docker attach myubuntu

容器附加标准输出

启动一个tomcat容器(分离模式),然后执行docker attach 可以看到:占用了命令行,但没有任何输出。

此时的容器附加了标准输出,只不过,其输出的是tomcat的启停日志信息。

sh 复制代码
docker run --name mytomcat -dp 8081:8080 tomcat:8.5.32
docker attach mytomcat

通过ctrl+C 可结束tomcat,此时能看到停止日志显示出来。但是此时tomcat已经停止,容器已经退出,所以docker attach 命令也随之结束了。

容器内进程查看命令

sh 复制代码
#docker top 用于查看指定的正在运行的容器中的进程详情,这个详情包括当前正在运行的命令
docker top myubuntu
# 可以使用grep对结果进行过滤
docker top myubuntu | grep bin

容器日志查看命令

sh 复制代码
docker logs 【容器】# 查看指定容器中应用的运行日志,不论容器是运行还是停止状态。
docker logs # 查看所有容器中应用的运行日志。
docker logs mytom3
# 选项-n 或--tail 可以指定要显示的最后几条日志
docker logs -n 5 mytomcat
# --since指定显示从指定时间以来的日志。这个时间可以是绝对时间,也可以是相对时长。
docker logs --since="2022-08-11" --tail=3 mytomcat	
# 显示近30分钟内产生日志中的最后3条,m:分。s:秒;h:小时
docker logs --since=30m --tail=3 mytomcat
# --until 指定也要显示截至到指定时间之前的日志,这个时间可以是绝对时间,也可以是相对时长。
docker logs --until="2022-08-11" --tail=3 mytomcat	
# 截至到5分钟之前的日志的最后3条		
docker logs --until=5m --tail=3 mytomcat
#查看日志的详细时间戳,使用-t
docker logs -t --tail=3 mytomcat
#查看动态日志,使用-f ,其会占用命令行,一直等待日志输出
docker logs -f --tail=3 mytomcat

容器启停命令

sh 复制代码
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 # 解除暂停

容器删除命令

sh 复制代码
# 正常删除:docker rm 在默认情况下,要删除的容器必须是已停止的。
docker rm mytomcat
# 强制删除:加-f ,无论容器是否停止,都会删除
docker rm -f mytomcat
# 删除所有容器
docker rm -f $(docker ps -qa)

容器与宿主机文件传递

将容器中文件复制到宿主机

sh 复制代码
#将mytomcat容器的tomcat中webapps 目录复制到宿主机的当前目录
docker cp mytomcat:/usr/local/tomcat/webapps ./

将宿主机文件复制到容器

sh 复制代码
#将宿主机当前目录下的hw.tar 文件复制到mytomcat 容器的/usr/local/tomcat 目录中
# 要查看容器中是否存在hw.tar文件,需要先启动该容器
docker cp ./hw.tar mytomcat:/usr/local/tomcat

docker cp 不支持容器间的文件传递。

提交容器为镜像

docker commit 命令可愿意将一个容器文件系统的当前快照生成为一个新的镜像。

需求:现在centOS容器中安装net-tools工具包。

sh 复制代码
# 1. 先启动一个容器
docker run --name mycentOS -it centos:7
# 2. 安装net-tools 网络工具包
yum install -y net-tools
# 3.  执行 ifconfig,发现可以使用
ifconfig
# 4. 生成镜像,生成镜像的<repository>是centos7,<tag>是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>和<tag>

sh 复制代码
docker commit -a "TOM" -m "ADD net-tools" mycentOS

导入导出容器

sh 复制代码
# 将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命令对比

  1. export与save
    • export作用于容器,save作用在镜像,但他们导出的结果都是tar文件
    • export一次只能导出一个容器;save一次可导出多个镜像
    • export只对当前容器的文件系统快照进行导出,其会丢弃原镜像的所有历史记录与元数据信息;save则保存了原镜像的完整记录
  2. import与load
    • import导入的是容器;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 命令集

sh 复制代码
docker system df # 查看docker 各部分的磁盘占用数据
docker system df -v # 查看docker 各部分的磁盘占用数据,数据更加详细
# 查看docker 发生过的事件,可以查看指定日期之外(--until)或之内(--since)
docker system events --since="2022-11-13"
# 查看docker详情: docker info 和docker system info 的效果一样
docker info
docker system info
# 删除docker 中无用的数据(比如:已经停止的容器、没连任何容器的网络、悬虚镜像等)
docker system prune
相关推荐
摇滚侠1 小时前
MSYS2 Builds Hashes Cygwin Builds Hashes 区别
java
武子康1 小时前
Java-08 深入浅出 Mybatis 数据库多对多关系设计:中间表、映射与性能优化
java·后端·spring
无极低码2 小时前
wsdl转client使用wsimport,高版本openjdk不支持使用 JAX-WS
java
明夜之约2 小时前
Spring Cloud Gateway 深度解析:从路由原理到生产级网关实战
java·spring·spring cloud·gateway
Simon523142 小时前
Spring Bean----5.27学习小记
java·学习·spring
ZJH__GO2 小时前
java项目-流水线线程池
java·开发语言
●VON2 小时前
鸿蒙NEXT ArkUI进阶:用CustomBuilder打造高定制化品牌页签栏
java·华为·harmonyos·鸿蒙·新特性
夕除2 小时前
spring boot 16
java·spring boot·后端
努力成为AK大王2 小时前
Spring Bean 作用域与生命周期
java·后端·spring