当前位置: 首页 > news >正文

【Docker基础】容器技术详解:生命周期、命令与实战案例

文章目录

  • 一、什么是容器?
  • 二、为什么需要容器
  • 三、容器的生命周期
    • 容器状态
    • 容器OOM
    • 容器异常退出
    • 容器异常退出
    • 容器暂停
  • 四、容器命令
      • 命令清单
      • 详细介绍
  • 五、容器操作案例
    • 容器的状态迁移
    • 容器批量操作
    • 容器交互模式
      • attached 模式
      • detached 模式
      • interactive 模式
    • 容器 与 宿主机 文件拷贝
    • 容器 自动删除 与 自动重启
    • 容器环境变量设置
    • 查看容器的详细信息
    • 容器镜像的导入导出
    • 镜像的资源查看
    • 镜像的日志查看
    • 容器的资源查看
  • 六、综合实战
    • Mysql 容器化安装
    • Redis 容器化安装
      • Redis 出现的原因
      • Redis 是什么
      • Redis 的应用场景
    • C++ 容器制作
    • 容器资源更新


一、什么是容器?

首先,我们了解了镜像,容器可以被视为镜像的实际运行实例。镜像本身是一个静态且只读的文件,而容器则在此基础上附加了一个可写的文件层,这使得容器能够运行需要的进程。简单来说,容器是运行着实际应用进程的实体

容器有五种基本状态:创建、运行、停止、暂停和删除

容器本质上是主机上一个运行的进程,但它通过独立的命名空间隔离和资源限制与主机进程区分开来。在容器内部,无法直接访问主机上的进程、环境变量或网络等信息,这也是容器与直接在主机上运行的进程之间的关键区别

容器是基于镜像创建的可执行实例,且可以独立存在。一个镜像可以启动多个容器实例。容器化环境的运行实质上是在容器内创建一个文件系统的读写副本,也就是说,为镜像添加了一层新的容器层,这一层允许对镜像副本进行修改。

在这里插入图片描述

镜像和容器的关系就像:一个类实例化出多个对象,而这几个对象的差别却很大;

当然,容器的差别主要体现在它们的运行时状态上(比如不同容器内的文件更改、配置或进程等)


二、为什么需要容器

我们知道,镜像是静态的文件,其自身并不能提供服务,类似一个Windows、Linux的光驱,需要在主机上才能运行;

同理,真正的应用环境在容器中运行。

下面再简单列举一下 为什么需要容器

  1. 轻量级虚拟化:容器比传统虚拟机更轻便,占用资源少,启动更快。

  2. 环境隔离:每个容器都提供独立的运行环境,避免应用之间的环境冲突。

  3. 一致的开发、测试和生产环境:容器保证在不同环境中应用的运行一致性,解决“在我电脑上能跑”的问题。

  4. 高效的资源利用:容器共享宿主操作系统的内核,减少资源浪费,相比虚拟机能运行更多实例。

  5. 快速启动和部署:容器启动速度快,通常在几秒钟内即可启动,适用于快速部署和动态伸缩。

  6. 简化运维管理:容器化应用易于管理、迁移和扩展,便于自动化部署和持续集成。


三、容器的生命周期

容器状态

类比进程的生命周期,容器的生命周期一样与其运行状态相关,容器有以下五种运行状态:

  • created:初建状态
  • running:运行状态
  • stopped:停止状态
  • paused:暂停状态
  • deleted:删除状态

各生命周期之间的转换关系如图所示:

在这里插入图片描述

我们可以通过下面命令,对容器进行操作并将容器转为不同的状态:

  • docker create
    创建容器后,不立即启动运行,容器进入初建状态。

  • docker run
    创建容器,并立即启动运行,进入运行状态。

  • docker start
    容器转为运行状态。

  • docker stop
    容器将转入停止状态。

  • docker kill
    容器在故障(死机)时执行 kill(断电),容器转入停止状态。
    这种操作容易丢失数据,除非必要,否则不建议使用。

  • docker restart
    重启容器,容器转入运行状态。

  • docker pause
    容器进入暂停状态。

  • docker unpause
    取消暂停状态,容器进入运行状态。

  • docker rm
    删除容器,容器转入删除状态。

  • 容器异常终止

    • killed by out-of-memory(因内存不足被终止)
      宿主机内存被耗尽,也被称为 OOM(Out Of Memory)。
      解决方案:非计划终止时,需要杀死最吃内存的容器。

    • container process exited(异常终止)
      当容器异常终止后,会出现 Should restart? 选项。
      可选择以下操作:

      • yes
        需要重启,容器执行 start 命令,转为运行状态。

      • no
        不需要重启,容器转为停止状态。


容器OOM

OOM 即 Out of Memory(内存不足),即计算机或系统在运行时,尝试分配更多内存给进程,但系统的物理内存或虚拟内存已经用尽,无法再分配给该进程或其他进程,从而导致该进程被操作系统终止或挂起。

  1. 如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。
    • 比如在容器中部署了一个 web 服务。假设主机分配给该容器的内存上限为 1G,当脚本申请的内存大于 1G 时,容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。
    • 需要注意的是,关闭容器的并非是 Docker Daemon,而是宿主机操作系统。因为容器本质是一组运行在宿主机操作系统中的进程,宿主机操作系统通过 cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件。
  2. 如果用户不想关闭该容器,可以通关 --oom-kill-disable 来禁用 OOM-Killer
    • 使用此参数时,仍需注意,如果使用-m 设置了此容器内存上限,当容器达到内存资源上限时,主机不会关闭容器,也不会继续向此容器继续分配资源,此时容器将处于 挂起(hung) 状态。
  3. 如果用户使用了 --oom-kill-disable,但未使用 -m 来设定上限,此时容器将尽可能多的使用主机内存资源。(主机内存有多大,它就将用多大)

容器异常退出

容器异常退出

每个 Docker 容器内部都运行一个 Init 进程,容器内的其他进程都是由 Init 进程派生出来的子进程。容器的生命周期实际上与 Init 进程的运行状态密切相关。如果一个子进程发生异常退出,它的父进程也会随之退出,最终导致 Init 进程退出,从而使整个容器停止运行。

当 Init 进程退出时,容器会自动停止。此时,Docker 无法判断进程退出是正常还是异常。当容器停止时,Docker Daemon 会尝试将容器从“已停止”状态恢复到“运行中”状态。但只有在容器启用了 --restart 参数时,Docker Daemon 才会尝试重启容器,否则容器将保持在停止状态。


容器暂停

当 Docker 暂停容器时,容器的 CPU 资源会被“剥夺”,但其他资源,如内存 (Memory) 和网络 (Network) 资源,仍然保持不变。失去 CPU 资源的进程将不会被主机的内核调度,从而使该容器处于“冻结”状态。


四、容器命令

命令清单

下面是 Docker 容器的相关命令

命令别名功能备注
docker createdocker container create创建容器
docker rundocker container run运行容器必须掌握
docker attachdocker container attach连接到正在运行中的容器
docker commitdocker container commit将镜像提交为容器必须掌握
docker cpdocker container cp在容器和宿主机之间拷贝必须掌握
docker diffdocker container diff检查容器里文件结构的更改
docker execdocker container exec在运行的容器中执行命令必须掌握
docker exportdocker container export将容器导出为 tar
docker inspectdocker container inspect查看容器详细信息必须掌握
docker killdocker container kill杀死容器必须掌握
docker logsdocker container logs查看日志必须掌握
docker psdocker container ls, docker container list, docker container ps查看正在运行的进程必须掌握
docker pausedocker container pause暂停进程
docker portdocker container port查看容器的端口映射
docker container prune删除停止的容器
docker renamedocker container rename重命名容器
docker restartdocker container restart重启容器必须掌握
docker rmdocker container rm, docker container remove删除容器必须掌握
docker startdocker container start启动容器必须掌握
docker statsdocker container stats查看资源占用信息必须掌握
docker stopdocker container stop停止容器必须掌握
docker topdocker container top查看某个容器的资源占用必须掌握
docker unpausedocker container unpause继续运行容器
docker updatedocker container update更新容器配置
docker waitdocker container wait阻止一个或多个容器停止

