【Docker】Docker镜像和Docker容器

news2024/11/25 5:21:13

文章目录

  • 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.3

docker 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.2


c23548ea0b99: 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=false

ctrl+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.txt

exit

image-20230713011808128

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

docker commit mywebsiteforcommit mywebsite:v2.0
docker images

docker 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.0

ls

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.0

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

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

redis-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.coloradmin.cn/o/765168.html

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

相关文章

npm link 实现全局运行package.json中的指令

packages.json "name":"testcli","bin": {"itRun": "index.js"},执行命令 npm link如果要解绑定 npm unlink testcli 现在你可以输入 itRun试一下

vue3使用下载附件功能

效果&#xff1a; 点击即可以下载打开。 代码&#xff1a; <div v-show"item.attachment.length > 0"><h3>下载附件</h3><divv-for"(doc, docIndex) in item.attachment":key"docIndex"><astyle"color: #41…

WebSocket集群解决方案,不用MQ

首先不了解WebSocket的可以先看看这篇文章&#xff0c;以及传统的WebSocket方案是怎么做的&#xff0c;https://www.cnblogs.com/jeremylai7/p/16875115.html 这是用MQ解决的版本&#xff0c;那么这种方案存在什么问题呢。 第一&#xff1a;增加MQ&#xff0c;可能造成消息挤压…

动态内存分配(3)——柔性数组

前言&#xff1a; 以前我们所学数组&#xff08;包括变长数组&#xff09;&#xff0c;在数组声明的时候&#xff0c;就必须指定数组的大小&#xff0c;它所需要的内存在编译时分配。但是有时候需要的数组大小在程序运行的时候才能知道&#xff0c;该怎么办呢&#xff1f;这就是…

Zookeeper+kafka的应用及部署

Zookeeperkafka的应用及部署 一、Zookeeper的概念1、Zookeeper 定义2、Zookeeper 工作机制3、Zookeeper 特点4、Zookeeper 数据结构5、Zookeeper 应用场景6、Zookeeper 选举机制&#xff08;1&#xff09;第一次启动选举机制&#xff08;2&#xff09;非第一次启动选举机制(1)、…

【Ajax】笔记-NodeMon 简介、安装、使用

NodeMon 简介、安装、使用 简介安装启动应用测试 简介 nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。以前&#xff0c;我们开发一个node后端服务时&#xff0c;每次更改文件&#xff0c;均需重启一下&#xff0c;服务才能生效。这使我们…

阿里云RocketMQ——高可用、高可靠的分布式消息处理系统

阿里云产品测评-RocketMQ 今天我对阿里的又一产品进行了深度测评&#xff08;RocketMQ&#xff09;&#xff0c;首先如果是新用户的话&#xff0c;可以先关注下面这个免费体验的活动。 一、上手实操 阿里云免费试用 1.付费或者免费开通RocketMQ 云消息队列 RocketMQ 版是阿…

容器云平台监控告警体系(四)—— Golang应用接入Prometheus

1、概述 目前容器云平台中的容器仅支持获取CPU使用率、内存使用率、网络流入速率和网络流出速率这4个指标&#xff0c;如果想监控应用程序的性能指标或者想更加细粒度的监控应用程序的运行状态指标的话&#xff0c;则需要在应用程序中内置对Prometheus的支持或者部署独立于应用…

悦数图数据库v3.5.0发布:查询性能大幅提升,为智能决策和 AI 大模型应用提速

近日&#xff0c;悦数图数据库最新版本&#xff08;v3.5.0&#xff09;正式发布&#xff0c;作为国内首个能够容纳千亿点、万亿边并保持毫秒级查询延时的企业级原生分布式图数据库&#xff0c;悦数图数据库 3.5.0 版本进一步强化了数据库内核的查询性能和稳定性&#xff0c;同时…

socks协议详解

