Docker学习——⑤

news2024/11/25 4:28:29

文章目录

  • 1、什么是Docker Container(容器)
  • 2、容器的生命周期
    • 2.1 容器 OOM
    • 2.2 容器异常退出
    • 2.3 容器暂停
  • 3、容器命令详解
  • 4、容器操作案例
    • 4.1 容器批量处理技巧
    • 4.2 容器交互模式
    • 4.3 容器自动重启
    • 4.4 容器环境变量配置
  • 5、综合实战
    • 5.1 Mysql 容器化安装
    • 5.2 Redis 容器化安装
    • 5.3 C++容器制作
  • 6、常见问题

1、什么是Docker Container(容器)

通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态

虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别

容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本

在这里插入图片描述

镜像与容器就相当于同样是开发商提供的毛坯房,但是两家人装修出来的完全不一样

在这里插入图片描述

或者我们都学习了 Java 或者 C++之类的面向对象的语言,可以理解为镜像为基础类,容器是实例化出来的一个个对象,没有用户需要的不一样,里面的内容也就不一样了

在这里插入图片描述

为什么需要容器?
镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用

容器带来哪些收益呢,参考我之前的文章:为什么要虚拟化、容器化?

2、容器的生命周期

容器的生命周期是容器可能处于的状态:

  • 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,非计划终止 这时需要杀死最吃内存的容器
container process exitde(异常终止):出现容器被终止后,将进入 Should restart?

  • yes 需要重启,容器执行 start 命令,转为运行状态
  • no 不需要重启,容器转为停止状态

2.1 容器 OOM

Docker 在处理 OOM 事件时分为三种情况

(1)如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。例如,在容器当中,部署了一个 web 服务。假设主机分配给此容器的内存上限为 1G,当脚本申请的内存大于 1G 时,此容器就会触发 OOM 事件。而在这种情况下,此容器将会被强制关闭。但需要注意的是,此时关闭容器的并非是 Docker Daemon,而是宿主机操作系统。因为一个容器其实就是一组运行在宿主机操作系统当中的进程,宿主机操作系统通过cgroups 对这组进程设定资源上限,当这些进程申请的资源到达上限时,触发的是宿主机操作系统的内核 OOM 事件,因此最终是由宿主机内核来关闭这些进程

(2) 如果用户不想关闭这个容器,那么可以选择- -oom-kill-disable 来禁用 OOM-Killer。使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去

(3)如果用户使用了- -oom-kill-disable,但也没有使用-m 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大

2.2 容器异常退出

每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。docker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时,Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running 状态。只有设置了- -restart 参数的容器,Docker Daemon 才会去尝试启动,否则容器会保持停止状态

2.3 容器暂停

Docker“剥夺”了此容器的 CPU 资源。而其他资源,如 Memory 资源、Network 资源等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态

3、容器命令详解

命令别名功能
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 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阻止一个或多个容器停止,然后打印退出代码

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” or - -cpuset-cpus=“0,1,2”: 绑定容器到指定 CPU 运行
-m :设置容器使用内存最大值
- -network=“bridge”: 指定容器的网络连接类型
- -link=[]: 添加链接到另一个容器
- -volume , -v: 绑定一个卷
- -rm :shell 退出的时候自动删除容器
- -restart:自动重启

这个命令和 docker run 的参数基本一样

创建一个容器,它的状态就是created

在这里插入图片描述

docker start
启动停止的容器或者已经创建的容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

别名

docker container start

启动刚刚创建的容器

在这里插入图片描述

docker logs
查看容器日志

docker logs [OPTIONS] CONTAINER

别名

docker container logs

关键参数
-f ,- -follow: 跟踪日志输出
- -since :显示某个开始时间的所有日志
-t,- -timestamps : 显示时间戳
-n,- -tail :仅列出最新 N 条容器日志

不带参数查看log

在这里插入图片描述

查看容器 mywebsite1 从 2016 年 7 月 1 日后的最新 2 条日志

docker logs --since="2016-07-01" --tail=2 mywebsite1

