【Docker】Docker镜像和Docker容器

文章目录

  • Docker镜像
    • 镜像基本概念
    • 为什么需要镜像?
      • Union FS(联合文件挂载)
      • docker镜像原理
  • Docker镜像命令
      • docker rmi
      • docker save
      • docker load
      • docker history
      • docker image prune
  • docker镜像实战
    • 离线迁移镜像
    • 镜像存储的压缩与共享
  • Docker容器
    • 容器基本概念
    • docker容器命令
      • 命令清单
      • docker create
      • docker log
      • docker attach
      • docker exec
      • docker start
      • docker stop
      • docker restart
      • docker kill
      • docker top
      • docker stats
      • docker container inspect
      • docker port
      • docker cp
      • docker diff
      • docker commit
      • docker pause
      • docker unpause
      • docker rm
      • docker export
      • docker import
      • docker wait
      • docker rename
      • docker container prune
      • docker update
    • 容器基本操作
      • 容器批量处理技巧
      • 容器交互模式
      • MySQL容器化安装
      • Redis容器化安装
      • C++容器的制作
      • 容器常见问题
        • docker create、 docker start 和 docker run 有什么区别?
        • docker import 和 docker load 有什么区别?
        • docker rm & docker rmi & docker prune 的差异?

Docker镜像

镜像基本概念

Docker镜像是什么?

​ Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。

​ 可以把Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。

​ image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。 每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。

镜像就像C++中的类和模板一样,可以很方便的构建出来不同的对象

image-20230709230206830

为什么需要镜像?

​ 在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。

​ docker 最大的贡献就是定义了容器镜像的分层的存储格式, docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
​ docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。

Union FS(联合文件挂载)

​ **联合挂载是一种文件系统,它是在不修改其原始(物理)源的情况下创建将多个目录的内容合并为一个逻辑目录。**更有创意的用法是:能将相关的文件集存储在不同的磁盘或媒体中,但我们在单个视图中显示它们。总之,将多个、种类不同的数据源整合成一个逻辑数据源是有意义的。

​ 一个例子是来自远程 NFS 服务器的一堆用户的 /home 目录全部合并到一个目录中,另一个例子是:将拆分的 ISO 映像合并到一个完整的目录中。

​ 而对于Docker这种分层结构,需要将每一层的文件展示到用户观察的一个平面上,换句话就是要用户感觉不出分层的存在。

image-20230709232153633

Union FS是怎么样工作的?

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像。可以制作各种具体的应用镜像。

分层的优点:

  • 分层最大的一个优点是共享资源;
  • 多个镜像都由相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像即可;
  • 内存中也只需要加载一份base镜像,就可以为所有容器服务,而且镜像的每一层都可以被共享。

浏览Docker hub时,能发现大多数镜像都不是从头开始制作,而是从一些base镜像基础上创建,比如centos基础镜像,而新镜像就是从基础镜像上一层层叠加新的逻辑构成的。这种分层设计,一个优点就是资源共享。

比如我们在服务器上运行了100台centos镜像容器,每一份容器都保存一份基础debian源文件?

显然不是,借助Linux的UnionFS,宿主机只需要在磁盘上保存一份base镜像,内存中也只需要加载一份,就能被基于这个镜像的所有容器共享。

当某个容器修改了基础镜像的内容,比如 /bin文件夹下的文件,这时其他容器的/bin文件夹是否会发生变化呢?

根据容器镜像的 写时拷贝(Copy-on-Write) 技术,某个容器对基础镜像的修改会被限制在单个容器内。

docker镜像原理

image-20230709233415258

image-20230709233438659

  • docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统为UnionFS

  • bootfs(boot file system) 主要包含bootloader 和 kernel,bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此使内存的使用权已由bootfs转交给内核,此使系统也会卸载bootfs。

  • rootfs(root file system) ,在bootfs之上。包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,CentOS等等。

  • 将中间只读的 rootfs 的集合称为 Docker 镜像,Docker 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。UnionFS 使得镜像的复用、定制变得更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
    image-20230709235435606

  • 当用docker run启动这个容器时,实际上在镜像的顶部添加了一个新的可写层,这个可写层也叫容器层