0x01 socks协议简介 Socks&#xff08;Socket Secure&#xff09;协议是一种网络协议&#xff0c;处于会话层&#xff0c;用于管理网络连接并提供安全性和隐私保护。通过使用Socks代理服务器&#xff0c;客户端可以隐藏其真实IP地址和其他身份信息&#xff0c;从而匿名地访问互…

机器学习 day28(模型评估)

为什么需要模型评估 我们可以借助图像来判断模型是否良好。但当我们用单一特征来绘制f(x)图像时&#xff0c;模型容易出现过拟合现象。但如果增加一些输入特征的种类&#xff0c;绘制图像又会变得很困难。而模型评估可以解决这一痛点。 模型评估 通常我们将数据集的一大半…

[C语言]if语句详解

C语言初阶系列 分支语句和循环语句&#xff08;1&#xff09; 目录 C语言初阶系列 前言 一&#xff0c;什么是语句&#xff1f; 1.1如何理解语句&#xff1f; 二&#xff0c;分支语句&#xff08;选择结构&#xff09; 2.1,if语句 2.2,if语句的错误的条件写法 2.2,if语…

Houdini Vex 补缺

一. transorm —— move—— scale—— rot1.这里 补2 个函数 quaternion( ) &#xff08;角度&#xff08;弧度制&#xff09;, 轴&#xff09; 获取4元数 qroate( ) &#xff08;quaternion &#xff0c;点坐标&#xff09; 进行旋转 案例&#xff1a; 参考 视频连接 般 b站…

【山河送书第三期】:《Python机器学习:基于PyTorch和Scikit-Learn 》赠书四本!!

【山河送书第三期】&#xff1a;《Python机器学习&#xff1a;基于PyTorch和Scikit-Learn 》 前言内容简介作者简介参与方式 前言 近年来&#xff0c;机器学习方法凭借其理解海量数据和自主决策的能力&#xff0c;已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务…

如何向资深开发人员寻求帮助(并获得帮助)

在程序开发过程中&#xff0c;我们时常会遇到让人挠头的问题。如何寻求帮助&#xff0c;尤其是如何向资深开发人员寻求帮助&#xff0c;是一门值得学习的技艺。这并不只是简单地把问题抛出来&#xff0c;而是需要学会在何时求助&#xff0c;如何提问&#xff0c;如何理解答案&a…

股票量化系统QTYX选股框架实战案例集|越强的龙头出分歧,越大可能出反包-230717...

前言 “实战案例个股画像”系列和大家分享我基于QTYX选股框架&#xff0c;在实战中选股的案例&#xff0c;和大家一起见证QTYX选股框架逐步完善的过程&#xff0c;帮助大家理解QTYX的精髓。 关于QTYX的使用攻略可以查看链接&#xff1a;QTYX使用攻略 关于QTYX初衷和精髓可以查看…

怎么用Midjourney制作表情包

要使用Midjourney制作表情包&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 打开Midjourney的官方网站或下载Midjourney应用程序&#xff0c;并登录你的账户。 2. 在Midjourney中&#xff0c;选择创建新项目或表情包。 3. 在项目中&#xff0c;你可以选择使用预设的模…

【学习笔记】浅谈最小生成树及重构树

板子传送门 定义 生成树 一个连通图的生成树是一个极小的连通子图&#xff0c;它包含图中全部的 n n n 个顶点&#xff0c;但只有构成一棵树的 n − 1 n-1 n−1 条边。 最小生成树 其实就是一个图中最小的一个生成树 所谓一个 带权图 的最小生成树&#xff0c;就是原图中…

Label基本用法

作用&#xff1a;是一个标签&#xff0c;可以用来显示文本&#xff1b; 常用属性&#xff1a; 常用事件&#xff1a; 后台代码示范&#xff1a; //d单击标签时触发private void label1_Click(object sender, EventArgs e){MessageBox.Show("标签被单击");//获取标签…

Python(十九)python中的注释

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…