详细介绍

  1. docker create

    • 功能: 创建一个新的容器但不启动它
    • 语法:
      docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
      
    • 别名: docker container create
    • 关键参数:
      • -i: 以交互模式运行容器,通常与 -t 同时使用
      • -P: 随机端口映射
      • -p: 指定端口映射,格式:主机端口:容器端口
      • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
      • --name="nginx-lb": 为容器指定名称
      • -h "mars": 指定容器的 hostname
      • -e username="ritchie": 设置环境变量
      • --cpuset-cpus="0-2": 绑定容器到指定 CPU 运行
      • -m: 设置容器使用的最大内存
      • --network="bridge": 指定容器的网络连接类型
      • --link=[]: 添加链接到另一个容器
      • --volume , -v: 绑定一个卷
      • --rm: 容器退出时自动删除
      • --restart: 自动重启容器
    • 样例:
      docker create --name mynginx nginx:latest
      
  2. docker run

    • 功能: 创建一个新的容器并运行一个命令
    • 语法:
      docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      
    • 别名: docker container run
    • 关键参数:
      • -d: 后台运行容器,并返回容器 ID
      • -i: 以交互模式运行容器,通常与 -t 同时使用
      • -P: 随机端口映射
      • -p: 指定端口映射,格式:主机端口:容器端口
      • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
      • --name="nginx-lb": 为容器指定名称
      • -h "mars": 指定容器的 hostname
      • -e username="ritchie": 设置环境变量
      • --cpuset-cpus="0-2": 绑定容器到指定 CPU 运行
      • -m: 设置容器使用的最大内存
      • --network="bridge": 指定容器的网络连接类型
      • --link=[]: 添加链接到另一个容器
      • --volume , -v: 绑定一个卷
      • --rm: 容器退出时自动删除
      • --restart: 自动重启容器
    • 样例:
      docker run --name mynginx -d nginx:latest
      docker run -p 80:80 -v /data:/data -d nginx:latest
      
  3. docker ps

    • 功能: 列出容器
    • 语法:
      docker ps [OPTIONS]
      
    • 别名: docker container ls, docker container list, docker container ps
    • 关键参数:
      • -a: 显示所有容器,包括未运行的
      • -f: 根据条件过滤显示
      • --format: 指定返回值的模板文件,如 jsontable
      • -l: 显示最新的容器
      • -n: 列出最近创建的 N 个容器
      • --no-trunc: 不截断输出
      • -q: 静默模式,只显示容器编号
      • -s: 显示容器总的文件大小
    • 样例:
      docker ps -a
      
  4. docker logs

    • 功能: 查看容器日志
    • 语法:
      docker logs [OPTIONS] CONTAINER
      
    • 别名: docker container logs
    • 关键参数:
      • -f ,--follow: 跟踪日志输出
      • --since: 显示某个开始时间的所有日志
      • -t, --timestamps: 显示时间戳
      • -n, --tail: 仅列出最新 N 条容器日志
    • 样例:
      docker logs -f mynginx
      docker logs --since="2016-07-01" --tail=10 mynginx
      
  5. docker attach

    • 功能: 连接到正在运行中的容器
    • 语法:
      docker attach [OPTIONS] CONTAINER
      
    • 别名: docker container attach
    • 关键参数:
      • --sig-proxy: 是否将所有信号代理,默认是 true
    • 样例:
      docker attach mynginx
      docker attach --sig-proxy=false mynginx
      
  6. docker exec

    • 功能: 在容器中执行命令
    • 语法:
      docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
      
    • 别名: docker container exec
    • 关键参数:
      • -d: 分离模式,在后台运行
      • -i: 即使没有附加也保持 STDIN 打开
      • -t: 分配一个伪终端
      • -e: 设置环境变量
      • -u, --user: 指定用户 <name|uid>[:<group|gid>]
      • -w, --workdir: 指定工作目录
    • 样例:
      docker exec -it mynginx echo "Hello bit"
      docker exec -it mynginx bash
      
  7. docker start

    • 功能: 启动停止的容器
    • 语法:
      docker start [OPTIONS] CONTAINER [CONTAINER...]
      
    • 别名: docker container start
    • 样例:
      docker start mynginx
      
  8. docker stop

    • 功能: 停止运行中的容器
    • 语法:
      docker stop [OPTIONS] CONTAINER [CONTAINER...]
      
    • 别名: docker container stop
    • 关键参数:
      • -s: 发送的信号
    • 样例:
      docker stop mynginx
      
  9. docker restart

    • 功能: 重启容器
    • 语法:
      docker restart [OPTIONS] CONTAINER [CONTAINER...]
      
    • 别名: docker container restart
    • 关键参数:
      • -s: 发送信号
    • 样例:
      docker restart mynginx
      
  10. docker kill

    • 功能: 强制退出容器
    • 语法:
      docker kill [OPTIONS] CONTAINER [CONTAINER...]
      
    • 别名: docker container kill
    • 关键参数:
      • -s: 发送的信号
    • 注意事项: docker kill 发送的是 SIGKILL 信号,而 docker stop 发送的是 SIGTERM 信号
    • 样例:
      docker kill mynginx
      
  11. docker top

    • 功能: 查看容器中运行的进程信息,支持 ps 命令参数
    • 语法:
      docker top CONTAINER [ps OPTIONS]
      
    • 别名: docker container top
    • 样例:
      docker top mynginx
      
  12. docker stats

    • 功能: 显示容器资源的使用情况,包括 CPU、内存、网络 I/O 等
    • 语法:
      docker  stats [OPTIONS] [CONTAINER...]
      
    • 别名: docker container stats
    • 关键参数:
      • --no-stream: 不刷新
    • 样例:
      docker stats --no-stream
      docker stats mynginx
      
  13. docker container inspect

    • 功能: 查看容器详细信息
    • 语法:
      docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
      
    • 关键参数:
      • -f: 指定返回值的模板文件,如 tablejson
      • -s: 显示总的文件大小
    • 注意事项:
      • docker inspect 会自动检查是镜像还是容器,然后显示详细信息
    • 样例:
      docker container inspect mynginx
      
  14. docker port

    • 功能: 用于列出指定容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口
    • 语法:
      docker port CONTAINER [PRIVATE_PORT[/PROTO]]
      
    • 别名: docker container port
    • 样例:
      docker port mynginx
      
  15. docker cp

    • 功能: 在容器和宿主机之间拷贝文件
    • 语法:
      docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
      docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
      
    • 别名: docker container cp
    • 样例:
      # 将主机 /www/ 目录拷贝到容器 mynginx 的 /www 目录下
      docker cp /www/ mynginx:/www/
      # 将容器 /www/ 目录拷贝到主机的 /wwwbak 目录下
      docker cp mynginx:/www/ /wwwbak/
      
  16. docker diff

    • 功能: 检查容器里文件结构的更改
    • 语法:
      docker diff CONTAINER
      
    • 样例:
      docker diff mynginx
      
  17. docker commit

    • 功能: 从容器创建一个新的镜像
    • 语法:
      docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
      
    • 参数:
      • -a: 提交的镜像作者
      • -c: 使用 Dockerfile 指令来创建镜像,可以修改启动指令
      • -m: 提交时的说明文字
      • -p: 在 commit 时,将容器暂停
    • 样例:
      docker commit c3f279d17e0a maxhou/mynginx:v01
      
  18. docker pause

    • 功能: 暂停容器中所有的进程
    • 语法:
      docker pause CONTAINER [CONTAINER...]
      
    • 别名: docker container pause
    • 样例:
      docker pause mynginx
      
  19. docker unpause

    • 功能: 恢复容器中所有的进程
    • 语法:
      docker unpause CONTAINER [CONTAINER...]
      
    • 别名: docker container unpause
    • 样例:
      docker unpause mynginx
      
  20. docker rm

    • 功能: 删除停止的容器
    • 语法:
      docker rm [OPTIONS] CONTAINER [CONTAINER...]
      
    • 别名: docker container rm
    • 关键参数:
      • -f: 通过 SIGKILL 信号强制删除一个运行中的容器
    • 样例:
      # 删除 mynginx 容器
      docker stop mynginx
      docker rm mynginx
      # 删除所有停止的容器
      docker rm $(docker ps -a -q)
      
  21. docker export

    • 功能: 导出容器内容为 tar 文件
    • 语法:
      docker export [OPTIONS] CONTAINER
      
    • 别名: docker container export
    • 关键参数:
      • -o: 写入到文件
    • 样例:
      # 导出 nginx 为 tar 文件
      docker export -o mynginx202203.tar mynginx
      
  22. docker wait

    • 功能: 阻塞运行直到容器停止,然后打印出它的退出代码
    • 语法:
      docker wait CONTAINER [CONTAINER...]
      
    • 别名: docker container wait
    • 样例:
      docker wait mynginx
      
  23. docker rename

    • 功能: 重命名容器
    • 语法:
      docker rename CONTAINER NEW_NAME
      
    • 别名: docker container rename
    • 样例:
      docker rename mynginx myweb
      
  24. docker container prune

    • 功能: 删除所有停止的容器
    • 语法:
      docker container prune [OPTIONS]
      
    • 关键参数:
      • -f, --force: 不提示是否进行确认
    • 样例:
      docker container prune
      
  25. docker update

    • 功能: 更新容器配置
    • 语法:
      docker update [OPTIONS] CONTAINER [CONTAINER...]
      
    • 别名: docker container update
    • 关键参数:
      • --cpus: 设置 CPU 数量
      • --cpuset-cpus: 使用哪些 CPU
      • --memory: 设置内存限制
      • --memory-swap: 设置交换内存
      • --cpu-period: 用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
      • --cpu-quota: 用来指定在这个周期内,最多可以有多少时间用来跑这个容器
    • 样例:
      # 更新内存
      docker update -m 400m myweb
      

