当前位置: 首页 > news >正文

Docker从安装开始精通

从虚拟机到容器
1.环境配置的难题
软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:“它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

2.虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

资源占用多,虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
冗余步骤多,虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
启动慢,操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
3.Linux 容器
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

启动快,容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
资源占用少,容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
体积小,容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

4.Docker
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

5.Window Wsl
Wsl安装:https://learn.microsoft.com/zh-cn/windows/wsl/install-manual

列出Wsl正在运行的组件:wsl -l -v --all

Docker实现原理简述
1.进程隔离—Namespace
Linux Namespace(Linux 命名空间)是 Linux 内核(Kernel)提供的功能,它可以隔离一系列的系统资源,如 PID(进程 ID,Process ID)、User ID、Network、文件系统等。

Linux Namespace是在当前运行的系统环境中创建(隔离)另一个进程的运行环境出来,并在此运行环境中将一些必要的系统全局资源进行【虚拟化】。进程可以运行在指定的namespace中,因此,namespace中的每个进程都认为自己拥有所有这些虚拟化的全局资源。

2.资源限制—Linux Cgroups
Docker 容器本质依旧是一个进程,多个 Docker 容器运行时,如果其中一个 Docker 进程占用大量 CPU 和内存就会导致其他 Docker 进程响应缓慢,为了避免这种情况,可以通过 Linux Cgroups 技术对资源进行限制。

Linux Cgroups(Linux Contorl Groups,简称 Cgroups)可以对一组进程及这些进程的子进程进行资源限制、控制和统计的能力,其中包括 CPU、内存、存储、网络、设备访问权限等,通过 Cgroups 可以很轻松的限制某个进程的资源占用并且统计该进程的实时使用情况。

Cgroups 由 3 个组件构成,分别是 cgroup(控制组)、subsystem(子系统)以及 hierarchy(层级树),3 者相互协同作用。

cgroup 是对进程分组管理的一种机制,一个 cgroup 通常包含一组(多个)进程,Cgroups 中的资源控制都以 cgroup 为单位实现。
subsystem 是一组(多个)资源控制的模块,每个 subsystem 会管理到某个 cgroup 上,对该 cgroup 中的进程做出相应的限制和控制。
hierarchy 会将一组(多个)cgroup 构建成一个树状结构,Cgropus 可以利用该结构实现继承等功能
3.分层结构—Union File System
Docker 镜像是一种分层结构,每一层构建在其他层之上,从而实现增量增加内容的功能。

Union File System(简称,UnionFS),它是为 Linux 系统设计的将其他文件系统联合到一个联合挂载点的文件系统服务。UnionFS 使用 branch(分支)将不同文件系统的文件和目录透明地叠加覆盖,形成一个单一一致的文件系统,此外 UnionFS 使用写时复制(Copy on Write,简称,CoW)技术来提高合并后文件系统的资源利用。

Docker 架构
1.基本概念
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

2.概念组成
Docker 镜像(Images)是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container)是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client)通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host)是一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
Docker入门
官方文档

https://docs.docker.com/

Docker Engine:https://docs.docker.com/engine/,Docker核心

Docker Desktop:https://docs.docker.com/desktop/,可视化操作。

Docker Composer:https://docs.docker.com/compose/,编排容器。

拓展

Window Linux子系统:https://docs.microsoft.com/zh-cn/windows/dev-environment/

