Docker

Hypervisor允许多个操作系统共享一个CPU(多核CPU的情况可以是多个CPU)。处于操作系统与硬件系统之间,用于实现多个虚拟机共享宿主机的硬件系统。

hyper-v则是微软提供的商业化Hypervisor,运行在windows系统上

KVM与Xen是linux系统上开源的Hypervisor

现在的Windows系统的架构(操作系统和应用层分别是两个虚拟机,位于Hyper-V之上)

image-20240229202902295

容器与虚拟机的最大区别是

虚拟机中存在独立的硬件系统与操作系统,但容器中的全部是共享的宿主机中的操作系统与硬件系统。

VMware Workstation 要等到15.5.5版本开始,才对VMM虚拟机技术进行了重构,之前需要直接调用CPU的虚拟化功能,现在调用Win10系统的WHP(Windows 的Hypervisor平台)的API,解决了VMware Workstation与Hyper-V的不兼容问题。

Docker的架构图

Docker Architecture diagram

Docker使用客户机-服务器架构。Docker客户端与Docker守护进程通信,后者完成构建、运行和分发Docker容器的繁重工作。Docker客户端和守护进程可以运行在同一个系统上,或者您可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API,通过UNIX套接字或网络接口进行通信。另一个Docker客户端是Docker Compose,它允许你处理由一组容器组成的应用程序。

Centos安装Doker

CentOS7安装jdk

查看防火墙状态

systemctl status firewalld

开启的话要关闭,然后可以做一个有基本命令和功能的基础虚拟机,然后用VM克隆。

centos的网卡文件

/etc/sysconfig/network-script/ifcfg-ens33

配置完可以加到hosts文件,之后用MobaXterm连接可以直接用名字,解析更方便,不加也没关系

image-20240229221236567

下面安装仓库repository

$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

用阿里云的镜像地址

yum-config-manager --add-repo     http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


看下yun的仓库文件下有没有Docker

ll /etc/yum.repos.d

安装Docker Engine

sudo yum - y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

加个-y用来同意,省的输入,下面这个可以用来看版本,挑想要的装

sudo yum list docker-ce --showduplicates | sort -r

安装的时候把version string换成想要的即可

sudo yum install docker-ce- <VERSION STRING> docker-ce-cli- <VERSION_ STRING》 containerd.io docker-compose-plugin

安装后

sudo systemctl start docker

这一步记得在root权限执行,不然容易出问题

image-20240229232953166

然后,看一下自己有什么镜像

docker images

然后可以试一下hello world

sudo docker run hello-world

image-20240229233235488

因为没有这个镜像,一般会去下载默认的最新的这个镜像,没加tags默认就是leatest,然后latest:后面的那个就是拉取来源,hello到之后的内容就是镜像的结果,然后可以再看一下你的库里有什么

image-20240229233440257

可以发现多了个hello-world的镜像,然后上面有相应的信息

再来查看一下状态

systemctl status docker

image-20240301143347091

这个disable说明这个不是自启动的,我们可以通过

systemctl enable docker

来让他自启动

image-20240301143544195

练习的时候就不用自启动了

systemctl disable docekr

docker的关闭,关闭虚拟机时可以先关闭docker

systemctl stop docker

配置国内加速器官方教程

先登陆阿里云加速器的网站,然后进入镜像加速器的页面

https://cr.console.aliyun.com/cn-hangzhou/mirrors

在etc文件下创建一个docker目录

sudo mkdir -p /etc/docker

然后用tee命令把东西输入到daemon.json文件,这个文件是新建的

tee /etc/docker/dameon.json <<-'EOF'

tee命令可以创建一个文件,然后你输入一个东西他会写进去并回显你输入的东西

[root@localhost ~]# tee hello.log
hello
hello
hello 1
hello 1
hello 2
hello 2
^C
[root@localhost ~]# cat hello.log
hello
hello 1
hello 2

具体内容

[root@localhost ~]# tee /etc/docker/dameon.json <<-'EOF'
> {
> "registry-mirrors": ["https://9e15pjnb.mirror.aliyuncs.com"]
> }
> EOF
{
"registry-mirrors": ["https://9e15pjnb.mirror.aliyuncs.com"]
}
[root@localhost ~]# cat /etc/docker/dameon.json
{
"registry-mirrors": ["https://9e15pjnb.mirror.aliyuncs.com"]
}
[                 root@localhost ~]#

然后重新加载一下配置和重启一下docker

sudo systemctl daemon-reload
sudo systemctl restart docker

拉一个centos:7的镜像试试,感觉还是挺慢的

[root@localhost ~]# docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Status: Downloaded newer image for centos:7
docker.io/library/centos:7

Docker引擎的卸载

  1. Uninstall the Docker Engine, CLI, containerd, and Docker Compose packages:

    $ sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
  2. Images, containers, volumes, or custom configuration files on your host aren’t automatically removed. To delete all images, containers, and volumes:

    $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd

3.还有一些自己创建的配置文件

Docker发展

首发架构由两大核心组件构成: LXC(Linux Container) 与Docker Daemon。
首发架构的两大问题:

严重依赖于LXC,出现了“卡脖子”问题,及无法实现Docker跨平台。所以在0.9版本使用了Docker自研的Libcontainer替换了LxC。

Docker Daemon中的“大而全”使得版本更新难、性能出现瓶颈、不符合软件哲学(由Unix团队提出),关键是,其还存在着“中心化”问题。所以在1.1版本中其实现了OCI规范,将容器运行时Runc从Docker Daemon中剥离出来。

Docker引擎架构

image-20240301161001288

  • Docker Client:用户提交Docker命令。
  • Docked:负责REST API、处理镜像相关命令、网络、容器编排等。
  • Containerd:负责容器生命周期的管理,负责处理容器相关的命令,但不负责创建容器,当docker un命令的到来时会fork出Runc和Shim两个进程
  • Runc:负责创建容器进程,容器创建并启动后,将容器进程交给Shim处理,然后自己推出。
  • Shim:负责将容器与Docker Daemon进行解耦

Docker引擎分类

Docker三大版本(Moby、CE、EE),两个小版本(edge月、stable季)

镜像基础

镜像简介

镜像是一种轻量级、可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等。几乎所有应用,直接打包为 Docker 镜像后就可以运行。由于镜像的运行时是容器,容器的设计初衷就是快速和小巧,所以镜像通常都比较小,镜像中不包含内核,其共享宿主机的内核:镜像中只包含简单的 Shell,或没有 Shell。

busybox一个大的工具箱,集成了很多有用的linux命令工具等,堪称linux的瑞士军刀,下载一下

docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
9ad63333ebc9: Pull complete
Digest: sha256:6d9ac9237a84afe1516540f40a0fafdc86859b2141954b4d643af7066d598b74
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest

很小,就是一个微型的系统

仓库分类

  • Docker Official Image

    Docker 官方镜像仓库。该类仓库中的镜像由 Docker 官方构建发布,代码质量较高且安全,有较完善的文档。该类仓库中的镜像会及时更新。一般常用的系统、工具软件、中间件都有相应的官方镜像仓库。例如,Zookeeper、Redis、Nginx 等。官方镜像仓库的名称一般直接为该类软件的名称。“

  • Verified Publisher

    已验证发布者仓库。该类仓库中的镜像由非 Docker 官方的第三方发布。但该第三方是由 Docker 公司审核认证过的,一般为大型企业、团体或组织。审核通过后,Docker 公司会向其颁发“VERIFIED PUBLISHER”标识。这种仓库中镜像的质量还有有保证的。除了官方镜像仓库,其它都是非官方镜像仓库。非官方镜像仓库名称一般由发布者用户名与软件名称两部分构成,形式为: /

  • Sponsored OSS

    由 Docker 公司赞助开发的镜像仓库。该类仓库中的镜像也由非 Docker 官方的第三方发布,但该镜像的开发是由 Docker 公司赞助的。该类型的第三方一般为个人、团队或组织。这种仓库中镜像的质量也是有保证的。“

  • 无认证