在这里插入图片描述

docker attach
连接到正在运行中的容器

docker attach [OPTIONS] CONTAINER

别名

docker container attach

关键参数
- -sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的话不会影响容器,否则退出会导致容器退出

链接前面启动的mywebsite1容器,并访问页面,此时就会产生前台日志

在这里插入图片描述

此时按下ctrl+c,此时就会收到2号信号,容器就会停止

在这里插入图片描述

如何不退出呢?此时就需要使用到 - -sig-proxy 参数,将退出信号拦截掉

docker attach --sig-proxy=false mywebsite1

在这里插入图片描述

docker exec
在容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

别名

docker container exec

关键参数
-d :分离模式: 在后台运行
-i :即使没有附加也保持 STDIN 打开
-t :分配一个伪终端
-e :设置环境变量
-u,- -user :指定用户 “<name|uid>[:<group|gid>]”
-w,- -workdir:指定工作目录

参数-it
在容器 mywebsite1 中以交互模式执行 echo

docker exec -it mywebsite1 echo "Hello bit"

在这里插入图片描述

在容器 mywebsite1中以交互模式打开 shell

docker exec -it mywebsite1 bash

在这里插入图片描述

通过 id 进入 mywebsite1 中

在这里插入图片描述

参数-e
设置环境变量

docker exec -it -e mynginx=fl mywebsite1 bash

在这里插入图片描述

参数-u
指定用户为nginx,查看mywebsite1的nginx的版本,前提是用户存在,如如果用户不存在,则会报错

docker exec -it -u nginx mywebsite1 nginx -v

在这里插入图片描述

参数-w
指定工作目录为/etc

docker exec -it -w /etc mywebsite1 bash

在这里插入图片描述

docker stop
停止正在运行的容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

别名

docker container stop

关键参数
-s:发送的信号

停止正在运行的 mywebsite1

docker stop mywebsite1

在这里插入图片描述

无论容器正在后台运行还是正在交换,docker stop 都能将其停止掉

docker restart
重启容器

docker restart [OPTIONS] CONTAINER [CONTAINER...]

别名

docker container restart

关键参数
-s :发送信号

docker restart=docker stop + docker start

在终端1进行日志跟踪

docker logs -f -n 2 mywebsite1

在这里插入图片描述
在终端2重启 mywebsite1

docker restart mywebsite1

在这里插入图片描述

docker kill
强制退出容器

docker kill [OPTIONS] CONTAINER [CONTAINER...]

别名

docker container kill

关键参数
-s :发送的信号
注意事项:Docker stop 发送的是 SIGTERM 信号,docker kill 发送的是 SIGKILL 信号

终端1进行日志跟踪

在这里插入图片描述终端2使用docker kill 终止mywebsite1

docker kill mywebsite1

在这里插入图片描述

可以对比一下docker stop,还对打印一些信息,而docker kill 什么都不会打印

docker top
查看容器中运行的进程信息,支持 ps 命令参数

docker top CONTAINER [ps OPTIONS]

别名

docker container top

注意事项:容器运行时不一定有/bin/bash 终端来交互执行 top 命令,而且容器还不一定有top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程

查看容器mywebsite1进程的信息

docker top mywebsite1

在这里插入图片描述
还可以添加 aux选项,显示CPU,内存等信息

docker top mywebsite1 aux

在这里插入图片描述

docker stats
显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等

docker stats [OPTIONS] [CONTAINER...]

别名

docker container stats

关键参数
- -all , -a :显示所有的容器,包括未运行的
- -format :指定返回值的模板文件。如 table,json
- -no-stream :展示当前状态就直接退出了,不再实时更新
- -no-trunc :不截断输出

返回报文
CONTAINER ID 与 NAME: 容器 ID 与名称
CPU % 与 MEM %: 容器使用的 CPU 和内存的百分比
MEM USAGE / LIMIT: 容器正在使用的总内存,以及允许使用的内存总量
NET I/O: 容器通过其网络接口发送和接收的数据量
BLOCK I/O: 容器从主机上的块设备读取和写入的数据量
PIDs: 容器创建的进程或线程数