image-20230709235514543

  • 容器启动后,其内的应用所有对容器的改动,文件的增删改操作都只会发生在容器层中,对容器层下面的所有只读镜像层没有影响。

Docker镜像命令

命令别名功能
docker imagesdocker image ls/docker image list列出本地镜像
docker tagdocker image tag给镜像打标签, 可用于推送镜像仓库
docker pulldocker image pull从镜像仓库拉取 镜像
docker pushdocker image push推送镜像到仓库
docker rmidocker image rm/ docker image remove删除本地镜像
docker builddocker image build通过 dockerfile 制作镜像
docker savedocker image save将指定镜像保存 成 tar 归档文件
docker loaddocker image load导入使用 docker save 命 令导出的镜像
docker image inspect查看镜像详细信 息必须掌握
docker historydocker image history查看镜像历史
docker importdocker image import从归档文件 docker export 中创建镜像。
docker image prune删除不使用的镜

docker rmi

功能:删除镜像。

语法:

docker rmi [OPTIONS] IMAGE [IMAGE...]# 别名
docker image rm, docker image remove

关键参数:

  • f :强制删除;
  • –no-prune :不移除该镜像的过程镜像,默认移除;

image-20230710000320235

注意:删除镜像时,如果该镜像对应有容器还在运行,那么需要先关闭容器删除容器,最后再删除镜像

docker save

功能:将指定镜像保存成 tar 归档文件。

语法:

docker save [OPTIONS] IMAGE [IMAGE...]# 别名
docker image save

关键参数:

  • -o:输出到的文件

案例:

docker save -o nginx.tar nginx:1.23.3# 也可以一次加载多个文件
docker save -o busybox.tar busybox:latest registry.cn-hangzhou.aliyuncs.com/westmo/req1:v0.3

image-20230710001242519

docker load

功能:导入使用 docker save 命令导出的镜像。

语法:

docker load [OPTIONS]# 别名
docker image load

关键参数:

  • –input , -i : 指定导入的文件,代替 STDIN。
  • –quiet , -q : 精简输出信息。

image-20230710002148965

docker history

功能:显示镜像历史。

docker镜像是通过Union FS文件系统一层一层叠加的,使用docker history命令就可以查看镜像的组成信息。

语法 :

docker history [OPTIONS] IMAGE# 别名
docker image history

关键参数:

  • -H , --human :大小和日期采用人容易读的格式展现
  • –no-trunc :显示全部信息,不要隔断;
  • -q, --quiet: 只显示镜像 id 信息;

image-20230710003526933

具体每条命令的意义,将在dockerfile部分进行解析。

docker image prune

功能:删除不使用的镜像。

语法:

docker image prune [OPTIONS]

关键参数:

  • -a , --all : 删除全部不使用的镜像;
  • –filter filter:指定过滤条件;
  • -f, --force :不提示是否删除;

docker镜像实战

离线迁移镜像

第一步:服务器 1 上镜像保存为 tar 文件。

docker save -o busybox.tar busybox

第二步:scp 或者只用使用可视化工具拷贝镜像到第二台服务器上 。

scp命令

scp命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令。使用 SSH 意味着它享有与 SSH 相同级别的数据加密,因此被认为是跨两个远程主机传输文件的安全方式。

Linux SCP 命令是一种在两个远程节点之间传输文件的便捷且安全的方式,而无需担心攻击者窥探你的数据。

语法:

scp [option] /path/to/source/file user@server-ip:/path/to/destination/directory

/path/to/source/file – 这是打算复制到远程主机的源文件。

user@server-IP: – 这是远程系统的用户名和 IP 地址。请注意 IP 地址后面加冒号。

/path/to/destination/directory – 这是文件将复制到的远程系统上的目标目录。

以下是scp命令常用的几个选项:

  • -C - 这会在复制过程中压缩文件或目录。
  • -P - 如果默认 SSH 端口不是 22,则使用此选项指定 SSH 端口。
  • -r - 此选项递归复制目录及其内容。
  • -p - 保留文件的访问和修改时间。

第三步:在第二台服务器上恢复并运行

docker load -i busybox.tar
docker run -it --rm busybox:1.36.0 sh 

镜像存储的压缩与共享