​ 不安全

  • 第三方镜像中心

    镜像中心默认使用的都是 Docker 官方的 Docker Hub。不过,镜像中心是可配置的,可以使用指定的第三方镜像中心。对于第三方镜像中心中的仓库名称由三部分构成://。其中的指的是第三方镜像中心的域名或IP。

镜像定位

对于任何镜像,都可通过:进行唯一定位。其中一般称为镜像的版本号。中有一个比较特殊的版本一-latest。如果不指定,默认即为 latest。不过,虽然其字面意思是最新版,一般其也的确存放的是最新版,但并不能保证其真的就是最新版。

获取帮助信息

  1. 官网获取https://docs.docker.com/reference/cli/docker/
  2. docker –help
docker version --help

docker pull

[root@localhost ~]# docker pull --help

Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
--DIGEST摘要,镜像内容的哈希值,用来验证内容是否被篡改,和TAG同作用,但TAG更方便

Download an image from a registry --拉取一个仓库

Aliases:
docker image pull, docker pull

Options:
-a, --all-tags               Download all tagged images in the repository --下载一个仓库的所有镜像,可能会下载很多东西
    --disable-content-trust   Skip image verification (default true) --跳过镜像的验证,默认是跳过的,下第三方的时候最好设置成false
    --platform string         Set platform if server is multi-platform --拉去指定架构的镜像,不常用,一般都是和自身架构匹配的
                              capable
-q, --quiet                   Suppress verbose output
--省略下载的输出信息,减少信息冗余

docker images

[root@localhost ~]# docker images --help

Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Aliases:
docker image ls, docker image list, docker images

Options:
-a, --all             Show all images (default hides intermediate images)
    --digests         Show digests
-f, --filter filter   Filter output based on conditions provided
    --format string   Format output using a custom template:
                      'table':           Print output in table format
                      with column headers (default)
                      'table TEMPLATE':   Print output in table format
                      using the given Go template
                      'json':             Print in JSON format
                      'TEMPLATE':         Print output using the given
                      Go template.
                      Refer to https://docs.docker.com/go/formatting/
                      for more information about formatting output with
                      templates
    --no-trunc       Don't truncate output
-q, --quiet           Only show image IDs

– digests可以查看镜像的摘要

[root@localhost ~]# docker images --digests
REPOSITORY   TAG       DIGEST                                                                   IMAGE ID       CREATED         SIZE
busybox       latest   sha256:6d9ac9237a84afe1516540f40a0fafdc86859b2141954b4d643af7066d598b74   3f57d9401f8d   6 weeks ago     4.26MB
hello-world   latest   sha256:d000bc569937abbe195e20322a0bde6b2922d805332fd6d8a68b19f524b7d21d   d2c94e258dcb   10 months ago   13.3kB
centos       7         sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4   eeb6ee3f44bd   2 years ago     204MB

–no-trunc,写全信息

[root@localhost ~]# docker images --no-trunc
REPOSITORY   TAG       IMAGE ID                                                                 CREATED         SIZE
busybox       latest   sha256:3f57d9401f8d42f986df300f0c69192fc41da28ccc8d797829467780db3dd741   6 weeks ago     4.26MB
hello-world   latest   sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a   10 months ago   13.3kB
centos       7         sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9   2 years ago     204MB

-q是显示简略信息

[root@localhost ~]# docker images -q
3f57d9401f8d
d2c94e258dcb
eeb6ee3f44bd

docker rmi $(docker images -q)删除所有镜像

但遇到一个问题”Error response from daemon: invalid reference format: repository name must be lowercase”但这个好像是要小写命名docker镜像

这个好像要重命名才能解决

docker images 镜像名字,单独查看那个镜像的信息

-f 过滤