列出所有在运行的容器信息

docker stats

在这里插入图片描述

列出所有在运行的容器信息,json 格式显示

docker stats --format json

在这里插入图片描述

因为是实时刷新的,屏幕会一直闪,我这里就截了一张图,看不出来是实时刷新

使用 --no-stream,展示当前状态的快照

docker stats --no-stream

docker container inspect
查看容器详细信息

docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

关键参数
-f :指定返回值的模板文件。如 table、json
-s :显示总的文件大小

查看容器mywebsite1的信息

docker container inspect

在这里插入图片描述
这里的容器信息还有很多,我只截了一部分

注意事项:docker inspect 会自动检查是镜像还是容器然后显示相信信息

在这里插入图片描述

显示对应的大小

docker inspect -s mywebsite1

在这里插入图片描述

docker port
用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口

docker port CONTAINER [PRIVATE_PORT[/PROTO]]	

别名

docker container port

查看容器website1的端口映射

docker port mywebsite1

在这里插入图片描述

查看容器website1是否有81端口的映射

docker port mywebsite1 81

结果并没有81端口的映射

在这里插入图片描述

docker cp
在容器和宿主机之间拷贝文件
容器和宿主机之间发生了Mount隔离(文件隔离),如果想把文件进行相互之间的拷贝,需要通过docker engine这个桥梁

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

别名

docker container cp

将容器mywebsite1里面的html文件拷贝宿主机的/data/fl下

docker cp mywebsite1:/usr/share/nginx/html/index.html ./

在这里插入图片描述

将index.html文件修改一下,再拷贝到容器website1中

docker cp ./index.html mywebsite1:/usr/share/nginx/html/index.html

在这里插入图片描述

进入容器内部,查看是否拷贝成功

在这里插入图片描述

docker diff
检查容器里文件结构的更改

docker diff CONTAINER

检查容器mywebsite1的文件结构

docker diff mywebsite1

在这里插入图片描述

在容器内加一个文件

在这里插入图片描述

再次查看容器mywebsite1的文件结构

在这里插入图片描述

docker commit
从容器创建一个新的镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

参数
-a :提交的镜像作者
-c :使用 Dockerfile 指令来创建镜像;可以修改启动指令
-m :提交时的说明文字
-p :在 commit 时,将容器暂停

将容器mywebsite1创建一个名为mywebsite1:1.0

docker commit mywebsite1 mywebsite1:1.0

在这里插入图片描述

创建镜像时,自定义镜像的信息

docker commit -a 'fl' -m 'create by fl' -p mywebsite1 mywebsite1:2.0

在这里插入图片描述

查看mywebsite1:2.0的详细信息中是否有我们自定义的信息

docker inspect mywebsite1:2.0 | grep 'fl'

在这里插入图片描述

使用参数-c来修改启动指令

docker commit -c 'CMD ["tail","-f","/etc/hosts"]' -p mywebsite1 mywebsite1:3.0

在这里插入图片描述

查看mywebsite:3.0的启动信息

docker inspect mywebsite:3.0

启动mywebsite1:3.0,对比mywebsite1的启动信息

在这里插入图片描述

docker pause
暂停容器中所有的进程

docker pause CONTAINER [CONTAINER...]

别名

docker container pause

docker unpause
恢复容器中所有的进程

docker unpause CONTAINER [CONTAINER...]

别名

docker container unpause

docker rm
删除停止的容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

别名

docker container rm

关键参数
-f :通过 SIGKILL 信号强制删除一个运行中的容器

删除 mywebsite1 容器

docker stop mywebsite1 
docker rm mywebsite1 

在这里插入图片描述

删除所有停止的容器,配合shell脚本使用

docker rm $(docker ps -aq)

docker export
导出容器内容为 tar 文件(相当于是容器转为镜像)

docker export [OPTIONS] CONTAINER

别名

docker container export