五、容器操作案例

容器的状态迁移

下面演示一下容器的基本的状态改变操作:

  1. 通过 docker create 命令进行容器的创建:
ubuntu@VM-8-2-ubuntu:~$ docker create --name mynginx -p 8080:80 nginx:1.24.0
4c269e3619d4b40a22d94ef031edab6abaf06059020d3e520f92b0d62bff55ee
  1. 通过docker ps 命令可以查看创建的容器:
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
23400afbdb50   nginx:1.24.0   "/docker-entrypoint.…"   About a minute ago   Created                             mynginx
  1. 随后启动容器:
ubuntu@VM-8-2-ubuntu:~$ docker start mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
4c269e3619d4   nginx:1.24.0   "/docker-entrypoint.…"   About a minute ago   Up About a minute         0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx
  1. 通过 docker stop 停止容器:
ubuntu@VM-8-2-ubuntu:~$ docker stop mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
4c269e3619d4   nginx:1.24.0   "/docker-entrypoint.…"   2 minutes ago   Exited (0) 3 seconds ago             mynginx
  1. 再次启动容器后 kill 容器:
ubuntu@VM-8-2-ubuntu:~$ docker start mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker kill mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
4c269e3619d4   nginx:1.24.0   "/docker-entrypoint.…"   4 minutes ago   Exited (137) 3 seconds ago             mynginx
  1. 启动容器后暂停容器:
ubuntu@VM-8-2-ubuntu:~$ docker start mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker pause mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
4c269e3619d4   nginx:1.24.0   "/docker-entrypoint.…"   4 minutes ago   Up 7 seconds (Paused)     0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx
  1. 恢复容器:
ubuntu@VM-8-2-ubuntu:~$ docker unpause mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
4c269e3619d4   nginx:1.24.0   "/docker-entrypoint.…"   5 minutes ago   Up 38 seconds             0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx
  1. 重启容器,可以观察到启动时间变快了:
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
4c269e3619d4   nginx:1.24.0   "/docker-entrypoint.…"   9 minutes ago   Up 5 seconds              0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx
ubuntu@VM-8-2-ubuntu:~$ docker restart mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker ps -a | grep mynginx
4c269e3619d4   nginx:1.24.0   "/docker-entrypoint.…"   10 minutes ago   Up 2 seconds              0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx
  1. 通过 docker rm 可以删除容器:
ubuntu@VM-8-2-ubuntu:~$ docker stop mynginx
mynginx
ubuntu@VM-8-2-ubuntu:~$ docker rm mynginx
mynginx

容器批量操作

命令解释
docker container ls -qf name=xxx根据容器名称过滤,返回与名称匹配的容器 ID。
docker container ls -f status=running根据容器状态过滤,显示所有正在运行的容器。
docker container ls -aq静默模式,列出所有容器的容器 ID(包括运行中和停止的容器)。
docker container ls -f ancestor=xxx根据镜像名称过滤,显示所有使用指定镜像(如 xxx)的容器。
docker container ls -f ancestor=xxx根据镜像 ID 过滤,显示所有使用指定镜像 ID(如 xxx)的容器。

参数:

  • -q:只返回容器的 ID,不显示其他信息。
  • -a:包括所有容器(包括停止的容器)。
  • -f / --filter:允许根据不同的条件进行过滤,条件如状态、镜像等。

我们可以利用上面的批量选择,执行一些对容器的批量操作,比如想要批量删除容器:

# 根据容器状态进行删除
docker container rm $(docker container ls -q --filter status=exited)
# 删除所有容器
docker container rm $(docker container ls -aq)

类比这种方式,我们可以对容器进行各种批量操作,下面是相关的删除操作:

操作描述命令
根据容器状态删除已退出容器docker container rm $(docker container ls -q --filter status=exited)
删除所有容器(包括运行中的和已停止的)docker container rm $(docker container ls -aq)
删除所有已停止的容器docker container rm $(docker container ls -aq --filter "status=exited")
删除所有悬挂的容器(未运行的容器)docker container prune -f
停止并删除所有容器docker stop $(docker ps -q) && docker rm $(docker ps -aq)
删除指定名称的容器docker container rm <container_name> <container_name>

容器交互模式

attached 模式

对于下面的命令:

# 通过 nginx 镜像创建一个容器, 映射 80 端口
[wqy@vm~]$ docker container run -p 80:80 nginx
  • -p 80:80 表示端口映射,第一个端口表示映射到宿主机的端口,第二个端口表示映射到 Docker 容器的端口。
  • 通过这种方式运行的容器,就是attached模式,容器在前台运行。
  • 访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器日志会实时展现到窗口并占用此端口
  • attached 模式仅适用于容器和程序的调试阶段
  • 而在linux服务器下,通过Ctrl+C信号就可以停止docker服务,实在不太方便(稳定),为了更加稳定,一般可以选用detached模式(后文介绍)

detached 模式

docker container run -p 80:80 nginx 命令基础上加 -d / --detach 选项表示 detached 模式

docker container run -p -d 80:80 nginx

对于 detached 模式:

  • 在后台运行,启动后只显示容器 ID,并且可以输入任何命令
  • 关掉窗口后依然继续运行,停止和删除容器都需要使用 shell 命令,减少误操作的可能
  • 一般更建议使用该模式
  • 我们可以通过 docker container attach <name> 将detached模式下的容器转为attached

interactive 模式

当我们创建好一个容器之后, 可能需要去容器内部获取信息或执行命令,就需要进入到交互式模式

例如创建一个 Ubuntu 容器后,需要到系统里输入各种 Shell 命令和系统进行交互,就需要先进入交互式模式。

docker container run -it nginx sh

上面的命令用于启动一个 nginx 容器,并在其中运行 sh(shell)命令,进入容器的交互式终端(Shell)。