docker images -f dangling=true --悬虚镜像:悬虚镜像就是镜像没有仓库名或没有标签查询显示虚悬镜像,在列表中展示为 <none>:<none>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5avIWwl-1586674340510)(evernotecid://621D2FF6-4E72-4E02-9043-55F31F42819B/appyinxiangcom/22553815/ENResource/p1118)]

[root@localhost ~]# docker images -f since=hello-world
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox     latest   3f57d9401f8d   6 weeks ago   4.26MB

since这个是看自since之后的东西,也可以用before看之前的

reference= * : * 宽泛查询,*

docker images -f reference=*:latest找所有latest版本的镜像
docker images -f refernece=centos:*找所有版本的centos
docker images -f reference=*t*找到名字和版本中包含字母t的镜像
但reference只查官方的

–format 格式化输出

[root@localhost ~]# docker images --format {{.Repository}}
busybox
hello-world
centos
[root@localhost ~]# docker images --format {{.Repository}}:{{.Tag}}
busybox:latest
hello-world:latest
centos:7
[root@localhost ~]# docker search centos
NAME                               DESCRIPTION                                                                                                                   STARS     OFFICIAL
centos                             DEPRECATED; The official build of CentOS.                                                                                     7715     [OK]
kasmweb/centos-7-desktop           CentOS 7 desktop for Kasm Workspaces                                                                                         43
...

AUTOMATED表示当前镜像是否是”自动化镜像“,就是使用Docker Hub连接一个包含Dockerfile文件(专门构建镜像用的文件)的GitHub仓库或Bitbucket仓库(源码托管平台),然后Docker Hub就会自动根据Dockerfile内容构建镜像,这种构建出的镜像就会带AUTOMATED,这种构建镜像的方式称为Trusted Build(受信构建)。只要Dockerfile文件内容发生变化,那么Docker Hub就会构建出新的镜像

[root@localhost ~]# docker search --help

Usage: docker search [OPTIONS] TERM

Search Docker Hub for images

Options:
-f, --filter filter Filter output based on conditions provided -f和之前的images差不多
--format string Pretty-print search using a Go template
--limit int Max number of search results-限制个数
--no-trunc Don't truncate output

dockers rmi(删除容器 rm)

[root@localhost ~]# docker rmi --help

Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Aliases:
docker image rm, docker image remove, docker rmi

Options:
-f, --force     Force removal of the image --强制删除
    --no-prune   Do not delete untagged parents --和镜像层相关

操作一下试试

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox       latest   3f57d9401f8d   6 weeks ago     4.26MB
hello-world   latest   d2c94e258dcb   10 months ago   13.3kB
centos       7         eeb6ee3f44bd   2 years ago     204MB
[root@localhost ~]# docker rmi centos:7
Untagged: centos:7
Untagged: centos@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9
Deleted: sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox       latest   3f57d9401f8d   6 weeks ago     4.26MB
hello-world   latest   d2c94e258dcb   10 months ago   13.3kB
[root@localhost ~]# docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 9c54e5ac2981 is using its referenced image d2c94e258dcb
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND   CREATED       STATUS                   PORTS     NAMES
9c54e5ac2981   hello-world   "/hello"   6 hours ago   Exited (0) 6 hours ago             ecstatic_ride
0881099d27ad   hello-world   "/hello"   20 hours ago   Exited (0) 20 hours ago             vibrant_murdock
[root@localhost ~]# docker rmi -f hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:d000bc569937abbe195e20322a0bde6b2922d805332fd6d8a68b19f524b7d21d
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND   CREATED       STATUS                   PORTS     NAMES
9c54e5ac2981   d2c94e258dcb   "/hello"   7 hours ago   Exited (0) 7 hours ago             ecstatic_ride
0881099d27ad   d2c94e258dcb   "/hello"   20 hours ago   Exited (0) 20 hours ago             vibrant_murdock
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox     latest   3f57d9401f8d   6 weeks ago   4.26MB

其中hello-world因为已经运行在容器里了,可以ps -a一下看看,然后用-f强制删除

docker save

用来把镜像打包保存到本体,方变移动

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
zookeeper   3.7       446078172ae8   2 weeks ago   307MB
busybox     latest   3f57d9401f8d   6 weeks ago   4.26MB
[root@localhost ~]# docker save --help

Usage: docker save [OPTIONS] IMAGE [IMAGE...]

Save one or more images to a tar archive (streamed to STDOUT by default)

Aliases:
docker image save, docker save

Options:
-o, --output string   Write to a file, instead of STDOUT
[root@localhost ~]# docker save -o my.tar zookeeper:3.7 busybox:latest
[root@localhost ~]# ll
total 310364
...
-rw-------. 1 root root 317776384 Mar 1 04:01 my.tar
...
也可以重定向到一个文件里,用>

[root@localhost ~]# docker save zookeeper:3.7 busybox:latest > new.tar
[root@localhost ~]# ll
total 620696
...
-rw-------. 1 root root 317776384 Mar 1 04:01 my.tar
-rw-r--r--. 1 root root 317776384 Mar 1 04:03 new.tar
...大小都是一样得

image-20240301200411484

这是原来的,然后把它们删除

[root@localhost ~]# docker rmi 446078172ae8 3f57d9401f8d
...
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

然后再把tar加载出来

docker load

[root@localhost ~]# docker load --help

Usage: docker load [OPTIONS]

Load an image from a tar archive or STDIN

Aliases:
docker image load, docker load

Options:
-i, --input string   Read from tar archive file, instead of STDIN
-q, --quiet         Suppress the load output
[root@localhost ~]# docker load -i my.tar
2e112031b4b9: Loading layer 4.492MB/4.492MB
Loaded image: busybox:latest
d101c9453715: Loading layer 80.41MB/80.41MB
431a6830edc6: Loading layer 38.53MB/38.53MB
c5da6d3a7681: Loading layer 140.9MB/140.9MB
48ea7a659f10: Loading layer   2.56kB/2.56kB
da0e0faf395b: Loading layer 3.072kB/3.072kB
fb2a43f5cc59: Loading layer 342.5kB/342.5kB
adff97f6861e: Loading layer 10.88MB/10.88MB
9b43d841bc28: Loading layer 42.15MB/42.15MB
9abd5b933e89: Loading layer 3.072kB/3.072kB
Loaded image: zookeeper:3.7

image-20240301200729066

和之前对比一下,镜像id都是一样的,这个也有重定向的写法

docker load < my.tar

效果是一样的

镜像分层

Docker 镜像由一些松耦合的只读镜像层组成,Docker Daemon 负责堆叠这些镜像层,并将它们关联为一个统一的整体,即对外表现出的是一个独立的对象。“通过 docker pull 命令拉取指定的镜像时,每个 Pull complete 结尾的行就代表下载完毕了一个镜像层。·
例如,下面的 redis:latest 镜像就包含8个镜像层。

[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
e1caac4eb9d2: Pull complete
7469c6c5b625: Pull complete
a3d1b68c4a62: Pull complete
152cbe749752: Pull complete
7218480dfba1: Pull complete
e61c48a0d344: Pull complete
4f4fb700ef54: Pull complete
82adb0efabd8: Pull complete
--如果存在则会显示Already exists
Digest: sha256:e647cfe134bf5e8e74e620f66346f93418acfc240b71dd85640325cb7cd01402
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

为什么分层

采用这种分层结构的优势很多,例如,每个分层都是只读的,所有对分层的修改都是以新分层的形式出现,并不会破坏原分层内容:再如,每个分层只记录变更内容,所以有利于节省存储空间等。”
不过,分层结构的最大的好处是,在不同镜像间实现资源共享,即不同镜像对相同下层镜像的复用。对于 docker pull 命令,其在拉取之前会先获取到其要拉取镜像的所有 magelD,然后在本地查找是否存在这些分层。如果存在,则不再进行拉取,而是共享本地的该分层。大大节点的存储空间与网络带宽,提升了拉取效率。

镜像层构成

每个镜像层由两部分构成:镜像文件系统镜像json 文件。这两部分具有相同的 magelD.镜像文件系统就是对镜像占有的磁盘空间进行管理的文件系统,拥有该镜像所有镜像层的数据内容。而镜像 json 文件则是用于描述镜像的相关属性的集合,通过 docker inspect [镜像]就可以直观看到。“

镜像文件系统构成

一个 docker 镜像的文件系统由多层只读的镜像层组成,每层都完成了特定的功能而这些只读镜像层根据其位置与功能的不同可分为两类: 基础镜像层扩展镜像层.image-20240302143631410

  • 基础镜像层

​ 所有镜像的最下层都具有一个可以看得到的基础镜像层 Base lmage,基础镜像层的文件系统称为根文件系统 rootfs。而 rootfs 则是建立在 Linux 系统中“看不到的”引导文件系统bootfs之上。

  • 扩展镜像层

​ 在基础镜像层之上的镜像层称为扩展镜像层。顾名思义,其是对基础镜像层功能的扩展在 Dockerfile 中,每条指令都是用于完成某项特定功能的,而每条指令都会生成一个扩展镜像层。“

  • 容器层

​ 一旦镜像运行了起来就形成了容器,而容器就是一个运行中的 Linux 系统,其也是具有文件系统的。容器的这个文件系统是在 docker 镜像最外层之上增加了一个可读写的容器层对文件的任何更改都只存在于容器层。因此任何对容器的操作都不会影响到镜像本身。“容器层如果需要修改某个文件,系统会从容器层开始向下一层层的查找该文件,直到找到为止。任何对于文件的操作都会记录在容器层。例如,要修改某文件,容器层会首先把在镜像层找到的文件 copy 到容器层,然后再进行修改。删除文件也只会将存在于容器层中的文件副本删除。“
​ 可以看出,Docker 容器就是一个叠加后的文件系统,而这个容器层称为 Union File System,联合文件系统。

LinuxOS启动过程

​ 现代操作系统都是 C/S模式的微内核架构的,由两大部分构成:内核(Server)与服务模块(Client)。

​ Linux的 bootfs 文件系统由两部分构成:bootloader(将kernel加载到内存,并引导kernel启动) 与kernel(启动后,内存使用权就又bootfs完全转交给kernel,然后kernel就会把bootfs卸载)。

image-20240302163101380

镜像摘要

每个镜像都有一个长度为64 位的16 进制字符串作为其摘要 digest。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS说明:

  • **-f :**指定返回值的模板文件。
  • **-s :**显示总的文件大小。
  • **–type :**为指定类型返回JSON。

查看摘要

docker images xx --degists
[root@localhost ~]# docker images redis --digests
REPOSITORY   TAG       DIGEST                                                                   IMAGE ID       CREATED       SIZE
redis       latest   sha256:e647cfe134bf5e8e74e620f66346f93418acfc240b71dd85640325cb7cd01402   d1397258b209   7 weeks ago   138MB

一个镜像一旦创建完毕,其 digest 就不会发生改变了,因为镜像是只读的。。
Docker 默认采用的 Hash 算法是 SHA256,即 Hah 值是一个长度为 256 位的二进制值。
Docker 使用 16 进制表示,即变为了长度为 64 位的字符串。

摘要作用

​ 摘要的主要作用是区分相同:的不同镜像。。
​ 例如镜像 xxx:2.8 在生产运行过程中发现存在一个 BUG。现对其进行了修复,并使用原标签将其 push 回了仓库,那么原镜像被覆盖。但生产环境中遗留了大量运行中的修复前镜像的容器。此时,通过镜像标签已经无法区分镜像是修复前的还是修复后的了,因为它们的标签是相同的。此时通过查看镜像的 digest 就可以区分出修改前后版本,因为内容发生了变化,digest一定会变。”
​ 为了确保再次拉取到的是修复后的镜像,可通过 digest 进行镜像拉取。其用法是:docker pull @.

分发散列值

​ 在 push 或 pul 镜像时,都会对镜像进行压缩以减少网络带宽和传输时长。但压缩会改变镜像内容,会导致经过网络传输后,镜像内容与其digest不相符。出现问题。
​ 为了避免该问题该问题,Docker 又为镜像配置了 Distribution Hash(分发散列值)。在镜像被压缩后立即计算分发散列值,然后使该值随压缩过的镜像一同进行发送。在接收方接收后,立即计算压缩镜像的分发散列值,再与携带的分发散列值对比。如果相同,则说明传输没有问题。

容器运行的本质

Docker 容器存在的意义就是为了运行容器中的应用,对外提供服务,所以启动容器的目的就是启动运行该容器中的应用。容器中的应用运行完毕后,容器就会自动终止。所以,如果不想让容器启动后立即终止运行,则就需要使容器应用不能立即结束。通常采用的方式有两种,使应用处于与用户交互的状态或等待状态。.

docker交互式启动ubantu

[root@localhost ~]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
01007420e9b0: Pull complete
Digest: sha256:f9d633ff6640178c2d0525017174a688e2c1aef28f0a0130b26bd5554491f0da
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

遇到问题Error docker login—-

Error response from daemon: pull access denied for ubantu, repository does not e xist or may require ‘docker login’: denied: requested access to the resource is denied

解决方案

docker login
然后输入你的账号密码

注意

密码会保存在/root/.docker/config.json文件下,要注意保护,加密方式是Base64,解码出来时账号:密码的格式,还是挺危险的

[root@localhost ~]# echo "YWRtaW46MTIzNDU2==" | base64 --decode
admin:123456 base64: invalid input
docker run --name myubantu ubantu #--name重命名方便查询进程
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bb10ad29613 ubuntu "/bin/bash" 4 seconds ago Exited (0) 3 seconds ago myubuntu

可以发现是退出的状态,所以我们需要加上一个bash来添加命令行,然后容器里不允许重名,所以–name 后可以加个2,

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • **ubuntu这是指用 ubuntu镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
docker run --name mybantu2 -it ubuntu /bin/bash #-i是交互式命令,-t是给一个伪客户端, /bin/bash是常用shell的路径
[root@localhost ~]# docker run --name mybuntu2 -it ubuntu /bin/bash
root@939a1dcb875c:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var

可以看到这就进来了,但有很多命令这个系统里是没有,然后可以按exit退出

但有时候这个/bin/bash也可以不加,不懂什么时候要什么时候不要

  • 原因:可以看dockerfile里的镜像层,有一个CMD[‘bash’],是作为run参数里的一个选项,没有的话默认就是bash

docker交互式启动tomcat

与ubuntu不同的是,tomcat启动时需要注意一些东西,这里就不用最新版了

docker pull tomcat:8.5.49
[root@localhost ~]# docker run --name mytom -it tomcat:8.5.49 /bin/bash
root@df72620e3480:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt include native-jni-lib work
CONTRIBUTING.md README.md bin lib temp
LICENSE RELEASE-NOTES conf logs webapps

可以发现和解压出来的一样,但tomcat是未启动,原因出在/bin/bash

docker run --name mytom2 -it tomcat:8.5.49
...
Server startup in 888 ms

这时候会发现tomcat启动了,用网页访问试试,还是不行,因为端口8080是centos的里某个占用这个端口的应用,但此时没有,所以不行,需要用到端口映射,把它暴露给宿主机

docker run --name mytom3 -it -p 8081:8080 tomcat:8.5.49  左边是宿主机的端口,右边是容器里的端口
第一个8081是暴露linux 的端口号,这样外部才能连接linux
第二个端口号暴露的是容器的端口号,这样linux才能连接容器
-P是随机分配到默认即 rand:default 因为不可控,所以不常用

需要注意的是-p这个参数要放在容器左边,不然会出问题,但视频里可以访问,我的不知道为什么,虚拟机里可以访问,但自己的windows主机访问不了

遇到问题网络没了

chkconfig --list --看看配置里是否有网络管理工具冲突,保留一个即可
systemctl stop NetworkManager
systemctl restart Network.Service
  • docker ps -a的内容太多
docker rm $(docker ps -a -q) 删除所有已经停止的容器

image-20240303135819090

终于是进来了,有两种退出方式

ctrl + p + q容器还是up的
ctrl + c 就直接退出了
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b162037cb017 tomcat:8.5.49 "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tom1

这里可以发现 command就不是/bin/bash了,俄式一个.sh文件

tips:0.0.0.0 ipv4的任意ip ::: ipv6的任意ip

守护进程方式启动tomcat

但如果伪终端一直存在,对后续的操作并不是很方便,所以我们可以把-it参数换成-d

[root@localhost ~]# docker run --name tom2 -dp 8081:8080 tomcat:8.5.49
e37ef6eeb57e3ef728d06c3807ace699a4292266fe8b295f384a04afc4e28c93

image-20240303141539414

可以看到8081也是可以访问的,但以此方式启动ubuntu是退出状态,因为未提供可交互的平台,当我们不知道时,可以看该镜像的dockerfile,里面会告诉我们要不要写。

对高版本的tomcat的访问

docker pull tomcat:8.5.50
docker run --name tom3 -dp 8084:8080 tomcat:8.5.50

image-20240303151123587

服务启动了,但没找到资源,说不定是网站页面文件配置有问题,所以我们进入tomcat的文件里看看

docker run --name tom4 -it tomcat:8.5.50 /bin/bash --这里就不用-p参数了,因为访问不了,只是看看配置文件
root@48c67ba22d08:/usr/local/tomcat# ls
BUILDING.txt README.md conf native-jni-lib work
CONTRIBUTING.md RELEASE-NOTES include temp
LICENSE RUNNING.txt lib webapps
NOTICE bin logs webapps.dist

可以发现多了一个webapps.dist,原本应该访问webapps文件的,但资源都放在dist里,我们需要移动一下文件,因为之前启动过一个tom3,我们用新命令exec来进入改一下文件

docker exec -it tom3 /bin/bash
root@e85341ca6a4a:/usr/local/tomcat# rm -rf webapps
root@e85341ca6a4a:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt include native-jni-lib work
CONTRIBUTING.md README.md bin lib temp
LICENSE RELEASE-NOTES conf logs webapps.dist
root@e85341ca6a4a:/usr/local/tomcat# mv webapps.dist/ webapps
root@e85341ca6a4a:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt include native-jni-lib work
CONTRIBUTING.md README.md bin lib temp
LICENSE RELEASE-NOTES conf logs webapps

现在webapps里面有东西,再重新访问试试,发现可以了

image-20240303152829813

对于高板本的问题,主要是webapps的目录是空的,需要移过去

容器退出命令

docker rm -f $(docker ps -a)强制删除全部容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES


exit
ctrl p + q

docker exec

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 22 minutes ago Up 22 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom
[root@localhost ~]# docker exec -it tom /bin/bash
root@fc32e8b34259:/usr/local/tomcat# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 22 minutes ago Up 22 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom

可以看到不影响容器的状态

[root@localhost ~]# docker exec --help

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

Execute a command in a running container

Aliases:
docker container exec, docker exec

Options:
- d, --detach Detached mode: run command in the background --后台运行,分离模式
--detach-keys string Override the key sequence for detaching a container --指定别的快捷键组合替代ctrl p q
-e, --env list Set environment variables 设置环境变量
--env-file list Read in a file of environment variables 文件形式配置环境变量
-i, --interactive Keep STDIN open even if not attached 交互方式
--privileged Give extended privileges to the command 扩展特权
-t, --tty 伪客户端 Allocate a pseudo-TTY
-u, --user string 有的容器需要身份认证 Username or UID (format: "<name|uid>[:<group|gid>]")
-w, --workdir string Working directory inside the container 设置工作目录

基本在docker run里都有

[root@localhost ~]# docker exec -w /root -it tom /bin/bash
root@fc32e8b34259:~# pwd
/root

有时候需要查看容器的ip,我们也可以不用进去,把bash换成你想执行的命令即可

[root@localhost ~]# docker exec -it tom ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
16: eth0@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@localhost ~]# docker exec -it tom pwd
/usr/local/tomcat

docker attach

和exec类似,但对tomcat有例外,进不去

[root@localhost ~]# docker run --name buntu -it ubuntu /bin/bash
root@0c5e1d974b26:/# [root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c5e1d974b26 ubuntu "/bin/bash" 17 seconds ago Up 15 seconds buntu
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 42 minutes ago Up 42 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom
[root@localhost ~]# docker exec -it buntu /bin/bash
root@0c5e1d974b26:/# exit
exit
[root@localhost ~]# docker attach buntu
root@0c5e1d974b26:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@0c5e1d974b26:/# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c5e1d974b26 ubuntu "/bin/bash" About a minute ago Exited (0) 9 seconds ago buntu
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 43 minutes ago Up 43 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom

可以看到docker exec 退出后进程还在,但docker attach退出后,进程也退出了,说明exec是创建新的进程来操作,而attach是进入到本体进程去操作,退出后,就都退出了,但docker attach进不去tomcat

docker attach tom,只会流个光标闪烁,但此时你退出后tomcat也退出了
[root@localhost ~]# docker attach --help

Usage: docker attach [OPTIONS] CONTAINER

Attach local standard input, output, and error streams to a running container

Aliases:
docker container attach, docker attach

Options:
--detach-keys string Override the key sequence for detaching a container
--no-stdin Do not attach STDIN 键盘输入不起作用,默认false
--sig-proxy Proxy all received signals to the process (default true) 接收的信号代理到进程
[root@localhost ~]# docker start buntu
buntu
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c5e1d974b26 ubuntu "/bin/bash" 26 minutes ago Up 3 seconds buntu

因为ubuntu的cmd是bash,是命令行

[root@localhost ~]# docker exec -it tom /bin/bash
root@fc32e8b34259:/usr/local/tomcat# cd logs
root@fc32e8b34259:/usr/local/tomcat/logs# ls
catalina.2024-03-03.log host-manager.2024-03-03.log localhost.2024-03-03.log localhost_access_log.2024-03-03.txt manager.2024-03-03.log
root@fc32e8b34259:/usr/local/tomcat/logs# cat localhost_access_log.2024-03-03.txt
192.168.174.1 - - [03/Mar/2024:09:05:56 +0000] "GET / HTTP/1.1" 200 11215

在tomcat中启停日志的信息会保存到catalina.—.log,访问时这个文件不会变,只有启动关闭时才会变化,然后其中一个参数catalina.sh和下面这个命令差不多

tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。

命令格式:

tail [参数] [文件]  

参数:

  • -f 循环读取
  • -q 不显示处理信息
  • -v 显示详细的处理信息
  • -c<数目> 显示的字节数
  • -n<行数> 显示文件的尾部 n 行内容
  • –pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
  • -q, –quiet, –silent 从不输出给出文件名的首部
  • -s, –sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

实例

要显示 notes.log 文件的最后 10 行,请输入以下命令:

tail notes.log         # 默认显示最后 10 行

docker ps

[root@localhost ~]# docker ps --help
Usage: docker ps [OPTIONS]
List containers
Aliases:
docker container ls, docker container list, docker container ps, docker ps
Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided 过滤条件
--format string Format output using a custom template: 格式化输出
'table': Print output in table format with
column headers (default)
'table TEMPLATE': Print output in table format using
the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go
template.
Refer to https://docs.docker.com/go/formatting/ for more
information about formatting output with templates
-n, --last int Show n last created containers (includes all states)
(default -1) 显示n个容器
-l, --latest Show the latest created container (includes all states) 显示最后一个创建的容器
--no-trunc Don't truncate output 完整显示输出
-q, --quiet Only display container IDs
-s, --size Display total file sizes

docker top

[root@localhost ~]# docker ps 默认显示正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 6 hours ago Up About an hour 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c5e1d974b26 ubuntu "/bin/bash" 6 hours ago Exited (0) 5 hours ago buntu
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 6 hours ago Up About an hour 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom
[root@localhost ~]# docker top tom
UID PID PPID C STIME TTY TIME CMD
root 14342 14323 0 20:37 pts/0 00:00:07 /usr/local/openjdk-8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
[root@localhost ~]# docker top tom1
UID PID PPID C STIME TTY TIME CMD
root 16306 16287 0 21:54 pts/0 00:00:00 /bin/bash

tty 是“teletypewriter”的缩写,但通常被称为终端,它允许您通过将数据(您的输入)传递给系统并显示系统产生的输出来与系统进行交互。

[root@localhost ~]# docker top --help

Usage: docker top CONTAINER [ps OPTIONS]

Display the running processes of a container

Aliases:
docker container top, docker top

这里的参数是指ps的参数在这里也是可以用的

[root@localhost ~]# ps
PID TTY TIME CMD
3825 pts/1 00:00:00 su
3831 pts/1 00:00:00 bash
8640 pts/1 00:00:00 ps
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 3825 3758 0 80 0 - 47494 wait pts/1 00:00:00 su
4 S 0 3831 3825 0 80 0 - 29143 wait pts/1 00:00:00 bash
0 R 0 8641 3831 0 80 0 - 37233 - pts/1 00:00:00 ps
[root@localhost ~]# docker top tom -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 8771 8753 80 80 0 - 546788 futex_ pts/0
[root@localhost ~]# docker top tom | grep 8753
root 8771 8753 2 17:02 pts/0 00:00:02 /usr/local/openjdk-8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

docker启停

启动

docker start xx
docker restart xx

停止

docker stop xx优雅停止
docker kill xx强制停止
[root@localhost ~]# docker stop/kill $(docker ps -q)
c17bb9e779f4
0c5e1d974b26
fc32e8b34259

补充:pause/unpause

日志监视不到,容器并没有暂停,但也访问不了

docker pause xx这个暂停的是容器对外提供的服务

docker logs

[root@localhost ~]# docker logs --help

Usage: docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Aliases:
docker container logs, docker logs

Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g.
"2013-01-02T13:23:37Z") or relative (e.g. "42m"
for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs
(default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g.
"2013-01-02T13:23:37Z") or relative (e.g. "42m"
for 42 minutes)

docker logs --since "2024-03-04" --tail 3 buntu 这里的日期也可以换成10s,10h,since也可以换成until
docker logs -f -n 10 tom 这个f可以用来查看容器动态的日志

docker cp

[root@localhost ~]# docker cp --help

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

Copy files/folders between a container and the local filesystem

Use '-' as the source to read a tar archive from stdin
and extract it to a directory destination in a container.
Use '-' as the destination to stream a tar archive of a
container source to stdout.

Aliases:
docker container cp, docker cp

Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH
-q, --quiet Suppress progress output during copy. Progress
output is automatically suppressed if no terminal
is attached
[root@localhost worksp]# ls
my.tar new.tar test.c
[root@localhost worksp]# docker cp my.tar buntu:/root
Successfully copied 318MB to buntu:/root
[root@localhost worksp]# docker exec -it buntu /bin/bash
root@0c5e1d974b26:/# cd /root
root@0c5e1d974b26:~# ls
my.tar

但不支持容器间拷贝

tips:sudo 与 su 两个命令的最大区别是:

sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码。另外一个区别是其默认行为,sudo 命令只允许使用提升的权限运行单个命令,而 su 命令会启动一个新的 shell,同时允许使用 root 权限运行尽可能多的命令,直到明确退出登录。

docker commit

centos ifconfig用不了可以用yum安装net-tools

yum install -y net-tools
[root@localhost ~]# docker commit --help

Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
tag叫什么都行,如果这个repository和tag都没有命名,默认是null,就成悬虚镜像了
Create a new image from a container's changes

Aliases:
docker container commit, docker commit

Options:
-a, --author string Author (e.g., "John Hannibal Smith
<hannibal@a-team.com>")作者
-c, --change list Apply Dockerfile instruction to the created image 可以增加指令,不常用
-m, --message string Commit message提交
-p, --pause Pause container during commit (default true) 暂停容器,up->暂停,默认时true

例子:

[root@localhost ~]# docker commit -a "youzipii <123@163.com>" -m "Added net-tools" ct1 centos7:net-tools
sha256:ee655f40750fcdbee0c3fac1b6f7ffdf2b19c862bf4d4c7a0e52fc8930d52e01
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 net-tools ee655f40750f 9 seconds ago 445MB
[root@localhost ~]# docker inspect ee655f40750f可以看详细信息元数据
开起来看看有没有net-tools
[root@localhost ~]# docker run --name ct2 -it centos7:net-tools
[root@c789c7b87faa /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255

tips:删除悬虚镜像

[root@localhost ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:6c0ad715431faaa5ef68eecdc2a3cd489b66b6a765fb43775bb5376179d54138
Total reclaimed space: 0B

容器导入导出

导出xport

[root@localhost ~]# docker export --help

Usage: docker export [OPTIONS] CONTAINER

Export a container's filesystem as a tar archive

Aliases:
docker container export, docker export

Options:
-o, --output string Write to a file, instead of STDOUT

[root@localhost ~]# docker export -o tom1-ex.tar tom1
[root@localhost ~]# ls
anaconda-ks.cfg Downloads mycmd Public Videos
Desktop initial-setup-ks.cfg original-ks.cfg Templates worksp
Documents Music Pictures tom1-ex.tar

导入import

[root@localhost ~]# docker import --help

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

Import the contents from a tarball to create a filesystem image

Aliases:
docker image import, docker import

Options:
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Set commit message for imported image
--platform string Set platform if server is multi-platform capable
[root@localhost ~]# docker import tom1-ex.tar tom8:import
sha256:3c91db73c82f48199d9cb1c805d9f80c1da963736217573d33228067e50395f3
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tom8 import 3c91db73c82f 4 seconds ago 499MB
tomcat 8.5.49 6408fdc94212 4 years ago 507MB

变小了,是因为有些历史记录,描述等被删除了,同样,如果不指定,又会多一个悬虚镜像

与save 、load对比

  • save和export

    分别作用于镜像和容器,export一次只能导出一个容器,save可以一次对多个镜像导出

    export的小(合并后的,快照,原有的历史记录等描述性信息会被丢掉),save是原封不动得保留下来

  • import与load

    import导入的是容器包,load加载的是镜相包,但最终都会恢复为镜像

    import恢复的为镜像只包含当前镜像一层,load恢复的镜像与原来分层的是完全相同的(imageid相同)

    import恢复的镜像就是新购剑的镜像,id与原镜像不同。、

    import 可以为导入的镜像指定,load 加载的镜像不能指定。

与docker commit 的对比

  • 相同点:docker export+docker import会将一个容器变为一个镜像,docker commit 也可以将一个容器变一个镜像。”
  • 不同点:docker export+docker import 恢复的镜像仅包含原容器生成的一层分层.commit 生成的镜像中包含容器的原镜像的所有分层信息。”

docker system 命令集

[youzipii@localhost ~]$ docker system --help

Usage: docker system COMMAND

Manage Docker

Commands:
df Show docker disk usage 查看当前磁盘使用情况
events Get real time events from the server
info Display system-wide information
prune Remove unused data

Run 'docker system COMMAND --help' for more information on a command.

df

[youzipii@localhost ~]$ docker system df --help

Usage: docker system df [OPTIONS]

Show docker disk usage

Options:
--format string Format output using a custom template:
'table': Print output in table format
with column headers (default)
'table TEMPLATE': Print output in table format
using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given
Go template.
Refer to https://docs.docker.com/go/formatting/
for more information about formatting output with
templates
-v, --verbose Show detailed information on space usage
[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 4 2.784GB 2.036GB (73%)
Containers 5 0 559.3MB 559.3MB (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B

docker system enents

[root@localhost ~]# docker system events --help

Usage: docker system events [OPTIONS]

Get real time events from the server

Aliases:
docker system events, docker events

Options:
-f, --filter filter Filter output based on conditions provided
--format string Format output using a custom template:
'json': Print in JSON format
'TEMPLATE': Print output using the given
Go template.
Refer to https://docs.docker.com/go/formatting/
for more information about formatting output with
templates
--since string Show all events created since timestamp
--until string Stream events until this timestamp
docker system events
2024-03-15T15:36:48.294313459+08:00 container create 5933b54ec9d2b725ff3b3350804c6ea2919272829651e45097d46ac5826806ee (image=tomcat:8.5.49, name=tom2)

有点像日志监视器,有容器启停之类 的信息它会输出在这里

docker system info

[root@localhost ~]# docker system info
Client: Docker Engine - Community
Version: 25.0.3
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.12.1
...
docker info也行

docker system prune(重点)

[root@localhost ~]# docker system prune --help

Usage: docker system prune [OPTIONS]

Remove unused data

Options:
-a, --all Remove all unused images not just dangling ones 一出所有没在使用的镜像
--filter filter Provide filter values (e.g. "label=<key>=<value>")
-f, --force Do not prompt for confirmation
--volumes Prune anonymous volumes
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5933b54ec9d2 tomcat:8.5.49 "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago tom2
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 12 days ago Up 11 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom
[root@localhost ~]# docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- unused build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
5933b54ec9d2b725ff3b3350804c6ea2919272829651e45097d46ac5826806ee

Total reclaimed space: 5B
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc32e8b34259 tomcat:8.5.49 "catalina.sh run" 12 days ago Up 11 minutes 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp tom

docker create

和docker run基本上差不多,但没有-d选项。-d是后台,因为create创建但不运行,默认都是后台的

[root@localhost ~]# docker create --name tom1 -p 8081:8080 tomcat:8.5.49
6264b6fbe42c8866557c617c52f31894f72ff9920f807e8029e734382e30f67b
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6264b6fbe42c tomcat:8.5.49 "catalina.sh run" 3 seconds ago Created tom1

docker create 命令仅用于创建一个容器,并不会启动容器。该命令没有-d选项,因为 docker create 命令创建的容器默认都是以后台方式来运行的(必须要通过 dockerstart [容器]来启动),除非创建时指定-it

总结

容器基础

​ 深刻理解,容器存在的意义就是为其中的应用提供运行环境:容器运行的意义就是为了运行买中的应用,让应用对外提供服务。所以启动容器的目的就是为了启动并运行容器中的应用。所以容器中的应用运行完毕后,容器就会自动终止。

创建启动

​ 理解 docker run 命令用于创建并启动容器,同时其会运行容器中指定的应用。这个指定的应用要么通过 docker run 中的[command]指定,要么通过容器镜像的 Dockerfile 中的 CMD指令指定。。

​ 掌握容器的两种启动模式:交互模式-it,分离模式-d。。

容器退出命令

exit:退出并终止当前容器

ctrl+p+q:退出但不终止当前容器

容器状态查看命令

docker ps命令中-a、-q、-l、-n选项

容器再进命令

​ 理解 docker exec 与 docker attach 的区别与联系:

docker exec:会新建一个进程来访问容器,一般与-it选项联用,exit命令退出

docker attach:不会新建进程,而是将标准输入和标准输出直接附着在容器进程之上(使用户可以通过键盘来操作容器,使容器的输出可以通过显示器展示给用户),一般不使用选项,但退出时需要考虑exit还是c+q+q

容器内进程查看命令

docker top命令后可携带ps命令的选项

容器日志查看命令

docker logs查看的是容器中应用的运行日志,这个应用是根据容器创建时命令(docker run 或 docker create)中的[cmd]指定,要么通过容器镜像的 Dockerfile 中的 CMD 指令指定。。

容器启停命令

  • ​ 理解以下几点:”容器启动命令启动的是容器本身,但容器在启动的同时会启动一个应用,而这个应用是根据容器创建时命令(docker run 或 docker create)中的[command]指定,或通过容器镜像的Dockerfile 中的 CMD 指令指定。”
  • ​ 容器停止命令停止的是容器本身,但在容器停止之前会先停止容器中的所有进程的运行,也就停止了对外提供服务的应用进程。
  • ​ 暂停命令仅暂停的是容器对外提供服务,容器本身并没有停止运行,所以容器中的应用也就没有停止运行,只不过其不能通过容器再对外提供服务了。
  • 暂停/解除暂停两个命令对 tomcat 容器中的 tomcat 进程的运行没有任何影响,这两个命令的运行并不会记录到 tomcat 的启停日志中。

容器删除和镜像删除

​ 能够区分容器删除与镜像删除命令:容器删除是dockerrm,镜像删除是 docker rmi。它们都有一个选项-f,表示强制删除。镜像的强制删除,其不会强制删除 UP 状态的容器的镜像。

容器与宿主机传递文件

  1. 深刻理解容器本身就是一个文件系统
  2. 理解 docker cp命令就是用于完成从一个文件系统复制到另一个文件系统而己,与容器是否运行无关。
  3. 了解 docker cp命令不支持容器间文件的复制。

提交容器为镜像

了解 docker commit 生成的镜像中是包含原镜像的所有分层历史记录的。

导入/导出容器

  1. 理解导入/导出容器与导入/导出镜像命令的区别与联系。
  2. 理解导入/导出容器与 docker commit 的区别与联系。
  3. 理解 docker export 是对镜像分层合并后视图的文件系统快照的导出,仅包含合并后的一层镜像信息,不包含原镜像的分层历史记录。

Dockerfile

Dockerfile 简介

Dockerfile 是用于构建 Docker 镜像的脚本文件,由一系列指令构成。通过 docker build命令构建镜像时,Dockerfile 中的指令会由上到下依次执行,每条指令都将会构建出一个镜像。这就是镜像的分层。因此,指令越多,层次就越多,创建的镜像就越多,效率就越低所以在定义 Dockerfile 时,能在一个指令完成的动作就不要分为两条。。

指令简介

对于 Dockerfile 的指令,需要注意以下几点:

  1. 指令是大小不敏感的,但惯例是写为全大写
  2. 指令后至少会携带一个参数。
  3. #号开头的行为注释。。

FROM

【语法】FROM [:].

【解析】用于指定基础镜像,且必须是第一条指令;若省略了tag,则默认为latest。

MAINTAINER

【语法】MAINTAINER .

【解析】MAINTAINER 指令的参数填写的一般是维护者姓名和信箱。不过,该指令官方已不建议使用,而是使用 LABEL指令代替。

LABEL

【语法】LABEL= =

【解析】LABEL 指令中可以以键值对的方式包含任意镜像的元数据信息,用于替代MAINTAINER 指令。通过 docker inspect 可査看到 LABEL与 MAINTAINER 的内容。

ENV

【语法 1】ENV .

【解析】用于指定环境变量,这些环境变量,后续可以被 RUN 指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。。

ADD

【语法1】ADD

【语法 2】ADD[““,”“] #路径中存在空格时使用双引号引起来。

【解析】该指令将复制当前宿主机中指定文件 src到容器中的指定目录 dest 中。src 可以是宿主机中的绝对路径,也可以时相对路径。但相对路径是相对于dockerbuild 命令所指定的路径的。src指定的文件可以是一个压缩文件,压缩文件复制到容器后会自动解压为目录:src也可以是一个 URL,此时的 ADD指令相当于 wget 命令;src最好不要是目录,其会将该目录中所有内容复制到容器的指定目录中。dest 是一个绝对路径,其最后面的路径必须要加上斜杠,否则系统会将最后的目录名称当做是文件名的。

FROM centos:7
WORKDIR /opt
ADD zookeeper.tar.gz /opt/add/
COPY zookeeper.tar.gz /opt/copy/
CMD ["/bin/bash"]

image-20240408193507130

可以发现add的是解压后的,而copy是没解压的

COPY

【说明】功能与 ADD指令相同,只不过src不能是 URL。若 src为压缩文件,复制到容器后不会自动解压。”

FROM centos:7
WORKDIR /opt
ADD zookeeper.tar.gz /opt/add
COPY zookeeper.tar.gz /opt/copy
CMD ["/bin/bash"]

image-20240408193751454

没有尾巴的斜杠后,copy变成了重命名,而add则是正常的,如果是改前面的压缩包的路径,在构建镜像时需要注意相对路径,所以我们在构建镜像时最好把需要的文件

WORKDIR

【语法】WORKDIR path.

【解析】容器打开后默认进入的目录,一般在后续的 RUN、CMD、ENTRYPOINT、ADD 等指令中会引用该目录。可以设置多个WORKDIR指令。后续 WORKDIR 指令若用的是相对路径,则会基于之前 WORKDIR 指令指定的路径。在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

RUN

【语法 1】RUN

【解析】这里的就是 shell 命令。docker build 执行过程中,会使用 shell 运行指定的command.

【语法 2】RUN [“EXECUTABLE”,”PARAM1”,”PARAM2”,…].【解析】在 docker build 执行过程中,会调用第一个参数”EXECUTABLE”指定的应用程序运行,并使用后面第二、三等参数作为应用程序的运行参数。

CMD(重要)

【语法 1】CMD [“EXECUTABLE”,”PARAM1”,”PARAM2”,..].

【解析】在容器启动后,即在执行完 docker run后会立即调用执行”EXECUTABLE”指定的可执行文件,并使用后面第二、三等参数作为应用程序的运行参数。”

【语法2】CMD command param1 param2, ….

【解析】这里的 command 就是 shel 命令。在容器启动后会立即运行指定的 shell 命令。。

【语法 3】CMD [“PARAM1”,”PARAM2”,…].【解析】提供给 ENTERYPOINT 的默认参数。”

ARGS

image-20240408201240156

FROM centos:7
ARG name=TOM
RUN echo $name

image-20240408201343187

要注意的是,build-arg是要定义过的变量,改都不行,一定要定义过arg才行

注意:制作镜像时,如果有多个dockerfile,需要用-f参数标记使用哪个dockerfile

例子:

FROM centos:7
CMD ["cal"]

docker built -t mycal:2.0 ./docker build -f Dockerfile -t mycal:2.0 .

执行,可以覆盖,比如在docker run mycal:2.0后面加上date结果就会出现变化,但参数也不能传递,如-y

image-20240408164303105

FROM centos:7
CMD ["/bin/bash", "-c", "cal"]

我要执行的命令是来自命令行,这两个执行的区别是/bin/bash才是你要执行的东西,cal成为了参数,前者是直接执行cal,测试一下把

docker build -f Dockerfile3 -t mycal:3.0 .

image-20240408165326037

FROM centos:7
CMD ["hello,world!"]
ENTRYPOINT ["echo"]

image-20240408170845565

可以看但cmd作为entrypoint的参数执行了

ENTRYPOINT.

【语法 1】ENTRYPOINT [“EXEGUTABLE”,”PARAM1”,”PARAM2”,…]

【解析】在容器启动过程中,即在执行 docker run 时,会调用执行”EXECUTABLE”指定的应用程序,并使用后面第二、三等参数作为应用程序的运行参数。(CMD和它都有的话,执行这个)

【语法2】ENTRYPOlNT command param1 param2,…

【解析】这里的 command 就是 shel 命令。在容器启动过程中,即在执行 docker run 时,会运行指定的 shell 命令。

例子:

FROM centos:7
ENTRYPOINT cal

image-20240408165939812

image-20240408170029994

-y有输出但和date一样不识别

FROM centos:7
ENTRYPOINT ["cal"]

image-20240408170218134

image-20240408170302307

-y是行的,但date会报错了

FROM centos:7
ENTRYPOINT ["/bin/bash","-c","cal"]

image-20240408170435245

又和第一个一样了。

Dockerfile中的[command]或[“EXECUTABLE”]如果是通过CMD指定的,则该镜像的启动命令dockerrun中是不能添加参数[ARG]的。因为Dockerfile中的CMD是可以被命令中的[COMMAND]替代的。如果命令中的IMAGE后仍有内容,此时对于docker daemon 来说,其首先认为是替代用的[COMMAND],如果有两个或两个以上的内容,后面的内容才会认为是[ARG]。所以,添加的-y会报错,因为没有-y这样的[COMMAND]。3

Dockerfile中的[command]或[“EXECUTABLE”]如果是通过CMQ指定的,则该镜像的启动命令dockerrun中是不能添加参数[ARG]的。因为Dockerfile中的CMD是可以被命令中的[COMMAND]替代的。如果命令中的IMAGE后仍有内容,此时对于dockerdaemon来说,其首先认为是替代用[COMMAND],如果有两个或两个以上的内容,后面的内容才会认为是[ARG]。所以,添加的-y会报错,因为没有-y这样的[COMMAND]。

不过,docker daemon 对于 ENTRYPOINT 指定的[command]与[“EXECUTABLE”]的处理方式是不同的。如果是[command]指定的 shell,daemon 会直接运行,而不会与docker run 中的[ARG]进行拼接后运行:如果是[“EXECUTABLE”]指定的命令,daemon则会先与 docker run 中的[ARG]进行拼接,然后再运行拼接后的结果。

结论:无论是CMD还是ENTRYPOINT,使用[“EXECUTABLE”]方式的通用性会更强些。

ONBUILD

【语法】ONBUILD [INSTRUCTION]
【解析】该指令用于指定当前镜像的子镜像进行构建时要执行的指令。

FROM centos:7
ENV WORKPATH /usr/local
WORKDIR $WORKPATH
ONBUILD RUN yum install -y wget
CMD /bin/bash

Dockerfile2

FROM parent:1.0

image-20240408202024812

image-20240408202014168

image-20240408202200083

image-20240408202217208

自己的hello world镜像

scratch镜像

​ 在构建自己的镜像之前,首先要了解一个特殊的镜像 scratch。scratch 镜像是一个空镜像,是所有镜像的 Baselmage(相当于面向对象编程中的 Object类)。scratch 镜像只能在 Dockerfile 中被继承,不能通过 pul 命令拉取,不能 run,也没有 tag。并且它也不会生成镜像中的文件系统层。在 Docker 中,scratch 是一个保留字,用户不能作为自己的镜像名称使用。。

[root@localhost ~]# mkdir hw
[root@localhost ~]# cd hw
[root@localhost hw]# ls
[root@localhost hw]# vim hello.c
[root@localhost hw]# gcc --static -o hello hello.c
[root@localhost hw]# ls
hello hello.c
[root@localhost hw]# ./hello
hello my docker world!
[root@localhost hw]# docker build -t hello-my-world .
[+] Building 0.1s (5/5) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 137B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 865.65kB 0.0s
=> [1/1] ADD hello / 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:74852c0574d8c68375d7bb15fcddbc9b3e106863435bd 0.0s
=> => naming to docker.io/library/hello-my-world
[root@localhost hw]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-my-world latest 74852c0574d8 About a minute ago 865kB
。。。
[root@localhost hw]# docker run hello-my-world
hello my docker world!

自己的centos镜像

FROM centos:7
MAINTAINER youzipii youzipii@123.com
LABEL version="1.0" description="this is a centos 7 image" email="TOM@123.com"

ENV WORKPATH /usr/local
WORKDIR $WORKPATH

RUN yum install -y wget vim net-tools
CMD /bin/bash

ERROR: failed to solve: process “/bin/sh -c yum install -y wget vim net-tools” did not complete successfully: exit code: 1

重启好像就可以,但生产环境,慎用

[root@localhost cts]# docker build -t youzipii:1.0 .
[+] Building 49.0s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 326B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/3] FROM docker.io/library/centos:7 0.0s
=> CACHED [2/3] WORKDIR /usr/local 0.0s
=> [3/3] RUN yum install -y wget vim net-tools 47.3s
=> exporting to image 1.6s
=> => exporting layers 1.6s
=> => writing image sha256:3f62d30f08ddde26d1729b2706c8a7ae9f4e4bbc9171a 0.0s
=> => naming to docker.io/library/youzipii:1.0
[root@localhost cts]# docker run --name ct2 -it youzipii:1.0
[root@81ed05ea8530 local]# pwd
/usr/local
[root@81ed05ea8530 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
#其它信息可以通过
docker inspect xx
#分层信息,FROM不算
[root@localhost cts]# docker history youzipii:1.0
IMAGE CREATED CREATED BY SIZE COMMENT
3f62d30f08dd 6 minutes ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0
<missing> 6 minutes ago RUN /bin/sh -c yum install -y wget vim net-t… 297MB buildkit.dockerfile.v0
.....
[root@localhost ~]# docker run -w /root -it centos7:net-tools
[root@6aaf937d3252 ~]# pwd
/root
[root@6aaf937d3252 ~]# exit
exit
[root@localhost ~]# docker run --name ct2 -it centos7:net-tools
[root@49b72fcb1f16 /]# pwd
/
#可以看到-w可以指定工作目录,不指定则是默认的workdir

如果build相同的镜像,后面的会被看作悬虚镜像

可以构建出新的镜像的方式有:

  1. docker build.
  2. docker commit.
  3. docker import(注意,docker load并没有构建出新的镜像,其与原镜像是同一个镜像).
  4. docker compose.
  5. docker hub中完成Automated Builds.

悬虚镜像

悬虚镜像是指既没有 Repository 又没有 Tag的镜像。当新建了一个镜像后,为该镜像指定了一个已经存在的 TAG,那么原来的镜像就会变为悬空镜像。

为了演示悬虚镜像的生成过程,这里先修改前面定义的 Dockerfile,然后再生成镜像,且生成的新的镜像与前面构建的镜像的名称与 Tag 均相同。

删除悬虚镜像:

悬虚镜像是一种“无用”镜像,其存在只能是浪费存储空间,所以一般都是要删除的对于悬虚镜像的删除,除了可以通过 docker

rmi 进行删除外,还有专门的删除命令 docker image prune。该命令能够一次性删除本地全部的悬空镜像。不过有个前提,就是这些悬虚镜像不能是已经启动了容器的,无论容器是否是退出状态。当然,如果再加上-a选项,则会同时再将没有被任何容器使用的镜像也删除。。

另外,还有一个命令 docker system prune 也可以删除悬虚镜像。只不过,其不仅删除的是悬虚镜像,还有其它系统“无用”内容。。
在删除这个悬虚镜像之前,首先查看其是否启动了容器。如果启动了,则先将容器删除。”

docke system/image prune

image-20240324230130877

docker network

docker0 实现容器互相通信以及容器和宿主机互相通信

docker network ls

查看所有网络

  NETWORK ID     NAME                     DRIVER    SCOPE
6e6425c662ac bridge bridge local
293407e0c5ce cve-2017-10271_default bridge local
743e5e15a2d5 host host local
1ba283749203 none null local

创建网络