关键参数
-o:写入到文件

将mywebsite1导入到指定目录下

在这里插入图片描述

镜像命令:docker import
从归档文件中创建镜像
docker import和docker export是相互配合使用的

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

别名

docker image import

关键参数
-c:应用 docker 指令创建镜像
-m:提交时的说明文字

将刚刚的tar文件转换为镜像

docker import mywebsite1.tar mywebsite1:5.0

在这里插入图片描述

docker save 和 docker load 也能完成镜像迁移,它们与docker export 和 docker import 有什么区别呢?
首先查看nginx:1.21.3的信息,因为mywebsite1就是由它来的

在这里插入图片描述

再看一下导出的mywebsite1:5.0的信息

在这里插入图片描述

可以发现Env、Cmd等信息都已经丢了,因此使用docker export 和 docker import会丢失源数据信息,而docker save 和 docker load会携带源数据信息。

在进行镜像迁移时,往往使用docker save 和 docker load

使用参数-c指定启动信息,-m指定描述镜像信息

docker import -c 'CMD ["nginx","-g","deamon off;"]' -m "create by fl" mywebsite1.tar mywebsite1:6.0

查看mywebsite1:6.0的详细信息

在这里插入图片描述在这里插入代码片

docker wait
阻塞运行直到容器停止,然后打印出它的退出代码

docker wait CONTAINER [CONTAINER...]

别名

docker container wait

等待mywebsite1容器停止,并打印它的退出码

在这里插入图片描述

因为mywebsite1还在运行,所以当前的终端hang住了

用另一个终端将mywebsite1杀死

在这里插入图片描述

docker rename
重命名容器

docker rename CONTAINER NEW_NAME

别名

docker container rename

将mywebsite1改为mywebsite2

docker rename mywebsite1 mywebsite2

在这里插入图片描述

docker container prune
删除所有停止的容器

docker container prune [OPTIONS]

关键参数
-f, - -force:不提示是否进行确认

删除当前停止的容器

docker container prune

在这里插入图片描述

docker update
更新容器配置

docker update [OPTIONS] CONTAINER [CONTAINER...]

别名

docker container update

关键参数
- -cpus:cpu 数量
- -cpuset-cpus :使用哪些 cpu
- -memory :内存限制
- -memory-swap:交换内存
- -cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
- -cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容器

查看mywebsite1使用的资源

docker stats mywebsite1

在这里插入图片描述

将mywebsite1的内存限制改为300m,交换内存不设限制

docker update -m 300m --memory-swap -1 mywebsite1

在这里插入图片描述

4、容器操作案例

4.1 容器批量处理技巧

命令解释
docker container ls -qf name=xxx根据名称过滤得到容器编号
docker container ls --filter status=running根据状态过滤容器信息
docker container ls -aq静默获取全部容器 id
docker container ls --filter ancestor=xxx过滤镜像名为 xxx 的容器信息
docker container ls --filter ancestor=xxx过滤镜像 id 为 xxx 的容器信息

-a:表示打印所有的容器信息, 包括正在运行和已经退出的
-q: 表示只返回容器 ID
-f: 表示基于给的条件过滤 等价于 --filter 选项

docker container ls 可以简写为docker ps

批量删除容器

docker rm $(docker ps -aq)

按照状态过滤删除已经退出的容器

docker rm $(docker ps -q -f status=exited)

4.2 容器交互模式

attached 模式

# 通过 nginx 镜像创建一个容器, 映射 80 端口
docker run -p 80:80 nginx:1.23.3

通过上述方式创建容器,就是 attached 模式,这样容器会在前台运行

访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器的日志会实时的展现到窗口并且占用此端口

在这里插入图片描述

在这里插入图片描述

如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作,所以我们需要一个更好的,更稳定的模式,对应的是 detached 模式

在这里插入图片描述

attached 模式仅适用于容器和程序的调试阶段

detached 模式

在 docker container run -p 80:80 nginx 命令基础上加一个-d 或者–detach选项表示 detached 模式, 即在后台执行