docker镜像在远程存放时会压缩,在拉取到本地时会解压。

image-20230710014032875

可以看到在docker hub上,nginx:1.21.1的大小为51.26m大小。下面我们把它拉取到本地。

docker pull nginx:1.21.1

image-20230710014313210

拉取到本地,docker的大小为133m。说明远端存储发生了压缩,因为仓库到本地需要走网络,所以文件越小越好 。

把一个镜像打多个 tag,然后同时推送仓库,可以看到是说层已经存在,不会重复存储:

docker tag nginx:1.21.1 registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.1
docker tag nginx:1.21.1 registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.2
docker tag nginx:1.21.1 registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.3docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.1 
docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.2
docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.3

image-20230710015142994

当layer层已经存在时,docker服务器只会保留一份。

添加一个仓库中已经有的镜像,服务器会提示已经存在镜像,或者直接mount(挂载)一个镜像,而不是推送上去。

image-20230710015443319

我们再推送一个nginxv0.2的镜像上去:

docker push registry.cn-hangzhou.aliyuncs.com/westmo/req1:nginxv0.2c23548ea0b99: Mounted from library/nginx
82068c842707: Mounted from library/nginx
c2adabaecedb: Mounted from library/nginx
1.16.1: digest:
sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e92
54e4b size: 948

服务器提示镜像是直接挂载过去,而不是推送上去的。

Docker容器

容器基本概念

什么是容器?

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

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

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

image-20230711004634936

容器的生命周期:

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

  1. created:初建状态
  2. running:运行状态
  3. stopped:停止状态
  4. paused: 暂停状态
  5. deleted:删除状态

容器命令导致生命周期的转化:

image-20230711005115136

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: 非计划终止这时Linux会选择需要杀死最吃内存的容器,从而拯救尽可能多的容器

container process exitde(异常终止):出现容器被终止后,将进入 Should restart?选
择操作:
• yes 需要重启,容器执行 start 命令,转为运行状态。
• no 不需要重启,容器转为停止状态。

OOM

OOM也就Out of memory,内存不足。

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 来设定上限,因而此时此容器将会尽可能多地使用主机内存资源。换言之,主机内存有多大,它就将用多大。

容器的异常退出

每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。 运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。

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 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 create --name website1 -p 80:80 nginx:1.23.3

image-20230712231326701

可以看到容器只是被创建出来,并没有运行。下面我们运行该容器:

docker start website1

image-20230712231727164

80号端口已经被使用,无法启动容器,再次证明了docker create只是创建并没有运行容器。

docker log

功能:查看容器日志

语法:

docker logs [OPTIONS] CONTAINER# 别名
docker containers logs

关键参数:

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

docker attach

功能:连接到正在运行的容器。

语法:

docker attach [OPTIONS] CONTAINER# 别名
docker container attach

关键参数:

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

案例:

我们后台运行一个nginx容器,接下来连接到该容器中。

docker run --name=mywebsite2 -d -p 8080:80 nginx:1.23.3
docer attach mywebsite2

image-20230712234737026

attach后,我们接管了mywebsite的日志和通信管道。如果我们按下ctrl+c关闭该容器:

image-20230712234926063

日志显示接收到了2号信号,容器退出。说明默认情况下,代理信号会影响到容器的运行。下面我们设置不代理信号,再ctrl+c退出:

docker start mywebsite2
docker attach mywebsite2 --sig-proxy=falsectrl+c

image-20230712235418257

容器不设置信号代理,信号就不会影响到容器的运行。

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 mywebsite2 bash

image-20230713001715144

docker start

功能:启动停止的容器
语法 :

docker start [OPTIONS] CONTAINER [CONTAINER...]# 别名
docker container start

docker stop

功能:停止运行的容器

语法:

docker stop [OPTIONS] CONTAINER [CONTAINER...]# 别名
docker container stop

关键参数:

  • -s:发送的信号

docker restart

功能:重启容器

语法:

docker restart [OPTIONS] CONTAINER [CONTAINER...]# 别名
docker container restart

关键参数:

  • -s:发送的信号

docker kill

功能:强制退出容器

语法:

docker kill [OPTIONS] CONTAINER [CONTAINER...]# 别名
docker container kill

关键参数:

  • -s:发送的信号

注意事项:

docker stop发送的是 SIGTERM 信号, docker kill 发送的是 SIGKILL 信号

docker top

功能:查看容器中运行的进程信息,支持 ps 命令参数。

语法:

docker top CONTAINER [ps OPTIONS]# 别名
docker container top

注意事项:

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

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 start mywebsite2
docker stats mywebsite2

image-20230713004154092

docker container inspect

功能:查看容器详细信息

语法:

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

关键参数:

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

注意事项:

  • docker inspect 会自动检查是镜像还是容器然后显示相信信息
docker container inspect -f json mywebsite2

image-20230713005427912

docker port

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

语法:

docker port CONTAINER [PRIVATE_PORT[/PROTO]]# 语法
docker container port

案例

docker port mywebsite2

image-20230713005700254

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/

docker diff

功能:检查容器里文件结构的更改。

语法:

docker diff CONTAINER

image-20230713010145470

docker commit

功能:从容器创建一个新的镜像。

最关键的功能是:可以通过该命令实现自定义镜像的创建。

语法:

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

参数:

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

案例:制作自定义镜像

首先先运行起一个容器实例

docker run --name=mywebsiteforcommit -d -p 8081:80 nginx:1.23.3
docker ps

image-20230713010743366

查看是否有docker images 镜像

docer images | grep mywebsiteforcommit

image-20230713010954058

制作一个简单镜像

docker commit mywebsiteforcommit mywebsite:v1.0
docker images mywebsite

image-20230713011554911

可以看到镜像制作成功。

接下来我们向镜像中加一些文件:

docker exec -it mywebsiteforcommit bash
echo "hello world by west" > mywebhello.txtexit

image-20230713011808128

制作带有文件的镜像,并查看文件

docker commit mywebsiteforcommit mywebsite:v2.0
docker imagesdocker run -it --name mywebsite2.0 mywebsite:v2.0 bash
cat mywebhello.txt

image-20230713012331562

可以读取到mywebhello.txt文件的内容,说明成功制作了加有文件的镜像。

制作镜像:修改nginx的启动命令 -c

首先查看原来nginx的启动命令

docker image inspect nginx:1.21.1

image-20230713013849762

将启动命令CMD修改为:tail -f /etc/hosts

docker commit -c 'CMD ["tail","-f","etc/hosts"]' -p mywebsiteforcommit mywebsite:v3.0

查看镜像的启动命令

docker inspect mywebsite:v3.0

image-20230713014601336

可以看到nginx镜像mywebsite:v3.0的启动命令被修改。

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 信号强制删除一个运行中的容器。

案例

#删除 mynginx 容器
docker stop mynginx
docker rm mynginx#删除所有停止的容器
docker rm $(docker ps -a -q)

docker export

功能:导出容器内容为 tar 文件

语法:

docker export [OPTIONS] CONTAINER# 别名
docker container export

关键参数:

  • -o: 写入到文件。

案例

docker ps -a
docker export -o mywebsite2.0.tar mywebsite2.0ls

image-20230714003206255

成功将mywebsite2.0导出成为一个tar文件。

docker import

功能:从归档文件中创建镜像。
语法 :

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]# 别名
docker image import

关键参数:

  • -c :应用 docker 指令创建镜像;
  • -m :提交时的说明文字

案例:

创建一个镜像

docker import mywebsite2.0.tar mywebsitev4.0docker images

image-20230714004132541

成功创建了一个mywebsitev4.0的镜像。

docker wait

功能:阻塞运行直到容器停止,然后打印出它的退出代码。
语法:

docker wait CONTAINER [CONTAINER...]# 别名
docker container wait

image-20230714005112536

docker rename

功能:重命名容器

语法:

docker rename CONTAINER NEW_NAME# 别名
docker container rename

docker container prune

功能:删除所有停止的容器

语法

docker container prune [OPTIONS]

参数:

  • -f,–force:不提示是否进行确认

docker update

功能:更新容器配置
语法:

docker update [OPTIONS] CONTAINER [CONTAINER...]# 别名
docker container update

关键参数:

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

案例:

docker run my
docker update -m 400m myweb

容器基本操作

容器批量处理技巧

命令解释
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 rm $(docker container ls-aq) # 按照状态过滤删除已经退出的容器
docker container rm $(docker container ls-q --filter status=exited)

容器交互模式

**attached模式(前台运行模式) **

attached模式也叫做前台运行模式;比如我们将nginx映射到前台端口运行;

docker container run -p 80:80 nginx

问题:

  • 如果是在 Linux 服务器上,按 Ctrl+C 就会停止掉 Docker 服务,很容易误操作,所以我们需要一个更好的,更稳定的模式,对应的是 detached 模式。
  • attached模式仅适用于容器和程序的调试阶段。
  • attached模式不能用于生产环境。

**detached模式(后台运行模式) **

detached模式也叫后台运行模式;

特点:

  • 在后台运行,启动后只显示容器 ID,并且可以输入任何命令
  • 就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作
 docker container run -p -d 80:80 nginx 

**interactive模式(交互模式) **

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

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

docker container run -it nginx sh

MySQL容器化安装

登录docker hub查看MySQL常用的镜像;

image-20230717003338653

第一步:下载MySQL镜像

docker pull mysql:5.7

image-20230717002334727

第二步:启动MySQL容器

我们知道 msyql 的默认端口是 3306,而且有密码,查看官网的启动用例 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 指定了 mysql 的密码信息

#启动一个 msyql,并指定密码和端口开放
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 8200:3306 -d mysql:5.7

image-20230717002438018

第三步:与MySQL容器交互,并登陆mysql

docker exec -it mysql:5.7 bashmysql -p

image-20230717002827801

接下来就可以正常使用MySQL;使用docker ps就可以查看MySQL容器对外映射的端口:

docker ps

image-20230717003155218

Redis容器化安装

Redis 全称 Remote Dictionary Server,中文名为远程字典服务器。

Redis 是现在最受欢迎的 NoSQL 数据库之一, Redis 是一个使用 ANSI C 编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value 存储系统
  • 开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、 Key-Value 数据库,并提供多种语言的 API

第一步:拉取镜像

docker pull redis:7.0

第二步:启动容器并进入Redis

docker run --name redis -p 8300:6379 -d redis:7.0
docker exec -it redis bashredis-cli

image-20230717004541296

向Redis中设置Key:向Redis中添加字符串类型的key的命令是set

set key1 west# 获取key1的值
get key1

image-20230717004949032

C++容器的制作

什么是源?

源就是来源。就是你安装软件时,程序从哪里获取软件包(安装程序在你的机器上,但需要安装的
东西却在软件源服务器上)。

源,在 Ubuntu 下,它相当于软件库,需要什么软件,只要记得正确的软件名就可以用命令行安装:其实你可以把他称软件仓库。安装软件时,就是从仓库里面调取数据放在你的机器上。

什么是镜像源?

镜像源就是把官方的源做一个镜像,你可以在这下载软件。比如 ubuntu 官方源在国外,下载软件可能会很慢,这时候就需要换成国内的镜像源 。

中科大源:

https://mirrors.ustc.edu.cn/help/

替换为中科大源,执行下面的shell:

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

以上命令只替换了默认启用的仓库。替换之后请运行 yum makecache 更新缓存。

C++镜像制作

第一步:拉取Ubuntu 镜像 :docker pull

docker pull ubuntu:22.04

第二步:运行Ubuntu容器

docker run --name=ubuntu -it ubuntu:22.04 bash

第三步:替换为中科大源,下载C++编译器GCC

sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list# 跟新缓存
apt update# 下载gcc编译器
apt install gcc vim -y

替换为国内源后,我们就可以很快的下载好编译器:

image-20230717011610287

第四步:编写C++代码并编译

vim docker.c

#include <stdio.h>
int main()
{printf("hello docker!\n");return 0;
}

编译代码:

g++ -o demo docker.c./demo

image-20230717011741890

容器常见问题

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

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

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

docker run 命令是创建并启动的组合。实际上,如果 docker run 命令在系统上找不到上述映像,它可以从 Docker Hub 中提取映像。

docker import 和 docker load 有什么区别?

