【Docker】Docker镜像和Docker容器

2023-10-30

文章目录

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 images docker image ls/docker image list 列出本地镜像
docker tag docker image tag 给镜像打标签, 可用于推送镜像仓库
docker pull docker image pull 从镜像仓库拉取 镜像
docker push docker image push 推送镜像到仓库
docker rmi docker image rm/ docker image remove 删除本地镜像
docker build docker image build 通过 dockerfile 制作镜像
docker save docker image save 将指定镜像保存 成 tar 归档文件
docker load docker image load 导入使用 docker save 命 令导出的镜像
docker image inspect 查看镜像详细信 息 必须掌握
docker history docker image history 查看镜像历史
docker import docker 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 create docker container create 创建容器
docker run docker container run 运行容器
docker attach docker container attach 连接到正在运行中的容 器。
docker commit docker container commit 将镜像提交为容器
docker cp docker container cp 在容器和宿主机之间拷贝
docker diff docker container diff 检查容器里文件结构的更 改。
docker exec docker container exec 在运行的容器中执行命令
docker export docker container export 将容器导出为 tar
docker container inspect 查看容器详细信息 必须掌 握
docker kill docker container kill 杀死容器
docker logs docker container logs 查看日志
docker ps docker container ls, docker container list, docker container ps 查看正在运行的进程
docker pause docker container pause 暂停进程
docker port docker container port 查看容器的端口映射
docker container prune 删除停止的容器
docker rename docker container rename 重命名容器
docker restart docker container restart 重启容器
docker rm docker container rm, docker container remove 删除容器
docker start docker container start 启动容器
docker stats docker container stats 查看资源占用信息
docker stop docker container stop 停止容器
docker top docker container top 查看某个容器的资源占用
docker unpause docker container unpause 继续运行容器
docker update docker container update 更新容器配置
docker wait docker 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 对象

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Docker】Docker镜像和Docker容器 的相关文章