在后台运行,启动后只显示容器 ID,并且可以输入任何命令

就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作

比起 attached 模式更建议使用

interactive 模式

当我们创建好一个容器之后, 可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。例如创建一个 centos 容器之后,需要到系统里输入各种Shell 命令和系统进行交互就需要进入交互式模式才可以完成

创建运行容器并进入到交互模式

docker run -it nginx:1.21.3 bash

进入到容器的交互 shell 中,可以在该 shell 下执行对应的命令

在这里插入图片描述
-i:保持容器运行。通常与 -t 同时使用,加入 it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用

创建运行容器并进入到交互模式,然后输入exit退出后,容器也会停止

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

在后台创建运行 nginx 容器

docker container run -d -p 82:80 nginx:1.21.3

进入该容器的交互模式

docker container exec -it 123e8b72463f bash

在这里插入图片描述

针对一个已经运行的容器里进入到交互模式,然后输入exit退出后,容器不会退出

4.3 容器自动重启

容器重启选项如下:

  • docker run --restart=no [容器名] :默认值不自动重启
  • docker run --restart=on-failure:3 [容器名] : on-failure 若容器的退出状态非 0,则docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃
  • docker run --restart=always [容器名] :always 容器退出时总是重启
  • docker run --restart=unless-stopped [容器名] unless-stopped 容器退出时总是重启,但不考虑 Docker 守护进程启动时就已经停止的容器

如果容器启动时没有设置 --restart 参数,则通过下面命令进行更新:
docker update --restart=always [容器名]

交互式启动nginx容器,在容器退出时总是重启

docker run -it --name mynginx721 -p 80:80 --restart=always nginx:1.21.3 bash

在这里插入图片描述
nginx确实被重启了

如果使用了docker stop, --restart=always是不会生效的,也就是不会重启

在这里插入图片描述

4.4 容器环境变量配置

启动一个 nginx 容器,配置环境变量,TEST=1

在这里插入图片描述

启动一个nginx容器,使用 --env-file 参数手动指定环境变量的配置文件

在这里插入图片描述

5、综合实战

5.1 Mysql 容器化安装

docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=fl@mysql -p 6379:3306 mysql:5.7

如果本地没有mysql:5.7,那么会自动从docker hub上拉取下来

在这里插入图片描述

进入mysql内部,并登录

docker exec -it mysql bash

在这里插入图片描述

做一些基本检测,创建数据库,创建表,插入数据

在这里插入图片描述

通过一个可视化工具进行连接,注意我这里宿主机端口是6379

在这里插入图片描述

5.2 Redis 容器化安装

拉取镜像并启动容器

docker run --name redis -d -p 6379:6379 redis:7

在这里插入图片描述

进入容器,进行简单的测试

docker exec -it redis bash 

在这里插入图片描述

5.3 C++容器制作

拉取centos:7

docker pull centos:7

启动容器并进入

docker run -it --name mycpp centos:7 bash

因为默认Yum源为centos的官方地址,所以在国内使用很慢甚至无法访问,因此需要在容器内部配置yum源信息

sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=http://mirrors.tuna.tsinghua.edu.cn/centos|g' \
    -i.bak \
    /etc/yum.repos.d/CentOS-*.repo

更新缓存

yum makecache

查看gcc是否安装,如果没有就安装

在这里插入图片描述

安装成功后,写一个简单的c语言代码,并用gcc编译,运行

在这里插入图片描述

6、常见问题

docker create、docker start 和 docker run 有什么区别?

docker create 命令从 Docker 映像创建一个全新的容器。但是,它不会立即运行它。

docker start 命令将启动任何已停止的容器。如果使用 docker create 命令创建容器,则可以使用此命令启动它。

docker run 命令是创建和启动的组合,因为它创建了一个新容器并立即启动它。实际上,如果 docker run 命令在您的系统上找不到上述映像,它可以从 Docker Hub 中提取映像。

docker import 和 docker load 有什么区别?