docker save和docker load是一对命令;docker import和docker export是一对命令。

docker save images_name:将一个镜像导出为文件,再使用 docker load 命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比 docker export 命令导出的文件大,因为会保存镜像的所有历史记录。

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

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

docker rm : 删除一个或多个容器

docker rmi : 删除一个或多个镜像

docker prune: 用来删除不再使用的 docker 对象

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring设计模式及部分技术讲解

讲师:邓澎波 Spring面试专题 1.Spring应该很熟悉吧?来介绍下你的Spring的理解 有些同学可能会抢答,不熟悉!!! 好了,不开玩笑,面对这个问题我们应该怎么来回答呢?我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍Spring是怎么来的,发展中有哪些核心的节…

mysql 2 -- 数据库基本操作、数据表的操作、mysql查询操作

一、数据库基本操作 1、数据库的登录及退出 连接数据库&#xff1a; mysql -u用户名 -h主机地址(省略代表本机) -p 密码&#xff08;格式为123...&#xff09;;注&#xff1a; 刚下载安装的时候需要通过管理员进入 退出数据库,以下三种方式都可以&#xff1a; exit quit …

大数据学习02-Hadoop分布式集群部署

操作系统&#xff1a;centos7 软件环境&#xff1a;jdk8、hadoop-2.8.5 一、创建虚拟机 1.下载VMware,建议支持正版 2.安装到Widows目录下任意位置即可&#xff0c;安装目录自定义。打开VMware&#xff0c;界面如下&#xff1a; 3.创建虚拟机 创建虚拟机—>选择自定义 …

android 下载源码 一路踩坑

python 从 2.0 升级到3.0 从官网下载 pyhon3.0 安装器,然后更改配置 # Setting PATH for Python 3.8# The original version is saved in .bash_profile.pysaveexport PATH"/Library/Frameworks/Python.framework/Versions/3.11/bin:$PATH"alias python"/Libr…

SpringCloud(四)Hystrix服务降级、熔断、监控页面

一、服务熔断 官方文档&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.5.RELEASE/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients 我们知道&#xff0c;微服务之间是可以进行相互调用的&#xff0c;那么如果出现了…

如何创建 Spring Boot 项目

目录 一、Spring Boot 项目的创建 1. 安装 Spring Boot Helper 插件 2. 创建 Spring Boot 项目 3. 项目目录详解 4. 运行 Spring Boot 项目 二、Spring Boot 的优点 前言 Spring Boot 的意思就是 Spring Boot 脚手架的意思&#xff0c;已经总结完成 Spring 的学习&#x…

js计算数组中每个元素出现的次数

tip&#xff1a;空值合并运算符&#xff08;??&#xff09;是一个逻辑运算符&#xff0c;当左侧的操作数为 null 或者 undefined 时&#xff0c;返回其右侧操作数&#xff0c;否则返回左侧操作数。reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0…

华为鲲鹏920 aarch64 版本 Ambari HDP 下载地址

声明&#xff1a;为有效缓解各位同行兄弟们的痛&#xff0c;特推出此文 本文能够适配兼容 华为鲲鹏920 aarch64 版本&#xff0c;仅限 CentOS7、openEuler20.03-LTS 操作系统 以下是详细下载地址 1、CentOS7 aarch64版本 CentOS7 aarch64 https://mirrors.huaweicloud.com/…

【HCIA】10.VLAN间通信

VLAN间通信的解决方法 使用路由器的物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access。路由器的一个物理接口作为一个VLAN的网关&#xff0c;因此…

考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

从源码理解Scala中函数reduceRight的计算过程

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 以List集合为例&#xff0c;进行reduceRight()的计算过程分析&#xff0c;总体分为两部分&#xff0c;一部分是看最顶层特质的那个通用的reduceRight方法&#xff0c;另一部分是讲直接混入的特质的…

数据结构顺序表,实现增删改查

一、顺序表结构体定义 #define MAXSIZE 8 //定义常量MAXSIZE&#xff0c;表示数据元素的最大个数为8 typedef int datatype; //重定义int类型&#xff0c;分别后期修改顺序表中存储的数据类型 typedef struct {int len; //顺序表长度datatype data[MAXSIZE…