随机推荐

  • 贪心算法:最优分解问题

    问题描述 设n是一个正整数 现要求将n分解为若干个互不相同的自然数的和 使这些自然数的乘积最大 代码如下 int BestMul int n int i j mul 1 int num 初始化一个数组 用来存放分解后的每个数 int a M
  • 基于Feign的局部请求拦截

    由于项目的要求 不能对所有基于Feign的进行拦截 需要对不同的Feign请求进行不同的拦截 经过资料的收集整理以及SpringCloud中对于Feign的集成的源码的阅读 解决了针对Feign请求的局部拦截 本项目中SpringCloud
  • Git(10)——Git多人协同开发之邀请成员

    一 简介 本篇文章接着第九章介绍Git多人协同开发如何邀请成员 二 创建dev分支 前面已经提到master只用于上线正式代码 因此需要创建一个专门用于开发的dev分支 使用如下命令创建dev分支并切换到dev分支 git checkout
  • 闲鱼项目月入三万,赶紧来蹭这波红利!

    如果你弄懂了信息差 你就会知道什么叫商业 也许你会说 别扯了 现在互联网这么发达 信息差肯定越来越少 我只能说你太天真 信息差存在于你生活的每个角落 尤其是在人们的地域文化差异 教育水平层次和认知中 而这其间也存在着巨大的商机 举个栗子 比
  • mac安装conda后,终端的用户名前面有一个(base),最佳解决方案

    本文转载自https blog csdn net u010666669 article details 90085125 mac安装了conda后 前面会有一个 base 很烦人 终于找到最佳解决方案了 conda config set a
  • 刷脸支付永远不会过时只会不断的变革

    物联网大爆炸时代 AI 人工智能 人脸识别等名词像一个永不过时的网红时常出现在我们面前 从研发到发展 然后落地应用 刷脸支付逐步走进我们的衣食住行中 并在很多行业发挥着其高效便捷的作用 刷脸支付是对传统支付方式的革命 也是移动支付新的利润增
  • Linux下的网络服务之网关、DNS、网桥

    一 网关 1 1 基本概念 网关 路由器上和客户主机处在同一网段的IP称为客户机的网关 1 2 网关的设定 方式 命令 含义 临时 ip route add default via 172 25 254 100 添加网关 ip route
  • 找不到com.google.common.base.Predicates

    原因在于 swagger2解决冲突时 排除了了guava 在dependecies management进行版本限制
  • Windows丢失缺少api-ms-win-crt-process-l1-1-0.dll解决方法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个api ms win crt process l
  • html canvas画背景图片,使用canvas画图并充当背景图片,但出现奇怪效果_html/css_WEB-ITnose...

    这是初始的样子 我想要的效果是这颗心不随滚动条滚动 当我拖动滚动条的时候 这颗心跟着移动了 但原位置固定了另一颗心 继续拖动滚动条 由此可见 初始页面的心会随着滚动条移动 但同时有另一个心被固定在中间 我只想要让这个心被固定在中心 不会因为
  • figma的一些用法(一)

    1 新建frame画布 2 圆角按钮 3 放大字体并设置效果
  • 普通域用户远程桌面登录域控制器

    想个一个普通用户登录域控制器进行添加用户等操作 将此用户设置到运行远程桌面登录 但是登录的时候提示 要登录到这台远程计算机 您必须被授予允许通过终端登录权限 默认情况下 管理员 组的成员拥有该权限 在域控上单独设置远程桌面登录没有用 还需要
  • JSP+Servlet+JavaBean 开发案例——求和运算

    问题 利用 JSP Servlet JavaBean 编程 实现任意两个整数的累加值 并显示结果 分析 该题目采用JSP Servlet JavaBean模式 按其不同的职责 由JavaBean封装业务逻辑处理计算累加值 由JSP实现信息的
  • C#中的??、?:和?

    可空类型修饰符 引用类型可以使用空引用表示一个不存在的值 而值类型通常不能表示为空 例如 string str null 是正确的 int i null 编译器就会报错 为了使值类型也可为空 就可以使用可空类型 即用可空类型修饰符 来表示
  • nginx的基本配置

    1 静态HTTP服务器 首先 Nginx是一个HTTP服务器 可以将服务器上的静态文件 如HTML 图片 通过HTTP协议展现给客户端 2 反向代理服务器 什么是反向代理 客户端本来可以直接通过HTTP协议访问某网站应用服务器 如果网站管理
  • 中国天气网接口类(中国天气预报)

    新写的中国天气网api接口类 分享给大家 妈妈再也不用担心我出门被天气君欺负了 只需修改两个参数 private key appid 即可使用 这两个参数从中国天气网获取 地址是 http openweather weather com c
  • 23. 异步HTTP请求与aiohttp模块

    目录 前言 aiohttp简介 aiohttp安装 aiohttp应用 先导包 拿到了批量URL 仿照上一节敲出模板 完善下载单个页面的代码 完整代码 运行效果 总结 前言 在上一节中 我们发现time sleep 不是异步的 导致我们的异
  • 虚幻4学习笔记(12)操控导入的角色、动画蓝图、播放蒙太奇和打包、角色重定向

    虚幻4学习笔记 操控导入的角色 设置鼠标旋转 关掉动态模糊 动画蓝图 播放蒙太奇和打包 角色走路奔跑动画 shift 奔跑 F 跳舞 移动打断 跳舞 打包 角色重定向 姿势调整 解决跑步 腿分太开 隐藏剑 B站UP谌嘉诚课程 https w
  • Java String字符串转int数组

    String类的toCharArray 方法可将字符串转为数组 abcde 转为 a b c d e 123456 转为 1 2 3 4 5 6 char型 将String字符串转换为int数组 数字范围0 9 param str 字符串
  • 【Docker】Docker镜像和Docker容器

    文章目录 Docker镜像 镜像基本概念 为什么需要镜像 Union FS 联合文件挂载 docker镜像原理 Docker镜像命令 docker rmi docker save docker load docker history doc