想要了解 docker load 与 docker import 命令的区别,还必须知道 docker save与 docker export 命令:

  • docker save images_name:将一个镜像导出为文件,再使用 docker load 命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比 docker export 命令导出的文件大,很好理解,因为会保存镜像的所有历史记录
  • docker export container_id:将一个容器导出为文件,再使用 docker import 命令将容器导入成为一个新的镜像,但是相比 docker save 命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照

既可以使用 docker load 命令来导入镜像库存储文件到本地镜像库,也可以使用docker import 命令来导入一个容器快照到本地镜像库。

两者的区别在于容器快照将会丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,体积也会更大。

docker rm & docker rmi & docker prune 的差异?

docker rm:删除一个或多个容器
docker rmi:删除一个或多个镜像
docker prune:用来删除不再使用的 docker 对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

clang插件对llvm源码插桩,分析函数调用日志(2)

tick_plot__compile.ipynb clang插件对llvm源码插桩&#xff0c;分析函数调用日志(1) 分析 进出、链、出 df进出df[ df[tickKind].isin( [FuncEnter,FuncReturn] ) ]#代码中&#xff0c;只有在函数进入时&#xff0c;计算了链条长度 并写磁盘 df入df[ df[tickKind].isin…

基于React使用swiperjs实现竖向滚动自动轮播

很多文章&#xff0c;都只提供了js部分&#xff0c;包括官方的文档也只有js部分&#xff0c;如果css设置不正确&#xff0c;会导致轮播图不自动播放。 使用的swiper版本&#xff1a;v11.0.3 文档 https://swiperjs.com/get-startedhttps://swiperjs.com/react 实现效果 使…

Go和JavaScript结合使用:抓取网页中的图像链接

前言 在当今数字化时代&#xff0c;数据是金钱的源泉&#xff0c;对于许多项目和应用程序来说&#xff0c;获取并利用互联网上的数据是至关重要的。其中之一的需求场景是从网页中抓取图片链接&#xff0c;这在各种项目中都有广泛应用&#xff0c;特别是在动漫类图片收集项目中…

C# OpenCvSharp 去除文字中的线条

效果 中间过程效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent…

JavaScript学习笔记——对象

JavaScript 中的所有事物都是对象&#xff1a;字符串、数值、数组、函数...除此之外JavaScript 允许自定义对象。 一、所有事物都是对象 JavaScript 提供多个内建对象&#xff0c;比如 String、Date、Array 等等。 对象只是带有属性和方法的特殊数据类型。 1.布尔型可以是一个…

FHE Circuit Privacy

参考文献&#xff1a; [MP12] Micciancio D, Peikert C. Trapdoors for lattices: Simpler, tighter, faster, smaller[C]//Annual International Conference on the Theory and Applications of Cryptographic Techniques. Berlin, Heidelberg: Springer Berlin Heidelberg, …

视频转码教程:轻松制作GIF动态图,一键高效剪辑操作

随着社交媒体的兴起&#xff0c;GIF动态图已经成为了人们表达情感、分享精彩瞬间的重要方式。而将视频转化为GIF动态图&#xff0c;不仅可以方便地在社交媒体上分享&#xff0c;还可以延长视频的播放时长&#xff0c;吸引更多的观众。本篇文章将为大家介绍如何将视频轻松转化为…

使用 Ruby 的 Nokogiri 库来解析

爬虫程序的主要目标是获取指定网站上的数据。在这里&#xff0c;我们将使用 Ruby 的 Nokogiri 库来解析 HTML&#xff0c;并使用 HTTParty 库来发送 HTTP 请求。下面是一个简单的示例&#xff0c;演示如何使用 Ruby 编写一个爬虫程序来爬取 1688 网站的数据。 require nokogir…

计网----累积应答,TCP的流量控制--滑动窗口,粘包问题,心跳机制,Nagle算法,拥塞控制,TCP协议总结,UDP和TCP对比,中介者模式