我们可以在Shell中执行下面的命令:

bin boot dev docker-entrypoint.d docker-entrypoint.sh
etc home lib lib64 media mnt opt proc root run
sbin srv sys tmp usr var

-i:保持容器运行。通常与 -t 同时使用,加入 it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭

  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用

针对一个已经运行的容器里进入到交互模式

对于一个已经运行的容器,我们可以通过下面的命令,将其转为交互式模式:

docker container exec -it <name> sh

同时可以通过 exit 退出交互式模式。


容器 与 宿主机 文件拷贝

一般我们可以通过 以下方法 实现 容器 与 宿主机间的文件拷贝:

  1. docker cp 命令
  2. Docker 网络
  3. 挂载卷(Volume)
  4. 使用共享文件夹

下面分别进行简单举例:

1, 使用 docker cp 命令

docker cp 命令可以在宿主机与容器之间直接拷贝文件或目录。

  • 从宿主机拷贝文件到容器
docker cp /path/on/host <container_id>:/path/in/container# 示例
docker cp /home/user/data.txt my_container:/root/data.txt
# 将宿主机上的 `/home/user/data.txt` 文件拷贝到容器 `my_container` 的 `/root/data.txt` 路径。
  • /path/on/host:宿主机上的文件或目录路径。

  • <container_id>:容器的 ID 或名称。

  • /path/in/container:容器内目标路径。

  • 从容器拷贝文件到宿主机

docker cp <container_id>:/path/in/container /path/on/host‘# 示例
docker cp my_container:/root/data.txt /home/user/data.txt
# 将容器 my_container 中 /root/data.txt 文件拷贝到宿主机的 /home/user/data.txt 路径。
  • <container_id>:容器的 ID 或名称。
  • /path/in/container:容器内的文件或目录路径。
  • /path/on/host:宿主机上的目标路径。
  1. 使用挂载卷(Volume)

卷是 Docker 提供的一种持久化数据的方法。通过挂载卷,可以让容器与宿主机共享文件和目录。

使用命令行创建卷并挂载

我们可以在启动容器时通过 -v--mount 选项挂载一个宿主机目录到容器的某个路径,这样容器和宿主机就可以共享该目录的文件。

docker run -v /path/on/host:/path/in/container <image_name>
  • /path/on/host:宿主机上的目录。
  • /path/in/container:容器内的目录路径。
  1. 使用共享目录(Bind Mount)

与卷类似**,绑定挂载(Bind Mount)允许容器直接访问宿主机上的指定目录。通过绑定宿主机和容器的文件路径,可以让文件互通。**

docker run --mount type=bind,source=/path/on/host,target=/path/in/container <image_name>
  • source=/path/on/host:宿主机目录路径。
  • target=/path/in/container:容器内目录路径。
  1. 使用 Docker 网络(适用于容器间通信)

如果容器之间需要共享文件,可以通过 Docker 网络让容器直接访问宿主机或其他容器的服务。在这种场景下,文件传输可能通过网络协议(如 FTP、HTTP、NFS)进行。

例如:

  • 通过 NFSSamba 等协议共享文件。
  • 在宿主机上运行 FTP 服务,然后在容器内访问宿主机的 FTP 服务。

容器 自动删除 与 自动重启

  1. 容器的自动删除

容器自动删除是指当容器停止运行时,Docker 会自动删除容器以释放资源。这个功能通常用于短期任务或一次性任务的容器,以避免残留停止的容器。

我们可以在启动容器时 通过 -rm 参数设置容器的自动删除

docker run --rm ubuntu

  1. 容器自动重启
docker run --restart always <image_name>

这个指令保证容器在任何情况下停止后都能自动重启。


容器环境变量设置

在 Docker 中,环境变量可以在容器运行时传递给容器内部的应用或服务,下面会介绍一些设置环境变量的方法:

1. 使用 -e--env 选项设置环境变量

当你使用 docker run 命令启动容器时,可以使用 -e--env 选项来设置环境变量。每个 -e--env 选项后跟一个 KEY=VALUE 对。

示例:

docker run --rm -e MY_VAR=value ubuntu printenv MY_VAR
  • -e MY_VAR=value:设置容器内的环境变量 MY_VAR 的值为 value
  • printenv MY_VAR:容器内执行 printenv MY_VAR 命令,输出环境变量 MY_VAR 的值。

这个命令执行后会输出value


2. 使用 --env-file 选项从文件加载环境变量

如果有多个环境变量需要设置,可以将它们存储在一个文件中,并使用 --env-file 选项来加载这些环境变量。

  • 环境变量文件示例(.env 文件):
MY_VAR=value
ANOTHER_VAR=another_value
  • 命令:
docker run --rm --env-file .env ubuntu printenv MY_VAR
  • --env-file .env:从 .env 文件加载环境变量并传递给容器。
  • printenv MY_VAR:容器内执行 printenv MY_VAR,输出 MY_VAR 的值。

3. 使用 docker exec 修改正在运行容器的环境变量

如果容器已经在运行,并且你想修改它的环境变量,可以通过 docker exec 命令进入容器并在容器内修改环境变量。

示例:

docker exec -it <container_id> bash

进入容器后,可以使用 export 命令来设置环境变量:

export MY_VAR=value

此时,MY_VAR 的值会被修改为 value,但是这种修改只会在当前的 shell 会话中有效。如果你退出容器,环境变量会丢失。

4. 使用 --env 设置多个环境变量

我们也可以在同一 docker run 命令中设置多个环境变量。

  • 示例:
docker run --rm -e VAR1=value1 -e VAR2=value2 ubuntu bash -c 'echo $VAR1 $VAR2'
  • 这会同时设置 VAR1VAR2 两个环境变量,并输出它们的值。

查看容器的详细信息

  1. 查看容器的基本信息:docker psdocker inspect

a. docker ps:查看正在运行的容器(-a 查看所有容器)

docker ps 命令用于列出当前正在运行的容器,并显示其基本信息,比如容器 ID、名称、镜像、状态、端口映射等。

docker ps

输出示例:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
d8f9b711b8fa   ubuntu    "bash"                   2 minutes ago   Up 2 minutes             my_container

b. docker inspect:查看容器的详细信息

docker inspect 命令提供容器的详细信息,包括其配置、网络设置、挂载卷等。你可以通过容器 ID 或容器名称来指定需要查看的容器。

docker inspect <container_id_or_name>

输出示例:

[{"Id": "d8f9b711b8fa...","Created": "2024-12-28T08:24:35.275285626Z","Path": "bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 1234,"ExitCode": 0,"Error": "","StartedAt": "2024-12-28T08:24:37.607128397Z","FinishedAt": "2024-12-28T08:24:37.607128397Z"},"Image": "sha256:...","ResolvConfPath": "/var/lib/docker/containers/d8f9b711b8fa/resolv.conf","Mounts": [],"Config": {"Hostname": "d8f9b711b8fa","Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"]},"NetworkSettings": {"Networks": {"bridge": {"IPAddress": "172.17.0.2","MacAddress": "02:42:ac:11:00:02"}}}}
]

这个 JSON 格式的输出包含了容器的所有信息,比如:

  • Id:容器 ID
  • Created:容器创建时间
  • State:容器的状态(是否运行、退出代码等)
  • Config:容器的配置(如环境变量、命令等)
  • NetworkSettings:容器的网络配置(IP 地址、网络类型等)
  • Mounts:挂载的卷和文件系统
  1. 查看容器的资源使用情况:docker stats

docker stats 命令可以查看容器的实时资源使用情况,如 CPU、内存、网络 I/O 等。

docker stats

输出示例:

CONTAINER ID   NAME            CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
d8f9b711b8fa   my_container    0.02%     10.5MiB / 1.95GiB     0.53%     1.2kB / 0B       1.5MB / 0B        2

我们也可以指定查看某个容器的资源使用情况:

docker stats <container_id_or_name>
  1. 查看容器的日志:docker logs

通过 docker logs 命令,你可以查看容器的标准输出和标准错误输出日志。

加上 -f 参数 可以查看容器日志的实时输出。

docker logs <container_id_or_name>
  1. 查看容器的网络信息:docker network inspect

如果想查看容器的网络配置,可以使用 docker network inspect 命令。首先可以使用 docker network ls 查看当前可用的网络。

docker network ls

然后,通过 docker network inspect 来查看某个网络的详细信息,其中也包括与该网络连接的容器信息。

docker network inspect <network_name_or_id>
  1. 查看容器的环境变量:docker execprintenv

你可以通过 docker exec 进入容器并使用 printenv 命令查看容器内的所有环境变量:

docker exec -it <container_id_or_name> printenv

如果你只关心某个特定的环境变量,可以通过 grep 过滤:

docker exec -it <container_id_or_name> printenv | grep MY_VAR
  1. 查看容器内的进程:docker top

docker top 命令可以显示容器内的进程信息,类似于 Linux 上的 top 命令。

docker top <container_id_or_name>

它会显示容器内部正在运行的进程列表,包括 PID、进程名、内存使用情况等。

  1. 查看容器的文件系统:docker diff

docker diff 命令可以列出容器文件系统中的变化,显示自容器启动以来做出的文件修改(增加、删除、修改)。

docker diff <container_id_or_name>
  1. 查看容器的挂载卷:docker inspect

容器的挂载卷信息也可以通过 docker inspect 获取,具体是在输出的 Mounts 部分。

docker inspect <container_id_or_name> | grep Mounts -A 10

容器镜像的导入导出

下面分别列出容器与镜像的导入导出命令:

操作命令格式示例解释
导出容器docker export <container_id> > <filename>.tardocker export my_container > backup.tar将容器的文件系统导出为 .tar 格式的文件,不包括镜像和容器的元数据。
导入容器docker import <filename>.tar <image_name>:<tag>docker import backup.tar my_image:latest.tar 文件中导入容器的文件系统并创建一个新的镜像。
导出镜像docker save -o <filename>.tar <image_name>:<tag>docker save -o my_image.tar my_image:latest将 Docker 镜像导出为 .tar 文件,可以在其他主机上通过 docker load 导入使用。
导入镜像docker load -i <filename>.tardocker load -i my_image.tar.tar 文件中加载镜像,并将其添加到本地 Docker 镜像列表中。

镜像的资源查看

这里直接列举相关的docker 资源查看命令:

命令说明
docker imagesdocker image ls列出所有本地镜像及其信息 (名称、标签、大小等)
docker inspect <image_name>查看镜像的详细元数据
docker history <image_name>查看镜像的历史层信息及构建过程
docker system df查看 Docker 系统的磁盘使用情况(镜像、容器、卷)
docker image inspect <image_name>查看镜像的详细层次结构信息

镜像的日志查看

下面的表格介绍了 使用 docker logs 查看日志的方式:

操作命令格式示例说明
查看容器日志docker logs <container_id_or_name>docker logs my_container显示指定容器的标准输出和标准错误输出。
实时查看容器日志docker logs -f <container_id_or_name>docker logs -f my_container实时查看容器日志,类似 tail -f,会持续显示新产生的日志条目。
查看容器日志的特定时间范围(自某时间点起)docker logs --since "<time>" <container_id_or_name>docker logs --since "2024-12-01T00:00:00" my_container查看自某个时间点以来的日志。时间可以是相对时间(如 10m 表示过去 10 分钟)。
查看容器日志的特定时间范围(直到某时间点)docker logs --until "<time>" <container_id_or_name>docker logs --until "2024-12-01T00:00:00" my_container查看直到某个时间点的日志。
查看容器日志的最新部分docker logs --tail <number> <container_id_or_name>docker logs --tail 100 my_container查看容器日志的最后 N 行,帮助你快速查看最新的日志条目。
查看容器日志并显示时间戳docker logs -t <container_id_or_name>docker logs -t my_container在每条日志前添加时间戳,帮助你了解日志产生的时间。
实时查看日志并显示时间戳docker logs -ft <container_id_or_name>docker logs -ft my_container实时查看容器日志,并且每条日志会带有时间戳。
查看容器日志并实时跟踪最新部分docker logs -f --tail <number> <container_id_or_name>docker logs -f --tail 50 my_container查看容器的最后 N 行日志,并且实时跟踪新的日志更新。

参数部分:

  • -f:实时查看日志输出,类似于 Linux 命令 tail -f
  • --since--until:用于指定时间范围,--since 是自某个时间点以来,--until 是直到某个时间点。
  • --tail:仅查看日志的最后 N 行。
  • -t:在日志行前加上时间戳,便于查看日志发生的时间。

容器的资源查看

下面简单介绍一些命令:监控和查看容器的资源消耗,如 CPU、内存、磁盘等:

操作描述命令
查看所有容器的实时资源使用情况docker stats
查看单个容器的实时资源使用情况docker stats <container_name_or_id>
查看容器的详细信息(包括资源限制等)docker inspect <container_name_or_id>
查看容器的内存限制docker inspect --format '{{.HostConfig.Memory}}' <container_name_or_id>
查看容器的 CPU 配额docker inspect --format '{{.HostConfig.CpuShares}}' <container_name_or_id>
查看容器的日志docker logs <container_name_or_id>
查看容器的文件系统使用情况docker system df

六、综合实战

Mysql 容器化安装

1进入docker hub 官网,查找 mysql 的镜像,可以看到很多版本,这里选择一个使用人数相对较多的:

图片图片图片

通过 docker pull 拉取镜像

ubuntu@VM-8-2-ubuntu:~$ docker pull mysql:5.7
5.7: Pulling from library/mysql
20e4dcae4c69: Pull complete 
1c56c3d4ce74: Pull complete 
e9f03a1c24ce: Pull complete 
68c3898c2015: Pull complete 
6b95a940e7b6: Pull complete 
90986bb8de6e: Pull complete 
ae71319cb779: Pull complete 
ffc89e9dfd88: Pull complete 
43d05e938198: Pull complete 
064b2d298fba: Pull complete 
df9a4d85569b: Pull complete 
Digest: sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

MySQL 的默认端口是 3306,且有密码。根据官网的启动用例:

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

解释一下部分字段:

  1. --name some-mysql:为新启动的容器指定一个名字,这里容器的名字是 some-mysql

  2. -e MYSQL_ROOT_PASSWORD=my-secret-pw:使用 -e 参数设置环境变量。这个环境变量 MYSQL_ROOT_PASSWORD 用来设置 MySQL 数据库的 root 用户密码。这里密码设置为 my-secret-pw

  3. -d:指示 Docker 在后台运行容器,并返回容器 ID。容器不会绑定到终端。

执行下面的命令:

ubuntu@VM-8-2-ubuntu:~$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 8200:3306 -d mysql:5.7
4a542dd7bfe0a8be6d47fb2cbd6d9f165596d56b07463eb8d6a702a92c577d00

此时进入容器,可以发现mysql可以正常登录:

ubuntu@VM-8-2-ubuntu:~$ docker exec -it mysql bash
bash-4.2# mysql -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44 MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 

通过下面的代码释放空间:

docker stop mysql
docker rm mysql

Redis 容器化安装

Redis 出现的原因

在 Web 应用发展的初期,关系型数据库受到了广泛的关注和应用。这是因为当时的 Web 站点访问量和并发不高,交互也较少。随着访问量的提升,使用关系型数据库的 Web 站点逐渐开始在性能上遇到瓶颈,而瓶颈的主要原因通常是在磁盘的 I/O 上。随着互联网技术的进一步发展,各类应用层层叠加,导致如今在云计算、大数据盛行的时代,对性能有了更高的要求,主要体现在以下几个方面:

  1. 低延迟的读写速度:快速响应的应用能显著提升用户的满意度。
  2. 支撑海量数据和流量:例如,搜索引擎等大型应用需要处理 PB 级别的数据,并能应对百万级的并发流量。

为了解决这些问题,NoSQL 数据库应运而生,它具备高性能、可扩展性强和高可用等优点,广泛受到开发人员和系统管理员的青睐。


Redis 是什么

Redis(全称:Remote Dictionary Server,中文名为远程字典服务器)是目前最受欢迎的 NoSQL 数据库之一。它使用 ANSI C 编写,是一个开源、基于内存、支持多种数据结构的键值对存储数据库,具备如下特性:

  • 基于内存运行,性能高效:由于数据存储在内存中,读写速度非常快。
  • 支持分布式,具备理论上的无限扩展性:可以横向扩展,支持大规模分布式系统。
  • 键值存储系统:数据以键值对形式存储,简单而高效。
  • 开源且使用 ANSI C 编写:遵循 BSD 协议,并支持多种编程语言的 API。
  • 支持持久化:可以将数据持久化到磁盘,也可以仅作为内存存储使用。

Redis 的应用场景

几乎所有的大型互联网公司都在使用 Redis。Redis 提供了多种数据类型,如 String 类型、哈希类型、列表类型、集合类型、顺序集合类型,这些数据结构能够支持多种应用场景。以下是 Redis 常见的应用场景:

  • 缓存系统:尤其适用于“热点”数据(即频繁读取、少量写入的数据),能大幅提高系统响应速度。
  • 计数器:适用于需要实时计数的场景,如访问量统计、投票系统等。
  • 消息队列系统:通过 Redis 的 List 和 Pub/Sub 功能,构建高效的消息队列。
  • 实时排行榜:Redis 的有序集合(Sorted Set)能高效地支持实时排行榜的需求。
  • 社交网络:如用户关注、评论、点赞等社交互动操作,可以通过 Redis 高效处理。

Redis 的高性能和灵活性使其成为许多 Web 应用中不可或缺的组件,尤其是在需要快速响应和处理海量数据时,Redis 的优势尤为明显。


C++ 容器制作

  1. 首先通过 docker pull ubuntu:22.04 拉取镜像

  2. 启动容器:

ubuntu@VM-8-2-ubuntu:~$ docker run --name mygcc -it ubuntu:22.04 bash
  1. 更新apt包并安装gcc/vim:
apt update
apt install gcc vim -y
  1. 编辑代码:
root@8f8244b7f41d:/# mkdir src
root@8f8244b7f41d:/# cd src
root@8f8244b7f41d:/src# vim demo.c

在这里插入图片描述

  1. 执行代码:
root@8f8244b7f41d:/src# gcc demo.c -o demo
root@8f8244b7f41d:/src# ./demo
hello docker
  1. 此时退出容器
root@8f8244b7f41d:/src# exit
exit
ubuntu@VM-8-2-ubuntu:~$

可以看出容器已经退出,如果想再次运行通过restart恢复即可。


容器资源更新

  1. 首先运行一个 nginx 容器
ubuntu@VM-8-2-ubuntu:~$ docker run -d --name mynginx1 -p 8080:80 nginx:1.24.0
88c1f95c0066a3658ccee40a9207b5f44ff970a4e815ad8b05297b5875316f6f
  1. 通过 docker top 查看容器中的进程, 添加 aux 查看内存和CPU信息
ubuntu@VM-8-2-ubuntu:~$ docker top mynginx1 aux
USER                PID                 %CPU                %MEM                VSZ                 RSS                 TTY                 STAT                START               TIME                COMMAND
root                2378550             0.1                 0.3                 8932                5760                ?                   Ss                  20:00               0:00                nginx: master process nginx -g daemon off;
message+            2378598             0.0                 0.1                 9320                2772                ?                   S                   20:00               0:00                nginx: worker process
message+            2378599             0.0                 0.1                 9320                2772                ?                   S                   20:00               0:00                nginx: worker process
  1. 通过 docker stat 查看资源的动态变化:
ubuntu@VM-8-2-ubuntu:~$ docker top mynginx1 aux
USER                PID                 %CPU                %MEM                VSZ                 RSS                 TTY                 STAT                START               TIME                COMMAND
root                2378550             0.1                 0.3                 8932                5760                ?                   Ss                  20:00               0:00                nginx: master process nginx -g daemon off;
message+            2378598             0.0                 0.1                 9320                2772                ?                   S                   20:00               0:00                nginx: worker process
message+            2378599             0.0                 0.1                 9320                2772                ?                   S                   20:00               0:00                nginx: worker process
  1. 通过 docker update 更新容器的最大内存
ubuntu@VM-8-2-ubuntu:~$ docker update -m 300m --memory-swap 600m mynginx1
mynginx1
  1. 再次执行 docker stat 查询容器状态,可以看到最大内存被限制为 300mb
ubuntu@VM-8-2-ubuntu:~$ docker update -m 300m --memory-swap 600m mynginx1
mynginx1
  1. 停止容器并释放资源:
docker stop <id>
docker rm <id>

相关文章:

【Docker基础】容器技术详解:生命周期、命令与实战案例

文章目录 一、什么是容器&#xff1f;二、为什么需要容器三、容器的生命周期容器状态容器OOM容器异常退出容器异常退出容器暂停 四、容器命令命令清单详细介绍 五、容器操作案例容器的状态迁移容器批量操作容器交互模式attached 模式detached 模式interactive 模式 容器 与 宿主…...

电子电气架构 --- 为配备区域计算的下一代电子/电气(E/E)架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

python基础:位置互换

n int(input()) for _ in range(n):line input().strip()line list(line)for i in range(1,len(line)1):if i%2 0:line[i-2], line[i-1] line[i-1],line[i-2] print(.join(line))以下分不同数据类型说明 Python 实现奇偶互换的方法&#xff1a; 字符串的奇偶位互换 若字…...

51单片机Day03---让一个LED灯闪烁

目录 1.研究原理图&#xff1a; 2.一些小知识&#xff08;重定义的使用&#xff09;&#xff1a; &#xff08;1&#xff09;在单片机中&#xff0c;unsigned int 常用于以下场景&#xff1a; &#xff08;2&#xff09;unsigned char&#xff1a; 3.思路构造&#xff1a;…...

城电科技 | 从概念到落地:如何打造真正的智慧零碳园区?

在科技飞速发展的当下&#xff0c;智慧零碳园区成为了引领未来发展的重要范式。那么&#xff0c;究竟什么是智慧零碳园区呢&#xff1f; 智慧零碳园区&#xff0c;是借助前沿信息技术&#xff0c;把物联网、云计算、大数据等技术深度融入园区管理及产业运营&#xff0c;以此达…...

oracle常见问题处理集锦

oracle常见问题处理集锦 oracle常见问题处理集锦ORA:28000 the count is locked oracle常见问题处理集锦 ORA:28000 the count is locked ORA-28000: 账户已被锁定 这个错误表示你尝试登录的 Oracle 数据库用户账户已被锁定&#xff0c;常见原因包括&#xff1a; 多次密码输错…...

Java-JDBC入门程序、预编译SQL

一. JDBC JDBC&#xff1a;Java DataBase Connectivity 就是使用Java语言操作关系型数据库的一套API 本质&#xff1a;sun公司官方定义一套操作所有关系型数据库的规范&#xff0c;即接口&#xff1b;各个数据库厂商去实现这套接口&#xff0c;提供数据库驱动jar包。我们可以使…...

【SQL】基于多源SQL 去重方法对比 -- 精华版

【SQL】基于SQL 去重方法对比 -- 精华版 一、引言二、基于SQL去重方法完整对比1. MySQL去重方法及优劣势1.1 ​DISTINCT关键字1.2 GROUP BY子句1.3 UNION系列操作1.4 子查询 自关联 2. Hive去重方法及优劣势2.1 DISTINCT关键字2.2 ​GROUP BY子句2.3 ​ROW_NUMBER窗口函数2.4 …...

list的使用以及模拟实现

本章目标 1.list的使用 2.list的模拟实现 1.list的使用 在stl中list是一个链表,并且是一个双向带头循环链表,这种结构的链表是最优结构. 因为它的实现上也是一块线性空间,它的使用上是与string和vector类似的.但相对的因为底层物理结构上它并不像vector是线性连续的,它并没有…...

java继承练习

//创建父类public class Employee {private String id;private String name;private double salary;public Employee() {}public Employee(String id, String name, double salary) {this.id id;this.name name;this.salary salary;}public String getId() {return id;}pu…...

猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取

开发背景 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的…...

sparkcore编程算子

今天是Spark Core编程算子 Value类型算子 1. map 将处理的数据逐条进行映射转换&#xff0c;这里的转换可以是类型的转换&#xff0c;也可以是值的转换。Map算子是分区内一个数据一个数据的执行&#xff0c;类似于串行操作。 特点&#xff1a; - 主要目的将数据源中的数据进行…...

【EI会议】第三届机器人与软件工程前沿国际会议(FRSE 2025)

第三届机器人与软件工程前沿国际会议&#xff08;FRSE 2025&#xff09;将于2025年8月8日-10日在中国张家界召开。会议由清华大学自动化系主办&#xff0c;长沙理工大学、湖南科技大学、吉首大学、AC学术中心协办。 一、会议信息 大会官网&#xff1a;www.icfrse.org 会议时…...

机器人系统仿真--1.机器人模型URDF

添加机器人地盘...

具身机器人中AI(DEEPSEEK)与PLC、驱动器协同发展研究:突破数据困境与指令精确控制(3)

具身机器人中AI&#xff08;DEEPSEEK&#xff09;与PLC、驱动器协同发展研究&#xff1a;突破数据困境与指令精确控制&#xff08;1&#xff09;-CSDN博客 具身机器人中AI&#xff08;DEEPSEEK&#xff09;与PLC、驱动器协同发展研究&#xff1a;突破数据困境与指令精确控制&a…...

+++++背到厌倦。持续更新

Spring IoC 的工作流程: 读取 BeanDefinition: Spring 容器启动时&#xff0c;会读取 Bean 的配置信息 (例如 XML 配置文件、注解或 Java 代码)&#xff0c;并将这些配置信息转换为 BeanDefinition 对象。创建 Bean 实例: 根据 BeanDefinition 中的信息&#xff0c;Spring 容器…...

修改 docker 工作目录

一、停掉 containerd、cri-docker、docker systemctl stop containerd systemctl stop cri-docker systemctl stop docker 二、拷贝 docker 工作目录下的所有文件到新路径 rsync -aP /var/lib/docker/ /docker/data/ 三、daemon.json 添加新工作目录路径 {"registry-…...

51c嵌入式~继电器~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/13775821 一、继电器应用细节 继电器的应用&#xff0c;相信大家都知道&#xff0c;在电路中只要给它供电、断电也就可以工作了。本文讨论它的应用细节。 现在流行的接法 图中&#xff0c;继电器的线圈经过Q1作为开关&am…...

舵机:机器人领域的“关节革命者”

机器人的技术&#xff0c;每一个细微的进步都可能引领一场行业变革。而在这场变革中&#xff0c;舵机作为机器人关节的核心部件&#xff0c;正悄然上演着一场革命性的应用风暴。从简单的关节运动到复杂的姿态控制&#xff0c;舵机以其卓越的性能和无限的可能&#xff0c;重新定…...

飞书集成衡石ChatBot实战:如何10分钟搭建一个业务数据问答机器人?

让数据查询像聊天一样简单 在快节奏的业务环境中&#xff0c;数据查询的实时性和便捷性至关重要。传统BI工具需要复杂的操作&#xff0c;而衡石ChatBot结合飞书&#xff0c;让业务人员只需在聊天窗口提问&#xff0c;就能立刻获取数据反馈&#xff0c;真正实现“零门槛”数据分…...

高并发环境下超发现象的详细分析,包含场景示例、影响分析及解决方案(悲观锁、乐观锁、分布式锁)

以下是针对高并发环境下超发现象的详细分析&#xff0c;包含场景示例、影响分析及解决方案&#xff1a; 高并发下的超发详解 1. 超发现象定义 超发&#xff08;Over-issuance&#xff09;指在并发操作中&#xff0c;系统实际发放的资源&#xff08;如商品库存&#xff09;超过…...

Git 分支整合策略:Cherry-pick、Merge、Rebase 三者之间对比

Git 分支整合策略详解&#xff1a;Cherry-pick、Merge、Rebase 在日常的 Git 多分支协作开发中&#xff0c;代码合并是常见操作。Git 中主要提供以下三种方式来合并或迁移分支的提交&#xff1a; Cherry-pick&#xff1a;精确挑选部分提交复制到当前分支&#xff1b;Merge&am…...

嵌入式八股---计算机网络篇

前言 这块主要是结合着LWIP去理解计算机网络中常见的面试题 OSI四层/五层/七层模型 OSI分层&#xff08;7层&#xff09;&#xff1a;物理层、数据链路层、网络层、传输层、会话层(http)、表示层(加密)、应用层。 TCP/IP分层&#xff08;4层&#xff09;&#xff1a;网络接口层…...

使用 3D Layout 和 Icepak 进行 PCB、DCIR 和热分析

在本教程中&#xff0c;您将学习如何使用 3D Layout 执行 DCIR&#xff0c;然后使用功率损耗数据执行热分析。热分析将使用电子桌面 Icepak 进行。SIwave 及其嵌入式 icepak 可用于执行相同的分析&#xff0c;但有一个例外。电子桌面 Icepak 是一款功能齐全的 3D 工具。用户可以…...

UE5 Windows游戏窗口置顶

参考资料&#xff1a;UE5 UE4 项目设置全局置顶_ue4运行设置置顶-CSDN博客 修改完build.cs后&#xff0c;关掉重新生成解决方案。&#xff08;不然可能编译报错&#xff0c;在这卡了半个小时&#xff09; 不知道怎么用C的&#xff0c;可以用这个 Topmost - Keep Editor/Game w…...

【Linux】进程管理

一、程序与进程区别 1.程序&#xff1a; 存放在磁盘文件可执行文件&#xff08;静态存在&#xff09; 特点 静态性&#xff1a;程序是静态的&#xff0c;它只是一组指令的集合&#xff0c;在未被执行时&#xff0c;不会占用计算机的运行资源&#xff0c;也不会产生任何实际的…...

Android Studio PNG转SVG方法总结

在 Android Studio 中&#xff0c;将 PNG 位图转换为 SVG 矢量图并非直接内置的功能&#xff0c;但你可以通过以下步骤实现目标&#xff1a; 方法 1&#xff1a;使用在线转换工具 访问在线转换网站 推荐工具&#xff1a; CloudConvert Vector Magic OnlineConvertFree 上传…...

第6篇:Linux程序访问控制FPGA端LEDR<四>

Q&#xff1a;如何设计.c程序代码控制FPGA端外设LEDR动态显示&#xff1f; A&#xff1a;我们来设计程序实现简易计数器&#xff1a;将上一期点亮LEDR的程序代码*LEDR_ptr 0x2aa 改为 *LEDR_ptr *LEDR_ptr 1&#xff0c;读取LEDR端口的data寄存器&#xff0c;将寄存器值递增…...

DP扰码模块verilog仿真

在DisplayPort 1.4协议中&#xff0c;为了减少EMI&#xff0c;在8B/10B编码之前&#xff0c;需进行扰码Scramble。扰码用到了16-bit LFSR&#xff0c;表达式如下。 LFSR每移位8个bit后&#xff0c;用最高有效 8 位以相反的位顺序与一个字节数据进行异或从而实现数据加扰/解扰。…...

协作焊接机器人的应用场景

协作焊接机器人凭借其灵活性、安全性和高效性&#xff0c;在多个领域有着广泛的应用场景&#xff0c;以下是一些主要的方面&#xff1a; 汽车制造 车身焊接&#xff1a;在汽车车身生产线上&#xff0c;协作焊接机器人可与工人协同工作&#xff0c;完成车身各部件的焊接任务。例…...

深入解析计算机操作系统的底层架构与核心模块功能

深入解析计算机操作系统的底层架构与核心模块功能 一、操作系统底层架构总览 操作系统处于计算机系统的核心地位&#xff0c;是计算机硬件与用户之间的关键纽带&#xff0c;承担着资源管理者的重要角色。它负责统筹管理计算机的各类资源&#xff0c;如CPU、内存、存储设备以及…...

Elasticsearch 官网阅读学习笔记01

Elasticsearch 官网阅读学习笔记01 什么是 Elasticsearch&#xff1f; Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Elasticsearch 可为所有类型的数据提供近乎实时的搜索和分析。无论您拥有的是结构化或非结构化文本、数值数据还是地理空间数据 Elastic…...

玩转Docker | 使用Docker搭建Van-Nav导航站

玩转Docker | 使用Docker搭建Van-Nav导航站 前言一、Van-Nav介绍van-nav 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Van-Nav服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问Van-Nav应用访问Van-Nav首页登录后台管理五、添…...

若依 前后端部署

后端&#xff1a;直接把代码从gitee上拉去到本地目录 (https://gitee.com/y_project/RuoYi-Vue ) 注意下redis连接时password改auth 后端启动成功 前端&#xff1a;运行前首先确保安装了node环境&#xff0c;随后执行&#xff1a; &#xff01;&#xff01;一定要用管理员权限…...

笔记:头文件与静态库的使用及组织方式

笔记&#xff1a;头文件与静态库的使用及组织方式 1. 头文件的作用 接口声明&#xff1a;提供函数、类、变量等标识符的声明&#xff0c;供其他模块调用。编译依赖&#xff1a;编译器需要头文件来验证函数调用和类型匹配。避免重复定义&#xff1a;通过包含保护&#xff08;如…...

PostgreSQL-常用命令

PostgreSQL 提供了丰富的命令行工具和 SQL 命令&#xff0c;用于管理和操作数据库。以下是一些常用的命令和操作&#xff1a; 1. 数据库管理 创建数据库 CREATE DATABASE dbname; 删除数据库 DROP DATABASE dbname; 列出所有数据库 \l SELECT datname FROM pg_database;…...

如何在 Postman(测试工具) 中实现 Cookie 持久化并保持同一会话

在开发基于 Spring Boot 的 Web 应用时&#xff0c;使用 Session 存储验证码等敏感信息是常见的做法。然而&#xff0c;在调试接口时&#xff0c;你可能会遇到这样一个问题&#xff1a;第一次请求接口时存入的验证码在第二次请求时无法获取&#xff0c;原因往往是两个请求所使用…...

粘性定位(position:sticky)——微信小程序学习笔记

1. 简介 CSS 中的粘性定位&#xff08;Sticky positioning&#xff09;是一种特殊的定位方式&#xff0c;它可以使元素在滚动时保持在视窗的特定位置&#xff0c;类似于相对定位&#xff08;relative&#xff09;&#xff0c;但当页面滚动到元素的位置时&#xff0c;它会表现得…...

谷歌浏览器极速安装指南

目录 &#x1f4cb; 准备工作 步骤一&#xff1a;访问官网 &#x1f310; 步骤二&#xff1a;获取安装包 ⬇️ 步骤三&#xff1a;一键安装 &#x1f5b1;️ 步骤四&#xff1a;首次启动设置 ⚙️ 步骤五&#xff1a;开始探索&#xff01; &#x1f31f; &#x1f4ac; …...

【2024年最新IEEE Trans】模糊斜率熵Fuzzy Slope entropy及5种多尺度,应用于状态识别、故障诊断!

引言 2024年11月&#xff0c;研究者在测量领域国际顶级期刊《IEEE Transactions on Instrumentation and Measurement》&#xff08;IF 5.6&#xff0c;JCR 1区&#xff0c;中科院二区&#xff09;上发表科学研究成果&#xff0c;以“Optimized Fuzzy Slope Entropy: A Comple…...

无人机击落技术难点与要点分析!

一、技术难点 1. 目标探测与识别 小型化和低空飞行&#xff1a;现代无人机体积小、飞行高度低&#xff08;尤其在城市或复杂地形中&#xff09;&#xff0c;雷达和光学传感器难以有效探测。 隐身技术&#xff1a;部分高端无人机采用吸波材料或低可探测设计&#xff0c;进…...

Flink的数据流图中的数据通道 StreamEdge 详解

本文从基础原理到代码层面逐步解释 Flink 的数据通道 StreamEdge&#xff0c;尽量让初学者也能理解。 主要思路&#xff1a;从概念开始&#xff0c;逐步深入到实现细节&#xff0c;并结合伪代码来逐步推导。 第一步&#xff1a;什么是 StreamEdge&#xff1f; StreamEdge 是 F…...

OpenCV 图形API(25)图像滤波-----均值滤波(模糊处理)函数blur()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用归一化的方框滤波器模糊图像。 该函数使用以下核来平滑图像&#xff1a; K 1 k s i z e . w i d t h k s i z e . h e i g h t [ 1 1 ⋯ …...

基于频率约束条件的最小惯量需求评估,包括频率变化率ROCOF约束和频率最低点约束matlab/simulink

基于频率约束条件的最小惯量评估&#xff0c;包括频率变化率ROCOF约束和频率最低点约束matlab/simulink 1建立了含新能源调频的频域仿真传函模型&#xff0c;虚拟惯量下垂控制 2基于构建的模型&#xff0c;考虑了不同调频系数&#xff0c;不同扰动情况下的系统最小惯量需求...

.pdf,.docx,.doc文档在一页纸上显示4页内容(详细步骤)

生活中常见一页纸上显示4页内容&#xff0c;我们熟知的是打印文件时&#xff0c;选择“每页4版”&#xff0c;但如果也是为了方便阅读&#xff0c;想要设置成一张纸上显示4页内容&#xff0c;又该怎么做呢&#xff1f;下面分享.docx和.pdf文档&#xff0c;一张纸上显示4页内容的…...

基于CNN-BiLSTM-GRU的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码

一、深度Q网络&#xff08;Deep Q-Network&#xff0c;DQN&#xff09;介绍 1、背景与动机 深度Q网络&#xff08;DQN&#xff09;是深度强化学习领域的里程碑算法&#xff0c;由DeepMind于2013年提出。它首次在 Atari 2600 游戏上实现了超越人类的表现&#xff0c;解决了传统…...

高并发场景下的 Java 性能优化

在当今数字化时代&#xff0c;高并发场景已成为众多 Java 应用面临的常态&#xff0c;如电商大促、在线直播等活动期间&#xff0c;系统需承受巨大的访问压力。因此&#xff0c;Java 性能优化在高并发场景下显得尤为重要。传统的人工编写代码优化方式不仅耗时费力&#xff0c;还…...

Java 设计模式:观察者模式详解

Java 设计模式&#xff1a;观察者模式详解 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖它的对象都会收到通知并自动更新。这种模式广泛…...

Linux vagrant 导入Centos

前言 vagrant 导入centos 虚拟机 前提要求 安装 virtualbox 和vagrant<vagrant-disksize> (Linux 方式 Windows 方式) 创建一键部署centos 虚拟机 /opt/vagrant 安装目录/opt/VirtualBox 安装目录/opt/centos8/Vagrantfile &#xff08;可配置网络IP&#xff0c;内存…...

linux Ubuntu 如何删除文件,错误删除后怎么办?

一、删除文件的常用方法 命令行删除 普通删除&#xff1a;rm 文件名 &#xff08;示例&#xff1a;rm old_file.txt&#xff09; 强制删除&#xff08;无提示&#xff09;&#xff1a;rm -f 文件名 &#xff08;示例&#xff1a;rm -f locked_file.txt&#xff09; 删除目录…...