1.Docker安装
官方文档上有详细的说明,这里以centos7.6作为操作实例。(https://docs.docker.com/engine/install/centos/)

官方建议如果安装过旧版本,先卸载后安装。旧版docker-engine现在被称为docker-ce.

这个可以理解为字符串换行连接符

$ sudo yum remove docker docker-client docker-client-latest docker-common
docker-latest docker-latest-logrotate docker-logrotate docker-engine

Copy
然后配置yum仓库源,命令行开始:

安装yum-utils,一般都有装

$ yum install -y yum-utils

配置仓库源

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

Copy
开始安装最新版本的 Docker Engine、containerd 和 Docker Compose

yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Copy
此命令会安装 Docker,但不会启动 Docker。它还会创建一个 docker组,但是默认情况下它不会将任何用户添加到该组中。

安装完成,查看docker版本信息,命令如下:

$ docker version

或者

$ docker info

Copy
启动docker ,命令如下:

service 命令的用法

$ sudo service docker start

systemctl 命令的用法

$ sudo systemctl start docker

测试安装是否正常

$ docker run hello-world

提示
docker --help 、docker command --help,查看命令的功能说明
Copy
镜像image
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码,运行时(一个程序在运行或者在被执行的依赖)、库,环境变量和配置文件。其实也可以理解为一个文件目录

image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。

image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。

为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。

相关参考

https://blog.csdn.net/sinat_33087001/article/details/123029844

镜像仓库
1.修改镜像仓库源
添加镜像仓库之后下载镜像时会先从镜像仓库进行下载;

以centos为例,编辑/etc/docker/daemon.json文件;

{
“registry-mirrors”: [“https://alzgoonw.mirror.aliyuncs.com”]
}

Copy
然后重启docker:

重载配置

$ systemctl daemon-reload

重启docker

$ systemctl restart docker

查看docker信息

$ docker info
Copy
Window Docker Desktop:

打开Docker Desktop应用程序。
点击屏幕右上角的齿轮图标,打开设置菜单。
在左侧导航栏中选择"Docker Engine"选项。
在编辑器中找到或创建一个JSON配置文件。如果已经存在,请确保它是可编辑状态。
在JSON配置文件中,添加或修改registry-mirrors键的值。将其设置为你想要使用的镜像源地址。如果你想同时使用多个镜像源,可以在该键的值中提供一个逗号分隔的列表。
例如,假设你要使用阿里云的镜像源,你可以将registry-mirrors设置为:“registry-mirrors”: [“https://xxxx.mirror.aliyuncs.com”]
保存并关闭配置文件。
重新启动Docker Desktop,以使配置更改生效。
2.登录仓库 docker login
登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub(https://hub.docker.com/)

登录,不指定地址,默认为官方仓库

$ docker login -u 用户名 -p 密码

Copy
3.退出登录 docker logout

退出指定仓库的登录

$ docker logout [OPTIONS] [SERVER]

Copy
4.搜索镜像 docker search
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 openresty的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 openresty来寻找适合我们的镜像。

[root@VM-0-11-centos ~]# docker search Openresty
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
openresty/openresty OpenResty Official Docker Images - a dynamic… 370 [OK]
ficusio/openresty Minimalist OpenResty image 22 [OK]
3scale/openresty Latest Openresty with redis and some handy p… 16 [OK]

Copy
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
5.拉取镜像 docker pull

拉取指定的镜像(name为上方镜像仓库源名称)

-a :拉取所有 tagged 镜像

name可以是一个在仓库存在的镜像名,也可以是代表镜像的一个远程地址

$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Copy
6.上传仓库 docker push
用于将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。

docker push [OPTIONS] NAME[:TAG]

上传本地镜像myapache:v1到镜像仓库中。

$ docker push myapache:v1

OPTIONS --disable-content-trust :忽略镜像的校验,默认开启

Copy
向指定远程仓库推送镜像

在本地登录到远程仓库:

$ docker login --username=[用户名] -p=[密码] 远程ip:端口

给本地镜像打标签, [远程ip:端口/自定义路径/*]:[版本号] 就是:[标签名:版本号]

$ docker tag [镜像id:标签] [远程ip:端口/自定义路径/*]:[版本号]

推送

$ docker push [远程ip:端口/自定义路径/*]:[版本号]

Copy
实际操作:

$ docker tag hello-world daocloud.io/zter/hello-world:v1
$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 9 weeks ago 1.84 kB
hello-world v1 fce289e99eb9 9 weeks ago 1.84 kB
hello-world v2 fce289e99eb9 9 weeks ago 1.84 kB
daocloud.io/zter/hello-world v1 fce289e99eb9 9 weeks ago 1.84 kB

$ docker push daocloud.io/zter/hello-world:v1

The push refers to a repository [daocloud.io/zter/hello-world]
af0b15c8625b: Pushed
v1: digest: sha256:39bbd4a41b5d3b164632d3b4a295c0db31139992a8fe985f949dac7ccff7aa54 size: 524

Copy
本地镜像管理
1.查看镜像列表 docker images

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

Copy
OPTIONS说明:

-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
–digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
–format :指定返回值的模板文件;
–no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
[root@VM-0-11-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 9 months ago 13.3kB

Copy
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
2.删除镜像 docker rmi

删除指定镜像

$ docker rmi name

Copy
3.创建历史 docker history

$ docker history [OPTIONS] IMAGE

Copy
OPTIONS说明:

-H :以可读的格式打印镜像大小和日期,默认为true;
–no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。

查看本地镜像nice/ubuntu:v3的创建历史。

$ docker history nice/ubuntu:v3

Copy
4.镜像归档 dcoker save

$ docker save [OPTIONS] IMAGE [IMAGE…]

Copy
OPTIONS 说明:

-o :输出到的文件。

将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档

$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

经过测试,导出镜像可以,导出容器不行

导出时通过参数-o指定的值必须是一个文件名,不能是目录名。
Copy
5.镜像导入 dcoker load
导入使用 docker save 命令导出的镜像。

$ docker load [OPTIONS]

Copy
OPTIONS 说明:

–input , -i : 指定导入的文件,代替 STDIN。
–quiet , -q : 精简输出信息。
6.镜像标签 docker tag
标记本地镜像,将其归入某一仓库。

$ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
$ docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

Copy
容器生命周期
1.创建容器 docker create

创建一个容器,类似 docker run -d 命令

$ docker create [OPTIONS] IMAGE [COMMAND] [ARG…]

Copy
docker create 创建的容器并未实际启动,还需要执行 docker start 命令或 docker run 命令以启动容器。docker create 命令常用于在启动容器之前进行必要的设置。 参数类似run。

2.容器运行 docker run

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
Copy
-d, --detach=false 指定容器运行于前台还是后台,默认为 false。
-i, --interactive=false 打开 STDIN,用于控制台交互。
-t, --tty=false 分配 tty 设备,该可以支持终端登录,默认为 false。
-u, --user=“” 指定容器的用户。
-a, --attach=[] 登录容器(必须是以 docker run -d 启动的容器)。
-w, --workdir=“” 指定容器的工作目录。
-c, --cpu-shares=0 设置容器 CPU 权重,在 CPU 共享场景使用。
-e, --env=[] 指定环境变量,容器中可以使用该环境变量。
-m, --memory=“” 指定容器的内存上限。
-P, --publish-all=false 指定容器暴露的端口。
-p, --publish=[] 指定容器暴露的端口。
-h, --hostname=“” 指定容器的主机名。
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录。(-v 主机目录:容器目录)

  • -volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录。
  • -cap-add=[] 添加权限。
  • -cap-drop=[] 删除权限。
  • -cidfile=“” 运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法。
  • -cpuset=“” 设置容器可以使用哪些 CPU,此参数可以用来容器独占 CPU。
  • -device=[] 添加主机设备给容器,相当于设备直通。
  • -dns=[] 指定容器的 dns 服务器。
  • -dns-search=[] 指定容器的 dns 搜索域名,写入到容器的 /etc/resolv.conf 文件。
  • -entrypoint=“” 覆盖 image 的入口点。
  • -env-file=[] 指定环境变量文件,文件格式为每行一个环境变量。
  • -expose=[] 指定容器暴露的端口,即修改镜像的暴露端口。
  • -link=[] 指定容器间的关联,使用其他容器的 IP、env 等信息。
  • -lxc-conf=[] 指定容器的配置文件,只有在指定 --exec-driver=lxc 时使用。
  • -name=“” 指定容器名字,后续可以通过名字进行容器管理,links 特性需要使用名字。
  • -network=“bridge” 器网络设置,bridge 使用 docker daemon 指定的网桥;host 容器使用主机的网络;container:NAME_or_ID 使用其他容器的网路,共享 IP 和 PORT 等网络资源;none 容器使用自己的网络(类似- -network=bridge),但是不进行配置。
  • -privileged=false 指定容器是否为特权容器,特权容器拥有所有的 capabilities。
  • -restart=“no” 指定容器停止后的重启策略: no:容器退出时不重启,on-failure:容器故障退出(返回值非零)时重启, always:容器退出时总是重启。
  • -rm=false 指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)。
  • -sig-proxy=true 设置由代理接受并处理信号,但是 SIGCHLD、SIGSTOP 和 SIGKILL 不能被代理。
    示例:

docker run -idt -v /:/home/lnmp --network host centos:centos7 /bin/bash

COMMAND、ARG…
代表容器运行之后,要执行的命令行命令和参数
Copy

运行容器,并进入bash

$ docker run -it nginx:latest /bin/bash

Copy
3.启动容器docker start

$ docker start [OPTIONS] CONTAINER [CONTAINER…]

Copy
Options:

-a, --attach ,连接容器的标准输出、标准错误
–detach-keys,覆盖分离容器的键的顺序
-i, --interactive,连接容器的标准输入
4.停止容器 docker stop

$ docker stop [OPTIONS] CONTAINER [CONTAINER…]

Copy
Options:

-t, --time ,在停止之前等待的秒数,默认为10s;
5.重启容器docker restart

$ docker restart contanier

Copy
6.强制停止 docker kill

$ docker kill container

Copy
7.删除容器 docker rm

docker rm [OPTIONS] CONTAINER [CONTAINER…]

Copy
Option参数:

-f 通过 SIGKILL 信号强制删除一个运行中的容器。
-l 移除容器间的网络连接,而非容器本身。
-v:-v 删除与容器关联的卷。
8.暂停、恢复 docker pause/unpause
暂停、恢复容器内的进程的运行。

$ docker pause CONTAINER [CONTAINER…]
$ docker unpause CONTAINER [CONTAINER…]

Copy
9.执行命令 docker exec
docker exec 用于在一个运行中的容器内执行command。

docker exec [OPTIONS] CONTAINER COMMAND [ARG…]

Copy
OPTIONS说明:

–detach, -d 后台运行模式,在后台执行命令相关命令。
–detach-keys 覆盖容器后台运行的一些参数信息。
–env, -e 设置环境变量。
–interactive, -i 展示容器输入信息 STDIN。
–privileged 为命令提供一些扩展权限。
–tty, -t 命令行交互模式。
–user, -u 设置用户名。

在指定容器打开一个bash环境的交互式终端

$ docker exec -i -t mynginx /bin/bash

Copy
容器运维
1.列出容器 docker ps

$ docker ps [OPTIONS]

Copy
OPTIONS说明:

无参 默认显示正在运行的容器。
-a 显示所有的容器,包括未运行的。
-f 根据条件过滤显示的内容。

  • -format 指定返回值的模板文件。
    -l 显示最近创建的容器。
    -n 列出最近创建的n个容器。
  • -no-trunc 不截断输出。
    -q 静默模式,只显示容器编号。
    -s 显示总的文件大小。
    $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Copy
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。状态有7种:created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)、paused(暂停)、exited(停止)、dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcpudp)。
NAMES: 自动分配的容器名称。
2.查看容器内正在运行的进程信息
容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程

$ docker top CONTAINER [ps OPTIONS]

Copy
3.连接容器 docker attach
关联容器的标准输入、标准输出、错误输出到容器到本机

$ docker attach [OPTIONS] CONTAINER

Copy
options 说明

–detach-keys 覆盖用于分离容器的键序列
–no-stdin 不要附加标准输入
–sig-proxy 所有接收到的信号代理到进程
4.阻塞容器 docker wait
阻塞容器运行,直到容器停止运行,同时输出退出的状态码,通过状态码判断容器的退出状态。

$ docker wait CONTAINER [CONTAINER…]

Copy
5.端口映射 docker port
docker port 命令可以用于列出指定的 Docker容器 的端口映射,或者将容器里的端口映射到宿主机。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。

$ docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
$ docker port mysql
$ docker port mysql 3306/tcp

Copy
6.元数据 docker inspect

$ docker inspect [OPTIONS] NAME|ID [NAME|ID…]

Copy
OPTIONS说明:

-f 指定返回值的模板文件。
-s 显示总的文件大小。

  • -type 为指定类型返回JSON。
    7.容器重命名 docker rename

$ docker rename CONTAINER NEW_NAME

Copy
8.统计 docker stats
docker stats 命令可以用于动态显示 Docker容器 的资源消耗情况,包括:CPU、内存、网络I/O。docker stats命令也可以指定已停止的容器,但是不会返回任何信息。

docker stats [options] [container…]

Copy
OPTIONS参数:

  • -all, -a 查看所有容器信息(默认显示运行中的)。
  • -format Go模板展示镜像信息。
  • -no-stream 不展示容器的一些动态信息。
    9.更新配置docker update

docker update [OPTIONS] CONTAINER [CONTAINER…]

Copy
OPTIONS说明:

  • -cpu-shares 更新 cpu-shares。
  • -kernel-memory 更新内核内存限制。
  • -memory 更新内存限制。
  • -restart 更新重启策略。
    10.容器导出 docker export
    将 Docker容器 里的文件系统作为一个 tar 归档文件导出。docker export 命令后面的 CONTAINER 可以是容器Id,或者是容器名。

$ docker export [OPTIONS] CONTAINER

Copy
OPTIONS说明:

-o 将输入内容写到文件。
11.导入镜像 docker import
用于导入export导出的镜像归档文件。

$ docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
$ docker images nicen/ubuntu:v4
Copy
区别、侧重点
参考

https://blog.csdn.net/JineD/article/details/118761569

1.docker save和docker export的区别
docker save保存的是镜像(image)
docker export保存的是容器(container)
2.docker load和docker import的区别
docker load用来载入镜像包;
docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名;
docker import可以为镜像指定新名称。;
3.打包镜像和打包容器的区别
从文件的角度来说,打包容器仅仅会打包容器的当前状态(类似服务器快照),会丢弃所有的历史记录和元数据信息。而打包镜像则是导出完整的历史记录和元信息。

Docker日志
1.实时事件 docker events
从服务器获取实时事件

docker events [OPTIONS]

Copy
OPTIONS说明:

-f :根据条件过滤事件;
–since :从指定的时间戳后显示所有事件;
–until :流水时间显示到指定的时间为止;
2.历史版本 dcoker history
打印出指定的 Docker镜像 的历史版本信息。

docker history [OPTIONS] IMAGE

Copy
OPTIONS说明:

docker history -H, --human 以可读的格式打印镜像大小和日期,默认为 true。
docker history --no-trunc 显示完整的提交记录。
docker history -q, --quiet 仅列出提交记录 ID。
3.输出日志 docker log
获取容器运行时输出的日志信息

docker logs [OPTIONS] CONTAINER

Copy
docker logs --details 显示 log 信息的额外的详细信息。docker logs -f, --follow 跟踪日志输出。docker logs --since 显示某个开始时间的所有日志。docker logs --tail 仅列出最新 N 条容器日志。
docker logs -t, --timestamps 显示时间戳。
Docker rootfs命令
1.docker commit
docker commit 命令用于根据 Docker容器 的更改创建一个新的 Docker镜像。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。

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

Copy
OPTIONS说明:

-a, --author string 作者。
-c, --change list 应用 dockerfile 指令来创建图像。
-m, --message string 提交信息。
-p, --pause 提交期间暂停容器(默认为true)。
2.docker cp

从容器复制到宿主机

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

从宿主机复制到容器

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

Copy
OPTIONS说明:

-a, --archive 归档模式(复制所有UID / GID信息)
-L, --follow-link 总是跟在源地址符号链接
命令说明

docker cp 命令类似于 Linux 中的 cp -a 命令,递归复制目录下的所有子目录和文件。
docker cp 命令中的 - 表示通过标准输入/输出设备以流的方式读取或写入 tar 文件。
本地文件系统中的路径可以是绝对路径,也可以是相对路径,相对于当前命令执行的路径。
容器中的路径都是相对容器的 / 根路径。
docker cp 命令操作的容器可以是在运行状态,也可以是停止状态。
docker cp 命令不能复制 /proc、 /sys、 /dev、 tmpfs 和容器中 mount 的路径下的文件。
3.docker diff
docker diff 命令用于比较一个 Docker容器 不同版本提交的文件差异。该命令后面的 CONTAINER 可以是容器Id,或者是容器名。

docker diff命令会列出 3 种容器内文件状态变化(A - Add, D - Delete, C - Change )的列表清单。

$ docker diff CONTAINER

Copy
制作镜像
1.docker build
docker build 命令可以用来使用 Dockerfile 创建镜像。

$ docker build [OPTIONS] PATH | URL | -

Copy
相关文档:https://www.runoob.com/docker/docker-build-command.html、https://www.runoob.com/docker/docker-dockerfile.html

2.docker Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

相关说明:https://www.runoob.com/docker/docker-dockerfile.html

3.docker composer
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

相关说明:https://www.runoob.com/docker/docker-compose.html

Docker容器网络
原文

https://blog.csdn.net/qq_42418169/article/details/119102917

1.介绍
容器网络实质上也是由Docker为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP协议栈、端口套接字、IP路由表、防火墙等等与网络相关的模块。

Docker入门到精通,从安装开始,持续记录

Docker

Docker网络中有三个核心概念:沙盒(Sandbox)、网络(Network)、端点(Endpoint)。

沙盒,提供了容器的虚拟网络栈,也即端口套接字、IP路由表、防火墙等内容。隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
网络,可以理解为Docker内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。Docker的虚拟网络和宿主机网络是存在隔离关系的,其目的主要是形成容器间的安全通讯环境。
端点,位于容器或网络隔离墙之上的洞,主要目的是形成一个可以控制的突破封闭的网络环境的出入口。当容器的端点与网络的端点形成配对后,就如同在这两者之间搭建了桥梁,便能够进行数据传输了。
这三者形成Docker网络核心模型,也就是容器网络模型(Container Network Model)。

2.Docker的网络实现
容器网络模型为容器引擎提供了一套标准的网络对接范式,Docker中,实现这套范式的是Docker所封装的libnetwork模块。

Docker官方提供了五种Docker网络驱动,分别是:Bridge Driver、Host Driver、Overlay Driver、MacLan Driver、None Driver。Bridge和 Overlay在开发中使用频率较高。

host(主机模式) 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址
bridge(桥梁模式) 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。
overlay(覆盖模式) Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。
container(容器模式) 在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
none(无网络模式) 该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
3.默认网络(docker 0)
当你安装Docker时,它会自动创建三个网络。你可以使用docker network ls命令列出这些网络:

C:UsersAdmin>docker network ls
NETWORK ID NAME DRIVER SCOPE
ff3025b2bb75 bridge bridge local
4db4c96b8fad host host local
075e1e639650 none null local

Copy
Docker内置这三个网络,运行容器时,你可以在run运行容器时使用–network标志来指定容器应连接到哪个网络。

不指定network时,默认将容器连接到bridge网络。

4.host网络模式
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。

Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。

一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

5.bridge网络模式
相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

Docker 默认的 bridge 网络是不支持通过 Docker DNS 服务进行域名解析的,自定义桥接网络是可以的。

5.1Bridge模式的拓扑
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。

虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。

如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。

Docker入门到精通,从安装开始,持续记录

Dokcer

Docker完成以上网络配置的过程大致是这样的:

在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
6.docker overlay模式
Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。

因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。

要想使用Docker原生Overlay网络,需要满足下列任意条件

Docker 运行在Swarm
使用键值存储的Docker主机集群
Docker Network

docker network inspect # 根据网络的ID展示网络的详细信息
docker network ls # 展示所有的网络,以列表形式
docker network create # 创建一个自定义网络
docker network connect # 连接一个容器到指定网络上
docker network disconnect # 让一个容器从指定网络上断开
docker network prune # 删除所有未使用的网络
docker network rm # 根据网络的ID,删除一个或多个网络

Copy
Docker Machine
Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在虚拟机中安装 Docker。我们还可以通过 docker-machine 命令来管理这些虚拟机和 Docker。

相关文章:

Docker从安装开始精通

从虚拟机到容器 1.环境配置的难题 软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户计算机的环境都不相同&#xff0c;你怎么知道自家的软件&#xff0c;能在那些机器跑起来&#xff1f; 用户必须保证两件事&#xff1a;操作系统的设置&#xff0c;各种库和组件的安装…...

MFC:初步理解序列化与反序列化(含代码实现)

序列化与反序列化是MFC将对象数据以二进制数据流的形式进行存储和读取的机制&#xff0c;读、写的效率很高。通过序列化与反序列化&#xff0c;可以将程序中对象在内存中数据保存到文件 (磁盘) 或者从文件 (磁盘) 中读取到内存以恢复对象数据&#xff0c;从而实现程序对数据的持…...

python程序控制结构

文章目录 一、python程序控制结构介绍二、顺序结构2.1、print()函数2.2、end参数2.3、input()函数 三、选择结构3.1选择结构的用途 四、循环结构4.1循环结构的构造4.1.1、循环结构的三个要素4.1.2、循环结构的一个要求4.1.3、循环结构的一个关系 4.2、循环语句4.2.1、while语句…...

【GD32】04 - Timer定时器

GD32中的定时器 GD32E230中有七个定时器&#xff0c;六种类型&#xff0c;其中通用的L4版本有两个&#xff0c;其他类型的各一个。 那我们就以通用L4这个类型来敲代码&#xff0c;其他流程是通用的。 通用L4 虽然每种类型的定时器都有自己的结构框图&#xff0c;但是其实大差…...

Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {buy1, sell1 : -prices[0], 0buy2, sell2 : -prices[0], 0for i : 1; i < len(prices); i {buy1 max(buy1, -prices[i])sell1 max(sell1, buy1prices[i])buy2 max(buy2, sell1-prices[i])sell2 m…...

Leetcode2028. 找出缺失的观测数据

Every day a Leetcode 题目来源&#xff1a;2028. 找出缺失的观测数据 解法1&#xff1a;模拟 统计当前 m 个元素的总和 curSum sum(rolls)&#xff0c;总共 mn 个元素和为 total (m n) * mean。 排除 2 种情况&#xff1a; total - curSum > 6 * n&#xff1a;n 个…...

如何在CentOS中合理划分磁盘空间以优化系统性能

目录 前言 理想的分区方案 为什么需要单独分区 安全性 性能 管理和维护 稳定性和可靠性 升级和兼容性 结论 前言 在进行CentOS系统的安装和配置时&#xff0c;合理划分磁盘空间是确保系统性能、安全性和易于管理的关键步骤。本文将探讨如何根据系统的硬件配置和预期用途…...

算法(十一)贪婪算法

文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法&#xff08;Greedy&#xff09;是一种在每一步都采取当前状态下最好的或者最优的选择&#xff0c;从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断&#xff0c…...

Rust之函数式语言特性:迭代器和闭包(一):概述

开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感&#xff0c;其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…...

配置资源管理

一 Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 1 有三种类型&#xff1a; kubernetes.io/service…...

unity2020打包webGL时卡进程问题

我使用的2020.3.0f1c1&#xff0c;打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里&#xff0c;而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题&#xff0c;我尝试过一直卡在这里会如何&#xff0c;结果还真打包成功了。只是打包一个空场景需要20…...

云原生架构相关技术_3.无服务器技术

1.技术特点 1.1面向特定领域的后端云服务&#xff08;BaaS&#xff09; 随着以Kubernetes为代表的云原生技术成为云计算的容器界面&#xff0c;Kubernetes成为云计算的新一代操作系统。面向特定领域的后端云服务&#xff08;BaaS&#xff09;则是这个操作系统上的服务API&…...

Leetcode:Z 字形变换

题目链接&#xff1a;6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;二维矩阵的直接读写&#xff09; 解决办法&#xff1a;直接依据题目要求新建并填写一个二维数组&#xff0c;最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并…...

Python 3 判断文件是否存在

1 使用os.path模块 import osfile_path hello.txtif os.path.exists(file_path):print(f"文件 {file_path} 存在。") else:print(f"文件 {file_path} 不存在。") 2 使用pathlib模块 from pathlib import Pathfile_path Path(word.txt)if file_path.ex…...

(深度学习记录)第TR3周:Transformer 算法详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文本的输入处理中&#xff0c;transformer会将输入文本序列的每个词转化为一个词向量&#xff0c;我们通常会选择一个合适的长度作为输入…...

谷神前端组件增强:自定义列

初始化 $gp.customColumn {}initColumnPool /*** initColumnPool* 初始化列池* * param prefix 前缀* param length 长度* * return Array 列ID数组* */ function initColumnPool (prefix, length) {return Array.from({length}, (value, index) > prefix index) } self…...

31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)

ESP32-S3-WIFI 事件标记组 介绍 在ESP32-S3的WiFi驱动程序中&#xff0c;事件标记组&#xff08;Event Group&#xff09;是一个非常重要的概念。它是FreeRTOS中的一种同步机制&#xff0c;用于在任务之间传递和同步事件。在WiFi驱动程序中&#xff0c;我们使用事件标记组来通…...

构建企业级AI私有知识库

一、引言 在当今竞争激烈的市场环境中&#xff0c;企业为了保持竞争优势&#xff0c;需要高效地管理和利用内部知识资源。构建一个企业级AI私有知识库&#xff0c;不仅可以集中存储和管理企业知识&#xff0c;还能通过人工智能技术实现知识的智能化处理和利用。本文将详细介绍…...

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题&#xff1a; 一看这不是杨氏矩阵嘛&#xff0c;接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知&#xff1a; …...

陪玩小程序都需要怎么做?

开发陪玩小程序需要进行全面的需求分析、功能规划、技术选型、界面设计等一系列步骤。陪玩小程序作为一种新兴的网络服务平台&#xff0c;为用户提供了寻找游戏伙伴、预约陪玩服务等功能&#xff0c;满足了用户在游戏领域的社交互动和技能提升需求。具体分析如下&#xff1a; 需…...

postgressql——子事务可见性判断 性能问题(8)

子事务可见性判断 & 性能 测试SQL BEGIN; PREPARE sel(integer) ASSELECT count(*)FROM contendWHERE id BETWEEN $1 AND $1 + 100; PREPARE upd(integer) ASUPDATE contend SET val = val + 1WHERE id IN ($1, $1 + 10, $1 + 20, $1 + 30);SAVEPOINT a; \set rnd random…...

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头

20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头 2024/5/31 20:04 USB摄像头分辨率&#xff1a;1080p&#xff08;1920x1080&#xff09; 默认编译Buildroot的SDK即可点亮USB摄像头。v4l2-ctl --list-devices v4l2-ctl --list-formats-ext -d /dev/video74 …...

从0开始学统计-什么是回归?

1.什么是回归&#xff1f; 回归&#xff08;Regression&#xff09;是统计学中一种用于探索变量之间关系的分析方法。它主要用于预测一个或多个自变量&#xff08;输入变量&#xff09;与因变量&#xff08;输出变量&#xff09;之间的关系。在回归分析中&#xff0c;我们尝试根…...

Element-ui使用上传时弹框选择文件类型

实现效果 1&#xff0c;点击上传&#xff0c;上传文件&#xff1b; 2&#xff0c;选择文件&#xff1b; 3&#xff0c;弹框选择文件类型&#xff1b; 4&#xff0c;选择类型后确定上传&#xff1b; 一&#xff0c;上传 跳过&#xff1b; 二&#xff0c;定义弹框下拉框…...

原生小程序一键获取手机号

1.效果图 2.代码index.wxml <!-- 获取手机号 利用手机号快速填写的功能&#xff0c;将button组件 open-type 的值设置为 getPhoneNumber--><button open-type"getPhoneNumber" bindgetphonenumber"getPhoneNumber">获取手机号</button> …...

ARM虚拟机安装OMV

OMV(OpenMediaVault)是基于 Debian GNU/Linux 的网络连接存储&#xff08;network attached storage&#xff0c;NAS&#xff09;解决方案。它包含 SSH、(S) FTP、SMB/CIFS、DAAP 媒体服务器、rsync、 BitTorrent 等很多种服务。它可用于 x86-64 和 ARM 平台。 在x86-64平台上&…...

【协议开发系列】梳理关于TCP和UDP两种协议的区别和使用场景

起源 前二天项目上在核对外部对接服务的五元组列表的时候&#xff0c;有一位客户提问对于同样的服务同时支持tcp和udp二种方式&#xff0c;有什么优点和缺点&#xff0c;应该如何选择&#xff1f;这个问题突然让我愣了一下&#xff0c;确实好久没有“温故”了&#xff0c;相关…...

vue blob实现自定义多sheet数据导出到excel文件

背景&#xff1a;最近vue项目遇到一个需求&#xff0c;就是需要将多个表格分成不同sheet页并导出&#xff0c;之前的工具类只能导出一个sheet页&#xff0c;所以在原有的基础上&#xff0c;调整一下&#xff0c;让它支持多sheet导出。 vue blob文件流&#xff0c;这个肯定要的…...

Python—面向对象小解(3)

一、多态 多态指的是一类事物的多中形态 相同的方法&#xff0c;产生不同的执行结果 运算符 * 的多态 int int 加法计算 str str 字符串拼接 list list 列表的数据合并 在python中可以使用类实现一个多态效果 在python中使用重写的方式实现多态 &#xff08;1&#xff09;定…...

Nginx超时时间

Nginx是一款自由、开源、高性能的HTTP和反向代理服务器&#xff0c;它可以通过不同的设置来提高网站的性能和安全性。其中&#xff0c;设置Nginx超时时间非常重要&#xff0c;因为它将直接影响网站的响应速度和用户体验。本文将从多个方面详细阐述Nginx超时时间的设置方法与注意…...

Imgs,GT,Edge,Gradient_all,Gradient_Foreground

保存一下&#xff1a; 做个记录&#xff1a; import cv2 import os import numpy as np# 对整张图片做canny检测 得到纹理图 def canny_all(input_path, output_path):# 遍历文件夹中的所有文件for filename in os.listdir(input_path):# 构造完整的文件路径image_path os.p…...

自学成才Flutter 弹性布局、线性布局

本文我们要介绍 Flutter 中布局 Widget&#xff0c;包括弹性布局、线性布局 流式布局和层叠布局。 Flutter中文网 Flutter开发 一、弹性布局--Flex Flex 类似 Android 中的 FlexboxLayout&#xff0c;和 Expanded 配合使用可以实现子Widget 按照一定比例来分配父容器空间。 使…...

Part 3.1 深度优先搜索

深度优先搜索&#xff08;DFS&#xff09;&#xff0c;即按照深度优先的顺序搜索的算法。 深度优先搜索一般使用栈来实现。 [USACO1.5] 八皇后 Checker Challenge 题目描述 一个如下的 6 6 6 \times 6 66 的跳棋棋盘&#xff0c;有六个棋子被放置在棋盘上&#xff0c;使得…...

前端Vue小兔鲜儿电商项目实战Day03

一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件&#xff0c;准备最简单的模板&#xff0c;分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …...

ORACLE 查询SQL优化

1 使用EXPLAIN PLAN 使用EXPLAIN PLAN查看查询的执行计划&#xff0c;这可以帮助你理解查询是如何被Oracle执行的。基于执行计划&#xff0c;你可以确定是否存在索引缺失、不必要的全表扫描等问题。 以下是几种使用EXPLAIN PLAN的方法&#xff1a; 使用EXPLAIN PLAN FOR: 你可以…...

Ansible03-Ansible Playbook剧本详解

目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包&#xff0c;安装软件包&#xff0c;启动服务5.3.3.1 任务拆解…...

Qt-qrencode生成二维码

Qt-qrencode开发-生成二维码&#x1f4c0; 文章目录 Qt-qrencode开发-生成二维码&#x1f4c0;[toc]1、概述&#x1f4f8;2、实现效果&#x1f4bd;3、编译qrencode&#x1f50d;4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…...

长安链使用Golang编写智能合约教程(三)

本篇主要介绍长安链Go SDK写智能合约的一些常见方法的使用方法或介绍 资料来源&#xff1a; 官方文档官方示例合约库 官方SDK接口文档 教程一&#xff1a;智能合约编写1 教程二&#xff1a;智能合约编写2 一、获取参数、获取状态、获取历史记录的方法解析 注意&#xff01; …...

Vercel deploy- Nextjs project error-URL link-env variable

Vercel deploy- Nextjs project error-URL link-env variable Error Check Database URL Check next-auth URL NEXTAUTH_URLhttps://yourappname.vercel.app/ 依次排查可能性 Application error: a server-side exception has occurred (see the server logs for more in…...

Java | Leetcode Java题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProfit(int[] prices) {int n prices.length;int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 Math.max(buy1, -prices[i]);sell1 Math.max(sell1, b…...

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

Redis实现延迟队列

最近用到一个延迟消息的功能&#xff0c;第一时间想到使用MQ或者MQ的插件&#xff0c;因为数据量不大&#xff0c;所以尝试使用Redis来实现了&#xff0c;毕竟Redis也天生支持类似MQ的队列消费&#xff0c;所以&#xff0c;在这里总结了一下Redis实现延迟消息队列的方式。 一、…...

如何准确查找论文数据库?

在学术研究过程中&#xff0c;查找相关论文是获取最新研究成果、支持自己研究的重要途径。准确查找论文数据库不仅可以节省时间&#xff0c;还能确保找到高质量的学术资源。本文将介绍一些有效的方法和策略&#xff0c;帮助您准确查找论文数据库。 1. 选择合适的数据库 不同的…...

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)

What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件&#xff08;IStream 版本&#xff09; 上一次&#xff0c;我们看…...

【FPGA】Verilog语言从零到精通

接触fpga一段时间&#xff0c;也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇&#xff1a;Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架&#xff1a;模块的结构 类比&#xff1a;c语言的基础…...

unity打包的WebGL部署到IIS问题

部署之后会出错&#xff0c;我遇到的有以下几种&#xff1b; 进度条卡住不动 明明已经部署到了IIS上&#xff0c;为什么浏览网页的时候还是过不去或者直接报错。 进度条卡住不动的问题其实就是wasm和data的错误。 此时在浏览器上按F12进入开发者模式查看错误&#xff08;下图…...

GPT-4o:人工智能的新里程碑

GPT-4o&#xff0c;作为OpenAI最新推出的人工智能技术&#xff0c;无疑在人工智能领域掀起了新一轮的浪潮。这款新型的语言模型不仅继承了GPT系列的核心优势&#xff0c;更在多个方面实现了突破性的进展。以下&#xff0c;我们将从版本间的对比分析、GPT-4o的技术能力以及个人整…...

发现一个ai工具网站

网址 https://17yongai.com/ 大概看了下&#xff0c;这个网站收集的数据还挺有用的&#xff0c;有很多实用的ai教程。 懂ai工具的可以在这上面找找灵感。...

第二十五章新增H5基础(以及视频~兼容)

1.HTML5中新增布局标签 HTML5新增了页眉&#xff0c;页脚&#xff0c;内容块等文档结构相关标签&#xff0c;可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题&#xff0c…...

[英语单词] production quality

Our goal is to implement a production quality switch platform that supports standard management interfaces and opens the forwarding functions to programmatic extension and control. 说在openswitch的文档里有说这两词&#xff0c;含义是产品质量。是production修…...