计网----累积应答&#xff0c;TCP的流量控制–滑动窗口&#xff0c;粘包问题&#xff0c;心跳机制&#xff0c;Nagle算法&#xff0c;拥塞控制&#xff0c;TCP协议总结&#xff0c;UDP和TCP对比&#xff0c;中介者模式 一.累积应答 1.什么是累计应答 每次发一些包&#xff0…

【小尘送书-第十一期】《算法秘籍》:算法是编程的基石,开发的核心

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

【RocketMQ】深入剖析延迟消息核心实现原理

一、背景 电商相关业务的时候&#xff0c;有一个常见的需求场景是&#xff1a;用户下单之后&#xff0c;超过半小时不支付&#xff0c;就取消订单。现在我们在淘宝京东买东西&#xff0c;或者通过美团点外卖&#xff0c;下单之后&#xff0c;如果不在指定时间内支付&#xff0…

个人实用的街头防身自卫术,男女必学的防身实战技能

一、教程描述 本套教程&#xff0c;大小455.93M&#xff0c;共有17个文件。 二、教程目录 实战防身术01、街头防身自卫术示例.mp4 实战防身术02、街头防身自卫术序言.mp4 实战防身术03、腕部被抓解脱.mp4 实战防身术04、胸襟被抓解脱.mp4 实战防身术05、腰部被抓解脱.mp…

应用在全固态激光雷达中的ALS环境光传感芯片

全固态扫描式激光雷达系统这一创新性技术在多个领域都有着巨大的潜力&#xff0c;将改变未来科技格局。本文将探讨这一革命性的发明&#xff0c;以及它在自动驾驶、无人机、工业自动化、环境监测等领域的关键应用。 传统激光雷达系统通常使用复杂的机械装置&#xff0c;这些部…

如何上传自己的Jar到Maven中央仓库

在项目开发过程中&#xff0c;我们常常会使用 Maven 从仓库拉取开源的第三方 Jar 包。本文将带领大家将自己写好的代码或开源项目发布到 Maven中央仓库中&#xff0c;让其他人可以直接依赖你的 Jar 包&#xff0c;而不需要先下载你的代码后 install 到本地。 注册帐号 点击以…

基于Pymavlink协议的BlueROV开发

1 BlueROV概述 1.1 什么是ROV 维基百科遥控潜水器&#xff08;Remotely operated underwater vehicle&#xff0c;缩写ROV&#xff09;是一个无人的水下航行器&#xff0c;以电缆连接到母船的人员操作。常搭载水下光源和照相机、摄影机、机械手臂、声纳等。因为具有机械手臂&a…

华为OD机试 - 找朋友(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述大白话解释一下就是&#xff1a;1、输入&#xff1a;2、输出&#xff1a;3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专…

安装node-sass安装失败(Failed at the node-sass@4.14.1 postinstall script.)

npm i安装依赖&#xff0c;安装node-sass失败 全局设置淘宝镜像&#xff0c;还是下载不下来。下载不下来可能是因为默认从github上去下载node-sass&#xff0c;而国内经常连不上或者网络不好。可以单独下载 npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/…

Maven多环境下 active: @profileActive@报错问题解决

1.报错&#xff1a; Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character that cannot start any token.(Do not use for indentation) 2.解决办法&#xff1a; 在主pom的文件下&#xff0c;重新加载&#xff1a;

模型可解释性

模型可解释性 前言导读Background1、为什么需要可解释性&#xff1f;2、诞生背景3、研究现状4、常见的模型可解释性方法4.1 基于模型自身的可解释性1&#xff09;Explanation Generation2&#xff09;Prototype Network 4.2 基于结果的可解释性 5、应用前景6、面临挑战 前言导读…

基于ssm的校园快递物流管理系统(java+jsp+ssm+javabean+mysql+tomcat)

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;9.9拿走&#xff01; 基于javawebmysql的ssm校园快递物流管理系统(javajspssmjavabeanmysqltomcat) 运行环境&#xff1a; Java≥8、MySQL≥5.7、Tomcat≥8 开发工具&#xff1a; eclipse/idea/myeclipse/s…