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

Docker完整技术汇总

Docker

背景引入

  • 在实际开发过程中有三个环境,分别是:开发环境、测试环境以及生产环境,假设开发环境中开发人员用的是jdk8,而在测试环境中测试人员用的时jdk7,这就导致程序员开发完系统后将其打成jar包发给测试人员后,测试人员由于环境不同而导致无法运行。

    在这里插入图片描述

  • 此时如果开发人员将打好的jar包以及环境一起放到一个容器中,然后将容器发给测试人员,此时测试人员就不会因为环境不同而无法运行程序。这样也就规避了软件跨环境迁移问题

    在这里插入图片描述

Docker架构

在这里插入图片描述

  • 如图所示,Docker主要分为三部分
    • Clients:客户端
      • Docker客户端用来向Docker发送命令
      • Docker客户端会随着Docker的安装而安装
    • Hosts:Docker核心
    • Registries:Docker远程仓库
  • 在Docker核心中有两部分:local host本机以及remote host远程机器
    • Docker在本机安装完之后,会以deamon守护进程的形式存在(即会在后台运行的进程)
    • 该守护进程中有两部分
      • image:镜像
      • container:容器
  • 镜像均来源于Docker远程仓库,该仓库主要有两种
    • 官方提供的仓库Docker Hub
    • 自己搭建的私有仓库Private registry

Docker基础定义

在这里插入图片描述

  • Docker:Docker是一种容器技术,解决软件跨环境迁移问题

    • 它可以帮助我们下载应用镜像,创建并运行镜像的容器。从而达到快速部署应用(即它可以让开发者打包他们的应用以及依赖包到一个轻量级的、可移植的容器中,然后发布到任意流行的Linux机器上)
  • 镜像:将应用所需的系统函数库、依赖、配置等与应用一起打包得到的就是镜像

    • Docker安装应用时会自动搜索并下载应用镜像(image)
    • 镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub
    • 注意:镜像可以让我们快速跨操作系统部署应用而忽略其运行环境、配置,是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖等
  • 容器:Docker会在运行镜像时创建一个相互隔离环境,称为容器

    • 容器使用的是沙箱机制,相互隔离,性能开销极低
  • 镜像与容器的关系

    • 它俩就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,而容器是镜像运行时的实体
    • 容器可以被创建、启动、暂停、停止、删除等等

CentOS7安装Docker

  • Step1: 首先如果系统中已经存在旧的Docker,则先卸载:

    yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce
    
  • Step2: 安装yum工具

    yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken
    
  • Step3: 配置Docker的yum源

    yum-config-manager --add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
    
    yum makecache fast
    
  • Step4: 安装Docker

    yum install -y docker-ce
    
  • Step5: Docker启动与校验

    # 启动Docker
    systemctl start docker# 停止Docker
    systemctl stop docker# 重启
    systemctl restart docker# 设置开机自启
    systemctl enable docker# 执行docker ps命令,如果不报错,说明安装启动成功
    docker ps
    

Docker配置镜像加速(以阿里云为例)

  • Step1: 创建目录mkdir -p /etc/docker

  • Step2: 访问阿里官网在首页的产品中,找到阿里云的容器镜像服务

    在这里插入图片描述

    在这里插入图片描述

  • Step3: 配置镜像加速

    在这里插入图片描述

    在这里插入图片描述

    # 注意把其中的镜像加速地址改成你自己的
    tee /etc/docker/daemon.json <<-'EOF'
    {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://st5sw75p.mirrorcgrs572.aliyuncs.com","https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://docker.jsdelivr.fyi","https://dockertest.jsdelivr.fyi","https://mirror.aliyuncs.com","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.mirrors.ustc.edu.cn","https://mirror.iscas.ac.cn","https://docker.rainbond.cc"]
    }
    EOF
    
  • Step4: 重新加载配置systemctl daemon-reload

  • Step5: 重启Dockersystemctl restart docker

问题

在这里插入图片描述

  • 在使用yum安装时若包如图所示错误,则解决步骤如下

    • 通过vi /etc/yum.repos.d/CentOS-Base.repo打开文件CentOS-Base.repo,然后将文件中的镜像替换为阿里镜像,文件内容更改如下:

      # CentOS-Base.repo
      #
      # The mirror system uses the connecting IP address of the client and the
      # update status of each mirror to pick mirrors that are updated to and
      # geographically close to the client.  You should use this for CentOS updates
      # unless you are manually picking other mirrors.
      #
      # If the mirrorlist= does not work for you, as a fall back you can try the 
      # remarked out baseurl= line instead.
      #
      #[base]
      name=CentOS-$releasever - Base - mirrors.aliyun.com
      failovermethod=priority
      baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
      gpgcheck=1
      gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#released updates 
      [updates]
      name=CentOS-$releasever - Updates - mirrors.aliyun.com
      failovermethod=priority
      baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
      gpgcheck=1
      gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#additional packages that may be useful
      [extras]
      name=CentOS-$releasever - Extras - mirrors.aliyun.com
      failovermethod=priority
      baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
      gpgcheck=1
      gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#additional packages that extend functionality of existing packages
      [centosplus]
      name=CentOS-$releasever - Plus - mirrors.aliyun.com
      failovermethod=priority
      baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
      gpgcheck=1
      enabled=0
      gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7#contrib - packages by Centos Users
      [contrib]
      name=CentOS-$releasever - Contrib - mirrors.aliyun.com
      failovermethod=priority
      baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
      gpgcheck=1
      enabled=0
      gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
      
    • 执行以下两个命令刷新重载即可

      yum clean all
      yum makecache
      

Docker命令

Docker服务相关命令

服务相关命令解释
systemctl start docker启动Docker服务
systemctl status docker查看已经启动的Docker服务的状态
systemctl stop docker停止Docker服务
systemctl restart docker重启Docker服务
systemctl enable docker设置Docker为开机自启动

在这里插入图片描述

Docker的Image镜像相关命令

在这里插入图片描述

注意:此处只列举常用镜像命令,其余可详见官方文档

命令说明文档地址
docker images查看本地镜像docker images
docker search + 镜像名查看Docker库是否有对镜像
docker pull + 镜像名拉取镜像docker pull
docker push推送镜像到DockerRegistrydocker push
docker rmi删除本地镜像docker rmi
docker rmi f强制删除本地镜像
docker build构建镜像。详见自定义镜像部分内容
  • docker images -q:只显示所有镜像的id

  • docker search + 镜像名查看docker官方镜像时无法连接成功,但是可以直接docker pull + 镜像名来拉取镜像,原因:

    • 在现有版本中无法使用docker search + 镜像名查看docker官方镜像,而是使用docker search register.liberx.info/镜像名来查看docker官方镜像,如图所示

      在这里插入图片描述

  • docker pull从docker仓库拉取镜像时,若不加版本号则会下载最新版本,若想加版本号则形式为:docker pull 镜像名:版本号。相应版本号可在Docker hub官网查看

    在这里插入图片描述

  • 删除本地镜像时有两种方式:

    • 删除指定镜像
      • docker rmi + Image ID(即镜像ID)
      • docekr rmi + 镜像名:版本号
        • 一般不会加:版本号,除非系统中有多个版本的镜像
    • 删除所有镜像:docker rmi 'docker images -q'

代码示例

在这里插入图片描述

在这里插入图片描述

Docker容器相关命令

在这里插入图片描述

此处只列举出常用命令,具体可详见官网或菜鸟教程

命令说明文档地址
docker run创建并运行容器docker run
docker stop停止指定容器docker stop
docker start启动指定容器(该容器已存在)docker start
docker restart重新启动容器docker restart
docker ps查看正在运行的容器docker ps
docker ps -a查看创建的所有容器(包括运行和未运行的)
docker ps -aq查看创建的所有容器的id(包括运行和未运行的)
docker rm +容器id或容器名 删除指定的未在运行的容器docs.docker.com
docker rm -f +容器id或容器名删除指定的正在运行的容器
docker rm 'docker ps -aq' 删除创建的所有未运行的容器
docker rm -f 'docker ps -aq'删除创建的所有正在运行的容器
docker logs查看容器运行日志docker logs
docker exec -it 容器名 /bin/bash进入容器docker exec
docker exec -it 容器名 bash进入容器
docker save保存镜像到本地压缩文件docker save
docker load -i 镜像压缩文件加载本地压缩文件到镜像docker load
docker inspect + 容器名查看容器详细信息docker inspect
docker update --restart=always [容器名/容器id]设置指定Docker容器开机自启

docker run创建并运行容器

常用配置参数

配置参数解释
-i交互式操作容器
-t给容器分配一个终端
-d让容器后台运行
-p 宿主机端口:容器内端口将宿主机(即Linux系统)端口映射到容器内的端口
-e配置容器内的进程运行时的参数(即配置环境变量)
--name=自定义容器名--name 自定义容器名给容器命名
--alias 自定义容器别名给容器设置别名
-v 宿主机目录或文件:容器内目录或文件配置数据卷,具体可详见数据卷配置内容
-- network 网络名将容器加入到 已创建 的网络中。
REPOSITORY:TAG镜像名:版本号,若未指定版本号则默认为最新版本
  • 若只用-it则在进入容器然后使用exit退出容器后,该容器也会自动停止运行

    在这里插入图片描述

  • 若用-id则不能直接在docker run后加/bin/bash来直接进入容器,需使用docker exec -it 容器名 /bin/bashdocker exec -it 容器名 bash进入容器

    创建完后会自动显示当前容器的id,如图所示,即239d0287448eafe208a04a21a4b848c22a316bd39a5d7e5d02c12eb97d1e676f

    在这里插入图片描述

  • -it-id的区别

    • -it创建的容器称为交互式容器,exit退出后就会结束运行
    • 交互式容器在创建时就可进入容器内
    • -id创建的容器为守护式容器,exit退出后仍然会在后台运行
    • 守护式容器必须通过docker exec -it 容器名 /bin/bashdocker exec -it 容器名 bash进入容器
  • 创建并运行容器时,默认进入的即是工作目录

  • -- network 网络名

    • 当使用docker run来创建并运行容器,同时将容器加入到对应的网络中时,若网络不存在,则必须使用网络相关命令先创建。具体创建过程可详见网络部分内容
    • 当在Docker Compose中将对应服务加入到网络中时,网络可以不存在,因为Docker Compose会自动创建对应的网路。详见Docker Compose部分内容

docker ps

不在示例,可详见docker run示例

  • docker ps:查看运行中容器,这个命令也可以加格式化访问,这样会更加清爽,如下所示
    • docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
  • docker ps -a:查看所有容器(包括运行中的和未运行的)。这个命令也可以加格式化访问,这样会更加清爽,如下所示
    • docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

设置命令别名

给常用Docker命令起别名,方便我们访问:

  • Step1: 通过vi /root/.bashrc修改/root/.bashrc文件 输入完该命令后即可进入到.bashrc文件,如图所示,原有文件内容如下:

    在这里插入图片描述

    起完别名后wq保存并退出

    在这里插入图片描述

Step2: 执行命令source /root/.bashrc使别名生效即可

数据卷

在这里插入图片描述

  • 数据卷是宿主机中的一个目录或文件,并且该目录或文件需要通过-v参数来与容器内的目录或文件进行映射

    • 当容器中的目录与数据卷目录绑定之后,此时任意一方的修改都会立即同步
    • 一个数据卷可以被多个容器同时挂载,可以此来实现容器间的数据交互
    • 一个容器也可以被挂载多个数据卷
  • 数据卷作用

    • 实现容器数据的持久化,此时数据不会随着容器的删除而消失
    • 实现外部机器与容器间的通信
    • 实现容器之间的数据交换
  • 注意

    • /var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录,其下会再根据数据卷名称创建新目录,格式为/数据卷名/_data
  • 为什么不让容器目录直接指向宿主机目录呢

    • 因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。
    • 但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。

    不过,我们发现由于数据卷目录比较深,不好寻找,通常我们也允许让容器直接与宿主机目录挂载而不使用数据卷

数据卷相关命令

命令说明文档地址
docker volume create创建数据卷docker volume create
docker volume ls查看所有数据卷docs.docker.com
docker volume rm + 卷名删除指定数据卷docs.docker.com
docker volume inspect查看某个数据卷的详情。若加卷名则查询指定数据卷;若不加则查看所有数据卷docs.docker.com
docker volume prune清除所有未使用的数据卷docker volume prune

配置数据卷

容器与宿主机进行数据交换

  • 用到的命令
    • 创建并启动容器时,使用-v参数配置数据卷:docker run ... -v 宿主机目录或文件:容器内目录或文件...
    • 注意:
      • 目录或文件必须是绝对路径
      • 若目录或文件不存在,会自动创建
      • 可以挂载多个数据卷
      • 宿主机目录/root/...等同于~/...,而容器目录只能用/root/...

以redis为例

在这里插入图片描述

容器间数据交换

  • 有两种方式

    • 方式一:多个容器挂载同一个数据卷
    • 方式二:使用数据卷容器
    • 注意:方式一不在演示,主要演示方式二
  • 数据卷容器解释

    在这里插入图片描述

    • 假设现在有三个容器:c1、c2、c3,c3挂载了一个数据卷,然后将c1、c2分别挂载到c3容器上,此时就相当于c1、c2、c3挂载了同一个数据卷。这样就实现了容器间的通信,此时就算c3容器出了问题,c1、c2仍然可以通过数据卷进行通信
    • c3就被称为数据卷容器
  • 示例

    • Step1: 创建并启动名为c3的redis容器

      docker run -id --name=c3 -v /volume redis 
      

      注意:

      ​ 挂载时并未指定宿主机的挂载目录(即此时宿主机为匿名数据卷),只指定了c3容器的目录,此时系统自动会去创建宿主机对应的挂载目录,如图所示

      在这里插入图片描述

      • Name:数据卷名称。由于定义容器未设置容器名,这里的就是匿名卷自动生成的名字,一串hash值。
      • Source:宿主机目录
      • Destination : 容器内的目录

      上述配置是将容器内的/volume这个目录,与数据卷挂载。于是在宿主机中就有了/var/lib/docker/volumes/数据卷名称/_data这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。

    • Step2: 创建并启动名为c1的redis容器,然后通过--volumns-from 数据卷容器名来继承数据卷容器(即c3)

      docker run -id --name=c1 --volumns-from c3 redis
      
    • Step3: 创建并启动名为c2的redis容器,然后通过--volumns-from 数据卷容器名来继承数据卷容器(即c3)

      docker run -id --name=c2 --volumns-from c3 redis
      

挂载本地目录或文件

  • 容器间数据交换的示例Step1可知数据卷的目录比较深,如果我们去操作数据卷目录会不太方便。所以我们也会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

    # 挂载本地目录
    -v 本地目录:容器内目录
    # 挂载本地文件
    -v 本地文件:容器内文件
    

    注意

    本地目录或文件必须以 /./开头,如果直接以名字开头,则会被识别为数据卷名而非本地目录名。如下示例所示

    • -v mysql:/var/lib/mysql:会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
    • -v ./mysql:/var/lib/mysql:会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

Docker应用部署

  • 从远程仓库拉取镜像的实现步骤

    • 搜索对应应用的镜像并拉取应用镜像

      注意:若本地有镜像压缩包,则直接将镜像压缩包上传到虚拟机中即可,此时就不需要该步骤了

    • 创建容器,并进行端口映射

    • 外部机器操作容器中的应用

  • 外部机器是无法直接操作容器,因为

    • 容器是隔离环境,外部容器与容器不互通;但是外部机器与宿主机是互通的,而宿主机又与容器互通,所以可以将宿主机的端口与容器端口进行一个映射,这样外部机器在访问宿主机对应端口时就相当于在访问容器。如图所示

    在这里插入图片描述

MySQL部署

在这里插入图片描述

  • Step1: 查看Docker库是否有MySQL镜像并拉取镜像

    docker search register.liberx.info/mysql
    docker pull mysql
    
  • Step2: 创建mysql目录并进入到该目录下

    mkdir ~/mysql
    cd ~/mysql
    
  • Step3: 创建并运行容器,同时设置端口映射、目录映射等

      docker run -id \--name mysql \-p 3307:3306 \-v $PWD/conf:/etc/mysql/conf.d \-v $PWD/logs:/logs \-v $PWD/data:/var/lib/mysql \-v $PWD/init:/docker-entrypoint-initdb.d \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123456 \mysql
    
    • --name 自定义容器名:自定义容器名
    • -p 宿主机端口:容器内端口:将宿主机的指定端口映射到容器内的指定端口
    • -e KEY=VALUE:配置容器内进程运行时的一些参数(即配置环境变量)。KEY和VALUE都由容器内进程决定
      • TZ=Asia/Shanghai:是设置时区;
      • MYSQL_ROOT_PASSWORD=123456:初始化root用户的mysql密码
    • -v 宿主机目录或文件:容器内目录或文件:配置数据卷
      • -v $PWD/conf:/etc/mysql/conf.d:配置目录挂载
      • -v $PWD/logs:/logs:日志目录挂载
      • -v $PWD/data:/var/lib/mysql:数据目录挂载
        • 存放MySQL数据库的所有数据文件,包括表的结构、数据、索引等信息
      • -v $PWD/init:/docker-entrypoint-initdb.d:初始化脚本挂载
        • MySQL 容器的启动过程中,如果该目录存在 SQL 脚本或其它初始化文件,MySQL 会自动执行这些文件。这通常用于在 MySQL 容器第一次启动时初始化数据库
    • $PWD代表当前目录(即mysql目录下)
  • Step4: 进入mysql容器内部

    docker exec -it mysql /bin/bash
    
  • Step5: 登录mysql

    • 输入命令mysql -uroot -p后输入密码即可登录
  • 步骤如图所示

    在这里插入图片描述

  • 之后就可以在外部机器中来连接该mysql容器并使用(此处以Navicat为例),步骤如图所示

    • Navicat创建连接

      在这里插入图片描述

    • 利用Navicat创建数据库(步骤略)

Tomcat部署

  • Step1: 查看Docker库是否有MySQL镜像并拉取镜像

    docker search register.liberx.info/tomcat
    docker pull tomcat
    
  • Step2: 创建mysql目录并进入到该目录下

    mkdir ~/tomcat
    cd ~/tomcat
    
  • Step3: 创建并运行容器,同时设置端口映射、目录映射等

    docker run -id \--name tomcat \-p 8080:8080 \-v $PWD:/usr/local/tomcat/webapps \tomcat
    
    • -v $PWD:/uer/local/tomcat/webapps:将容器当前目录挂载到容器的webapps中
  • Step4: 在Tomcat目录下创建一个test测试目录,并在该目录下创建文件index.html,文件代码如下

    <h1>Tomcat访问成功</h1>
    
  • Step5: 外部机器测试是否成功

    在这里插入图片描述

Nginx部署

  • Step1: 查看Docker库是否有MySQL镜像并拉取镜像

    docker search register.liberx.info/nginx
    docker pull nginx
    
  • Step2: 创建nginx/conf目录并在该目录下创建nginx.conf文件

    mkdir ~/nginx
    cd ~/nginx
    mkdir conf
    cd conf
    vim nginx.conf
    

    将以下命令复制到nginx.conf文件中

    user  nginx;
    worker_processes  1;error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;events {worker_connections  1024;
    }http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  oninclude /etc/nginx/conf.d/*.conf
    }
    
  • Step3: 返回到nginx目录下创建并运行容器,同时设置端口映射、目录映射等

    docker run -id \--name=nginx \-p 80:80 \-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \-v $PWD/logs:/var/log/nginx \-v $PWD/html:/usr/share/nginx/html \nginx
    
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:配置文件挂载
    • -v $PWD/logs:/var/log/nginx:日志目录挂载
    • -v $PWD/html:/usr/share/nginx/html:静态资源目录挂载
  • Step4: 外部机器测试是否成功

    在这里插入图片描述

  • 配置文件内容解析

    # 指定运行nginx 的用户,默认是 nginx 用户
    user  nginx;
    # 定义工作进程数,若为auto则表示自动根据 CPU 核心数调整
    worker_processes  1;
    # 定义错误日志文件的位置和日志级别; warn 表示记录警告及更高级别的错误信息
    error_log  /var/log/nginx/error.log warn;
    # 定义 Nginx 启动后保存进程 ID 的文件路径,用于管理进程
    pid        /var/run/nginx.pid;# 事件块
    events {# 每个工作进程允许的最大并发连接数worker_connections  1024;
    }
    # HTTP块 定义 Web 服务相关配置
    http {# 引入外部文件 /etc/nginx/mime.types,定义各种文件的 MIME 类型include       /etc/nginx/mime.types;# 设置默认 MIME 类型。当无法识别文件类型时,使用 application/octet-stream,即通用的二进制流default_type  application/octet-stream;# 定义日志格式# $remote_addr:客户端 IP 地址# $remote_user:客户端认证的用户名# $time_local:本地时间# $request:客户端请求的完整内容# $status:HTTP 状态码# $body_bytes_sent:发送给客户端的响应体字节数# $http_referer:请求来源(Referer)# $http_user_agent:用户代理信息(如浏览器类型)# $http_x_forwarded_for:代理服务器传递的客户端真实 IP(如果存在)log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';# 指定访问日志的存储位置和日志格式(使用上面定义的 main)access_log  /var/log/nginx/access.log  main;#  开启高效文件传输sendfile        on;# 提高文件传输性能#tcp_nopush     on;# 定义 HTTP 长连接的超时时间(秒)。客户端连接超过该时间未发送请求时将断开。keepalive_timeout  65;# 开启HTTP响应的 Gzip 压缩以减少传输数据量#gzip  on# 引入 /etc/nginx/conf.d/ 目录下的所有配置文件,支持多个虚拟主机include /etc/nginx/conf.d/*.conf
    }
    

Redis部署

  • Step1: 查看Docker库是否有MySQL镜像并拉取镜像

    docker search register.liberx.info/redis
    docker pull redis
    
  • Step2: 创建mysql目录并进入到该目录下

    mkdir ~/redis
    cd ~/redis
    
  • Step3: 创建并运行容器,同时设置端口映射、目录映射等

    docker run -id \--name redis \-p 6380:6379 \redis
    
    • 若报如下错误则代表宿主机的6379端口号被占用,此时换个宿主机端口号即可

      Error starting userland proxy: listen tcp4 0.0.0.0:6379: bind: address already in use.

  • Step4: 使用外部机器redis测试是否成功

    注意:要进入到windows的redis目录下打开cmd命令窗口输入以下命令进行测试

    redis-cli.exe -h 宿主机ip地址 -p nginx容器端口号
    

    在这里插入图片描述

Docker自定义镜像

  • 自定义镜像主要分为四步:

    • 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
    • 安装并配置JDK
    • 拷贝jar包
    • 配置启动脚本

    上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合

    但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

    例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像 。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

    在这里插入图片描述

  • Docker镜像原理

    在这里插入图片描述

  • 用到的方法

    命令说明文档地址
    docker save保存镜像到本地压缩文件docker save
    docker load -i 镜像压缩文件加载本地压缩文件到镜像docker load
    docker inspect + 容器名查看容器详细信息docker inspect

利用命名方式制作

  • 通过指定容器创建自定义镜像:docker commit 容器id 自定义镜像名称:自定义版本号
  • 将自定义的镜像转为压缩文件:docker save -o 自定义压缩文件名称 自定义镜像名称:自定义版本号
  • 将自定义镜像转为的压缩文件转为另一个镜像:docker load -i 压缩文件名称

注意:容器转为自定义的镜像后,目录挂载(即数据卷)中的内容不会添加到新的镜像中,若想要其中的内容,则可以在利用自定义的对象创建容器时配置数据卷就可以了

利用Dockerfile制作(自定义镜像)

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档

  • Dockerfile是一个记录镜像结构的文本文件,包含了一条条指令,每一条指令构建一层基于基础的镜像,最终构建出一个新的镜像
    • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
    • 对于测试人员:可以直接拿开发时所创建的镜像或者通过Dockerfile文件来创建一个新的镜像开始工作
    • 对于运维人员:在部署时,可以实现应用的无缝移植

快速入门

需求:定义Dockerfile,发布SpringBoot项目到Docker容器中

本快速入门项目DockerFileDemo的具体搭建可完全参考SpringBoot快速入门

  • Step1: 执行Maven构建指令package来对该SpringBoot项目打包

    在这里插入图片描述

  • Step2: 将该SpringBoot项目的jar包传到宿主机的root目录下

    在这里插入图片描述

  • Step3: 利用mkdir /root/docker-files(等同于mkdir ~/docker-files)命令在root目录下创建项目文件目录docker-files,来存放项目文件(如 JAR 包、Dockerfile 等)

    • 若命令为mkdir ./docker-filesmkdir docker-files则必须保证当前所在目录为root目录,因为.表示在当前目录下创建
  • Step4: 将该jar包移动到docker-files目录下:mv DockerFileDemo-0.0.1-SNAPSHOT.jar ./docker-files/

  • Step5: 利用vim ./docker-files/dockerFileDemodocker-files目录下创建并编写该项目对应的dockerfile文件dockerFileDemo,该文件内容如下:

    # 指定基础镜像(即父镜像)
    FROM openjdk:21-jdk
    # 指明维护者/作者信息
    LABEL maintainer="cgrs572 <Your.Name@example.com>"
    # 将对应jar包复制到即将要创建的镜像的app目录中
    COPY DockerFileDemo-0.0.1-SNAPSHOT.jar /app/DockerFiledemo.jar
    # 指定容器创建时的默认命令
    CMD ["java", "-jar", "/app/DockerFiledemo.jar"]
    
    • 指定的父镜像若在系统中不存在的话,后续构建自定义镜像时该父镜像也会被下载。只是说此时构建自定义镜像的时间可能会延长,可提前自行利用docker pull 镜像名:版本号来将父镜像下载到宿主机中
  • Step6: 利用cd /root/docker-files进入docker-files目录

  • Step7: 利用docker build -f dockerfile文件路径 -t 自定义镜像名:版本号 对应的dockerfile文件所在目录来构建镜像

    • 由于博主已进入到docker-files目录,所以最终命令为:docker build -f ./dockerFileDemo -t dockerfiledemcon .
      • 最后的.表示当前路径
    • 命令解析
      • -f:指定dockerfile文件及其路径
      • -t:指定自定义镜像名及其版本号
  • Step8: 创建并运行容器docker run -id -p 9000:8080 dockerfiledemcon

  • Step9: 外部机器测试是否运行成功

    在这里插入图片描述

利用Dockerfile制作(自定义官方镜像)

背景引入

本案例以CentOS7为例

  • Step1: 从远程镜像仓库拉取Centos7到本地:docker pull centos:7

    • 若本地有centos7镜像则该步省略
  • Step2: 创建并运行centos容器并进入该容器中docker run -it --name=c1 centos /bin/bash

    • 此处的命令可省略/bin/bash,因为在官方的centos的dockerfile文件中的CMD命令已经指定了容器创建时的默认命令为 /bin/bash
  • Step3: cd到root目录下,然后执行vim a.txt命令,最终截图如下

    在这里插入图片描述

  • 在以上示例中就存在问题

    • 进入容器后默认进入的工作目录为/
    • 官方提供的centos镜像没有下载vim命令导致该命令不可用
    • 因此为了更加方便,我们就可以来自定义镜像

快速入门

在这里插入图片描述

  • Step1: 利用mkdir /root/docker-files(等同于mkdir ~/docker-files)命令在root目录下创建项目文件目录docker-files,来存放项目文件(如 JAR 包、Dockerfile 等)

    • 若命令为mkdir ./docker-filesmkdir docker-files则必须保证当前所在目录为root目录,因为.表示在当前目录下创建

    注意:由于在子当以镜像的示例中已创建该目录,所以该示例截图中不存在该步骤的命令

  • Step2: 利用vim ./docker-files/centosdockerFiledocker-files目录下创建并编写该项目对应的dockerfile文件centosdockerFile,该文件内容如下:

    # 指定基础镜像(即父镜像)
    FROM centos:7
    # 指明维护者/作者信息
    LABEL maintainer="cgrs572 <Your.Name@example.com>"
    # 指定在构建自定义镜像过程中执行的命令(即 利用RUN安装vim到自定义镜像中)
    RUN yum install -y vim
    # 设置后续指令的工作目录(即利用`WORKDIR`指定默认工作目录)
    WORKDIR /usr
    # 指定容器创建时的默认命令
    CMD ["/bin/bash"]
    
    • 指定的父镜像若在系统中不存在的话,后续构建自定义镜像时该父镜像也会被下载。只是说此时构建自定义镜像的时间可能会延长,可提前自行利用docker pull 镜像名:版本号来将父镜像下载到宿主机中

    • 注意:若在构建自定义镜像源过程中yum无法下载则需要更换centos镜像的镜像源,此时dockerfile文件代码如下

      # 指定基础镜像(即父镜像)
      FROM centos:7
      # 指明维护者/作者信息
      LABEL maintainer="cgrs572 <Your.Name@example.com>"
      # 更换yum 镜像源保证yum可以正常工作
      RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum install -y vim
      # 指定在构建自定义镜像过程中执行的命令(即 利用RUN安装vim到自定义镜像中)
      RUN yum install -y vim
      # 设置后续指令的工作目录(即利用`WORKDIR`指定默认工作目录)
      WORKDIR /usr
      # 指定容器创建时的默认命令
      CMD ["/bin/bash"]
      
  • Step3: 利用cd /root/docker-files进入docker-files目录

  • Step4: 利用docker build -f dockerfile文件路径 -t 自定义镜像名:版本号 对应的dockerfile文件所在目录来构建镜像

    • 由于博主已进入到docker-files目录,所以最终命令为:docker build -f ./centosdockerFile -t centosdockerfile .
      • 最后的.表示当前路径

    在这里插入图片描述

  • Step5: 创建并运行容器docker run -id -p 9000:8080 centosdockerfile ,然后测试是否运行成功

    • 此时进容器后默认的工作目录为/usr
    • 使用vim测试并未报错

    在这里插入图片描述

DockerFile常用关键字

Dockerfile 指令解释
FROM指定基础镜像(即父镜像),用于后续的指令构建。即指定Dockerfile是基于哪个image构建的
MAINTAINER指明Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL添加镜像的元数据,使用键值对的形式。
RUN指定在构建自定义镜像过程中执行的命令。
CMD指定容器创建时的默认命令。(可以被docker run时指定的命令覆盖)
ENTRYPOINT设置容器创建时的主要命令。(不可被docker run时指定的命令覆盖)
EXPOSE声明容器运行时监听的特定网络端口。
ENV在容器内部设置环境变量。
ADD将文件、目录或远程URL添加到镜像中。
COPY将文件或目录复制到镜像中。
VOLUME为容器创建挂载点或声明卷。
WORKDIR设置后续指令的工作目录。
USER指定后续指令的用户上下文。
ARG定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。
ONBUILD当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL设置发送给容器以退出的系统调用信号。
HEALTHCHECK定义周期性检查容器健康状态的命令。
SHELL覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

网络

背景引入

容器间互相访问方式步骤如下:

以MySQL镜像与自定义centos镜像为例

  • Step1:创建并运行项目MySQL镜像对应的容器以及自定义centos7镜像对应的容器(步骤略)

    • 创建完成后使用docker ps -a指令查看容器是否创建成功

      • MySQL镜像对应的容器名为mysql
      • 自定义centos7镜像对应的容器名为centos01

      在这里插入图片描述

  • Step2:使用docker inspect 容器名指令来查看容器mysql的Networks.bridge.IPAddress属性(即ip地址)

    • 也可使用format来过来结果直接得出ip地址:docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' 容器名

    • 容器mysql的ip地址为172.17.0.2,如图所示

      在这里插入图片描述

  • Step3:进入容器centos01中,利用ping 172.17.0.2检测是否能够访问容器mysql

    注意:若该容器未启动则需要先利用docker start 容器名/id将其启动,然后利用docker exec -it 容器id/容器名 /bin/bash进入

    在这里插入图片描述

    有图可知,只要知道对应容器的ip地址就可以实现容器间的互相访问

快速入门

由背景引入可知只要知道对应容器的ip地址就可以实现容器间的互相访问

但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时MySQL容器的IP发生变化,这就会导致连接会失败,所以通过ip地址来访问还是不可靠,所以就有了网络,步骤如下

  • Step1: 利用docker network create 自定义网络名创建一个网络,博主创建的网络名为webb

  • Step2: 利用docker network ls查看所有网络,判断是否对应网络是否创建成功

  • Step3: 利用docker network connect 容器要加入的网络名 要加入的容器 --alias 自定义容器别名来将mysql容器和centos01容器均加入创建的网络webb中

  • Step4: 进入容器centos01中,利用ping 容器名或容器对应的别名检测是否能够访问容器mysql

    在这里插入图片描述

网络相关命令

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docs.docker.com
docker network rm删除指定网络docs.docker.com
docker network prune清除未使用的网络docs.docker.com
docker network connect使指定容器连接加入某网络docs.docker.com
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect

Docker Compose

我们部署一个简单的java项目,至少包含3个容器:

  • MySQL
  • Nginx
  • Java项目

而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。

而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

  • Docker Compose是一个编排多容器分布式部署的工具,提供命令集来管理容器化应用的完整开发周期,包括服务构建、启动和停止
  • 使用步骤
    • 利用Dockerfile定义运行环境镜像
    • 使用docker-compose.yml定义组成应用的各个服务
    • 运行docker-compose up启动应用

Docker Compose安装

二进制包离线安装(推荐)

  • Step1:去Github下载对应版本的二进制文件

    在这里插入图片描述

  • Step2:利用cd /usr/local/bin进入到/usr/local/bin目录下,然后将二进制文件直接上传到该目录下

    在这里插入图片描述

  • Step3:利用mv oldName newName将文件docker-compose-linux-x86_64重命名为 docker-compose

    mv docker-compose-linux-x86_64 docker-compose
    
  • Step4:添加可执行权限sudo chmod +x /usr/local/bin/docker-compose

  • Step5:验证是否安装成功docker-compose --version

    在这里插入图片描述

  • 卸载时,直接删除对应的二进制包即可

快速入门

需求:使用DockerCompose编排nginx+springboot项目

本示例以Docker自定义镜像的springboot项目为基准。在Docker自定义镜像中,已经构建了自定义了springboot项目对象的镜像,如图所示

在这里插入图片描述

  • Step1: 将对应的官方镜像从docker仓库拉取下来:docker pull 镜像名:版本号

  • Step2: 自定义项目的镜像(本步骤略,可详见自定镜像的部分内容示例)

  • Step3: 利用mkdir /root/docker-compose(等同于mkdir ~/docker-files)命令在root目录下创建项目文件目录docker-compose,来存放项目文件(如 JAR 包、Dockerfile 等)

    • 若命令为mkdir ./docker-composemkdir docker-compose则必须保证当前所在目录为root目录,因为.表示在当前目录下创建
  • Step4: 利用cd docker-compose进入到docker-compose目录下,然后利用vim docker-compose.yml创建dockercompose文件docker-compose.yml,该文件代码如下

    # 指定dockercompose文件格式的版本
    version: '3.8'
    # 定义服务
    services:# 定义服务1:nagix服务---自定义服务名即可nginx:# image: 镜像名:版本号image: nginx# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- 80:80# 将指定服务链接到本服务中,后期在该服务创建的容器中可直接通过指定服务名来访问指定服务links:- app# 将本地目录或文件挂载到容器内的目录或文件volumes:- ./nginx/conf.d:/etc/nginx/conf.d# 定义服务2:app服务---自定义服务名即可app:# image: 镜像名:版本号image: dockerfiledemcon# 指定该服务对应的容器内部暴露的端口expose:- "8080"
    
    • 在dockercompose新版本中version已被舍弃,不过最好还是加上
    • 在dockercompose新版本中links已被舍弃,先版本可以通过服务名称直接访问其他服务,而不需要显式地使用 links,所以可删除

    最终文件代码如下:

    # 指定dockercompose文件格式的版本
    version: '3.8'
    # 定义服务
    services:# 定义服务1:nagix服务---自定义服务名即可nginx:# image: 镜像名:版本号image: nginx# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- 80:80# 将本地目录或文件挂载到容器内的目录或文件volumes:- ./nginx/conf.d:/etc/nginx/conf.d# 定义服务2:app服务---自定义服务名即可app:# image: 镜像名:版本号image: dockerfiledemcon# 自定义该服务创建的容器名称container_name: appcon# 在同一网络下暴露该服务对应的容器端口expose:- "8080"
    
  • Step5: 创建挂载的本地目录或文件 mkdir -p ./nginx/conf.d

    • -p用来创建目录及其子目录
  • Step6: 利用cd ./nginx/conf.d进入到conf.d目录下并在该目录下用vim nginx.conf创建并编写nginx配置文件nginx.conf文件,该文件代码如下

    解释:当服务器监听到 80 端口的请求时,nginx 会自动将请求转发到 app 服务的 8080 端口

    此时nginx 会充当一个反向代理服务器,将客户端的请求转发给后端服务(app 服务)处理

    server {# 指定nginx服务器监听的端口listen 80;# 关闭访问日志记录access_log off;# 定义一个位置块,处理所有以/开头的请求location / {# 将请求代理到名为app服务的8080端口proxy_pass http://app:8080;}
    }
    
  • Step7: 在~/docker-compose目录下使用docker-compose up命令启动容器

    • 该命令若为docker-compose up -d则代表后台启动

    在这里插入图片描述

  • Step8: 测试访问,运行成功

    在这里插入图片描述

注意

  • 在使用Docker Compose来实现多个相互关联的Docker容器的快速部署时, 若不定义并指定网络,则Docker Compose会自动创建一个默认网络,以此来实现不同服务对应的容器均在同一个默认网络下,并能够通过服务名互相访问

    • 在以上快速入门中就属于未定义并指定网络,此时Docker Compose会创建一个默认的网络,如图所示

      在这里插入图片描述

    • 在Docker Compose基本语法中的两个示例属于定义并指定网络

  • expose:在同一网络下暴露该服务对应的容器端口

    • 此时如果我在外部利用docker run -id -p 9000:8080 dockerfiledemcon命令创建了一个app服务所使用的镜像的容器,并将宿主机的9000端口映射到容器的8000端口上,则:
      • docker run -p 9000:8080 这条命令是将 宿主机的 9000 端口 映射到 容器的 8080 端口。这意味着外部世界(例如,浏览器或者其他客户端)通过宿主机的 9000 端口可以访问到容器的 8080 端口
      • expose 是告诉 Docker 仅在容器网络中暴露端口 ,并不进行宿主机与容器之间的端口映射。expose 只是让其他同网络中的容器可以访问到暴露的端口。它并不会将容器的端口映射到宿主机的端口
      • 所以它们是互不干扰,互不影响的。但是假设产生了影响则在app服务中利用container_name指明该服务所创建的容器名称即可

Docker Compose基本语法

  • docker run参数对应的docker compose指令

    docker run 参数docker compose 指令说明
    --namecontainer_name指定容器名称
    -pports端口映射
    -eenvironment环境变量
    -vvolumes数据卷配置
    --networknetworks网络
  • 其它docker compose指令

    docker compose 指令说明
    build指定该服务的镜像是通过 Dockerfile 文件进行构建的
    context指定 Dockerfile文件及利用该文件构建镜像所需的其他文件所在的位置
    dockerfile指定要构建的镜像所对应的dockerfile文件名称。如果未指定,则会默认查找名为 Dockerfile 的文件
    image指定服务要使用的镜像名称及版本号(版本号可省略)
    depends_on指定服务之间的启动顺序,指定的服务会在当前服务启动之前启动
    expose在同一网络下暴露该服务对应的容器端口
  • build

    • 若要使用的自定义镜像不存在且无法从官方仓库拉取,则指定该服务的镜像是通过 Dockerfile 文件进行构建的。此时Docker Compose会自动根据Dockerfile文件来创建自定义镜像

示例1

此处以网络中的示例为例,将MySQL镜像容器加入到自定义的网络webb中

  • 创建并运行MySQ镜像的容器代码如下:

    • 当使用docker run时,容器要加入的网络必须是已存在的;若不存在则需要提前创建好对应的网络。
    • 此处假设自定义的webb网络已创建,具体过程可详见网络部分内容
    docker run -id \--name mysql \-p 3307:3306 \-v $PWD/conf:/etc/mysql/conf.d \-v $PWD/logs:/logs \-v $PWD/data:/var/lin/mysql \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123456 \--network webbmysql
    
  • 如果用docker-compose.yml文件来定义,就是这样:

    • 此处假设webb网络在外部不存在,则文件代码如下:

      docker run命令不同的是:在Docker Compose文件中的网络可以不存在,因为Docker Compose会自动创建对应的网路(前提是该网络并未指定在外部存在)。

      # 指定dockercompose文件格式的版本
      version: "3.8"
      # 定义服务
      services:# 定义服务1:nagix服务---自定义服务名即可mysql:# image: 镜像名:版本号image: mysql# 自定义该服务创建的容器名称container_name: mysql# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- "3306:3306"# 配置容器内的进程运行时的参数(即配置环境变量)environment:# 设置时区TZ: Asia/Shanghai# 设置root用户的登录密码MYSQL_ROOT_PASSWORD: 123# 将本地目录或文件挂载到容器内的目录或文件volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"# 该服务创建的容器加入到指定的网络中networks:# 要加入的网络的别名- newwebb
      # 定义网络
      networks:# 定义网络别名newwebb:# 定义网络名称name: webb
      
    • 此处假设webb网络在外部存在,则文件代码如下:

      注意:若假设在外部存在的webb网络其实在外部是不存在的,此时Docker Compose就不会自动创建对应网络,需手动创建(具体过程可详见网络部分内容)

      • 网络别名与外部网络的实际名称不一致

        # 指定dockercompose文件格式的版本
        version: "3.8"
        # 定义服务
        services:# 定义服务1:nagix服务---自定义服务名即可mysql:# image: 镜像名:版本号image: mysql# 自定义该服务创建的容器名称container_name: mysql# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- "3306:3306"# 配置容器内的进程运行时的参数(即配置环境变量)environment:# 设置时区TZ: Asia/Shanghai# 设置root用户的登录密码MYSQL_ROOT_PASSWORD: 123# 将本地目录或文件挂载到容器内的目录或文件volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"# 该服务创建的容器加入到指定的网络中networks:# 要加入的网络的别名- newwebb
        # 定义网络
        networks:# 定义网络别名newwebb:# 指定外部已存在的网络external:# 已存在的网络名称name: webb
        
      • 网络别名与外部网络的实际名称一致

        # 指定dockercompose文件格式的版本
        version: "3.8"
        # 定义服务
        services:# 定义服务1:nagix服务---自定义服务名即可mysql:# image: 镜像名:版本号image: mysql# 自定义该服务创建的容器名称container_name: mysql# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- "3306:3306"# 配置容器内的进程运行时的参数(即配置环境变量)environment:# 设置时区TZ: Asia/Shanghai# 设置root用户的登录密码MYSQL_ROOT_PASSWORD: 123# 将本地目录或文件挂载到容器内的目录或文件volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"# 该服务创建的容器加入到指定的网络中networks:# 要加入的网络的别名- newwebb
        # 定义网络
        networks:# 定义网络别名webb:# 指定该网络在外部已存在external: true
        

示例2

黑马商城部署文件

# 指定dockercompose文件格式的版本
version: "3.8"
# 定义服务
services:# 定义服务1:mysql服务---自定义服务名即可mysql:# image: 镜像名:版本号image: mysql# 自定义该服务创建的容器名称container_name: mysql# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- "3306:3306"# 配置容器内的进程运行时的参数(即配置环境变量)environment:# 设置时区TZ: Asia/Shanghai# 设置root用户的登录密码MYSQL_ROOT_PASSWORD: 123# 将本地目录或文件挂载到容器内的目录或文件volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"# 该服务创建的容器加入到指定的网络中networks:# 要加入的网络的别名- hm-net# 定义服务2:hmall服务---自定义服务名即可hmall:# 指定该服务的镜像是通过 Dockerfile 文件进行构建的build: # 指定构建镜像所需的所有文件所在位置context: .# 指定Dockerfile文件名称,若未指定则默认为Dockerfiledockerfile: Dockerfile# 自定义该服务创建的容器名称container_name: hmall# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- "8080:8080"# 该服务创建的容器加入到指定的网络中networks:- hm-net# 指定服务之间的启动顺序,指定的mysql服务会在当前hmall服务启动之前启动depends_on:- mysql# 定义服务3:nginx服务---自定义服务名即可nginx:# image: 镜像名:版本号image: nginx# 自定义该服务创建的容器名称container_name: nginx# 主机端口:容器端口 将主机端口映射到容器对应端口ports:- "18080:18080"- "18081:18081"# 将本地目录或文件挂载到容器内的目录或文件volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"# 指定服务之间的启动顺序,指定的mysql服务会在当前hmall服务启动之前启动depends_on:- hmall# 该服务创建的容器加入到指定的网络中networks:- hm-net# 定义网络
networks:# 定义网络别名hm-net:# 定义网络名称name: hmall

Docker Compose基本命令

  • docker compose [OPTIONS] [COMMAND]

    类型参数或指令说明
    Options-f指定compose文件的路径和名称
    Options-p指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
    Commandsup创建并启动所有service容器
    Commandsdown停止并移除所有容器、网络
    Commandsps列出所有启动的容器
    Commandslogs查看指定容器的日志
    Commandsstop停止容器
    Commandsstart启动容器
    Commandsrestart重启容器
    Commandstop查看运行的进程
    Commandsexec在指定的运行中容器中执行命令

Docker私有仓库

Docker官方的Docker hub是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把自己的镜像推送上去。但是有时候我们的服务器无法访问互联网,或者不希望将自己的镜像放到公网当中,这就需要搭建自己的私有仓库来存储和管理自己的镜像了

搭建私有仓库

  • Step1: 从Docker Hub拉取私有仓库registrydocker pull registry

  • Step2: 创建并启动私有仓库容器:docker run -id --name=registry -p 5000:5000 registry

  • Step3: 浏览器输入私有仓库的ip地址:映射的端口号/v2/_catalog测试是否成功

    • {"repositories":[]}表示私有仓库,由于现在并未向私有仓库推送镜像,所以为空

    在这里插入图片描述

  • Step4: 修改/ect/docker目录下的daemon.json文件:vim /etc/docker/daemon.json

    etc目录与root目录同级,所以直接/etc即可

    • 在deamon.json文件中添加私有仓库服务器的ip以及端口号:{"insecure-registries":["私有仓库服务器ip:端口号"]}—以此来让Docker信任该私有仓库
    {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://st5sw75p.mirrorcgrs572.aliyuncs.com","https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://docker.jsdelivr.fyi","https://dockertest.jsdelivr.fyi","https://mirror.aliyuncs.com","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.mirrors.ustc.edu.cn","https://mirror.iscas.ac.cn","https://docker.rainbond.cc"],"insecure-registries": ["192.168.10.131:5000"]
    }
    
  • Step5: 重启Docker服务:systemctl restart docker

  • Step6: 启动私有仓库容器:docker start registry

上传镜像到私有仓库

以CentOS7镜像为例

  • Step1: 将镜像标记为私有仓库的镜像:docker tag 镜像名:镜像版本号 私有仓库服务器ip:5000/镜像名:镜像版本号

  • Step2: 上传标记的镜像到私有仓库:docker push 私有仓库服务器ip:5000/镜像名:镜像版本号

  • Step3: 浏览器输入私有仓库的ip地址:映射的端口号/v2/_catalog测试是否成功

    在这里插入图片描述

  • 注意:

    • 为方便后续私有仓库拉取镜像,所以此处会将本地centos7私有镜像删除

      • 此时centos7私有镜像的id与centos7镜像的id一样,所以要想删除centos7私有镜像则必须为:docker rmi 私有镜像名:版本号—版本号不可省略,如下所示
      docker rmi 192.168.10.131:5000/centos:7
      

私有仓库拉取镜像

  • 直接使用docker pull 私有仓库服务器ip:5000/镜像名:镜像版本号

    在这里插入图片描述

相关文章:

Docker完整技术汇总

Docker 背景引入 在实际开发过程中有三个环境&#xff0c;分别是&#xff1a;开发环境、测试环境以及生产环境&#xff0c;假设开发环境中开发人员用的是jdk8&#xff0c;而在测试环境中测试人员用的时jdk7&#xff0c;这就导致程序员开发完系统后将其打成jar包发给测试人员后…...

区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】

区块链安全常见的攻击分析——不安全调用漏洞 Unsafe Call Vulnerability 区块链安全常见的攻击合约和简单复现&#xff0c;附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】1.1 漏洞合约1.2 漏洞分析1.3 攻击步骤分析1.4 攻击合约 区块链安全常见的攻击合约和…...

Vue.js 高难度组件开发:从插件化到性能极限优化

Vue.js 高难度组件开发&#xff1a;从插件化到性能极限优化 引言一、插件化组件开发1. 什么是插件化组件2. 案例&#xff1a;构建一个插件化的图表组件 二、动态扩展与自定义组件行为1. 动态添加组件功能 三、复杂交互与细粒度状态管理1. 使用 Vuex 的模块化和动态模块注册 四、…...

一个通用的居于 OAuth2的API集成方案

在现代 web 应用程序中&#xff0c;OAuth 协议是授权和认证的主流选择。为了与多个授权提供商进行无缝对接&#xff0c;我们需要一个易于扩展和维护的 OAuth 解决方案。本文将介绍如何构建一个灵活的、支持多提供商的 OAuth 系统&#xff0c;包括动态 API 调用、路径参数替换、…...

折腾日记:如何让吃灰笔记本发挥余热——搭建一个相册服务

背景 之前写过&#xff0c;我在家里用了一台旧的工作站笔记本做了服务器&#xff0c;连上一个绿联的5位硬盘盒实现简单的网盘功能&#xff0c;然而&#xff0c;还是觉的不太理想&#xff0c;比如使用filebrowser虽然可以备份文件和图片&#xff0c;当使用手机使用网页&#xf…...

C# dynamic 类型详解

简介 C# 中的 dynamic 是一种特殊类型&#xff0c;它允许在运行时确定对象的类型和成员&#xff0c;而不是在编译时。 dynamic 的定义 dynamic 是一种类型&#xff0c;它告诉编译器对其进行“动态类型解析”。 dynamic 类型的变量会跳过编译时类型检查&#xff0c;所有的操作…...

postgresql ERROR: cannot drop the currently open database

postgresql ERROR: cannot drop the currently open database 解释&#xff1a; 这个错误表明你正在尝试删除或者切换当前正在使用的数据库。在PostgreSQL中&#xff0c;一个数据库对应着一个进程&#xff0c;当一个数据库处于打开状态时&#xff0c;你不能直接删除或者切换它…...

Excel基础知识

一&#xff1a;数组 一行或者一列数据称为一维数组&#xff0c;多行多列称为二维数组&#xff0c;数组支持算术运算&#xff08;如加减乘除等&#xff09;。 行&#xff1a;{1,2,3,4} 数组中的每个值用逗号分隔列&#xff1a;{1;2;3;4} 数组中的每个值用分号分隔行列&#xf…...

【pwnlab_init靶场渗透】

文章目录 一、基础信息 二、信息收集 三、漏洞利用 四、反弹shell 五、提权 一、基础信息 Kali IP &#xff1a;192.168.20.146 靶机IP&#xff1a;192.168.20.157 二、信息收集 nmap -sS -sV -p- -A 192.168.20.157 开放了80、111、3306、50749等端口 访问一下80端口…...

【泰克生物】酶突变文库筛选技术:通过酵母展示实现酶的精准进化

酶工程是生物技术中的一个重要领域&#xff0c;涵盖了酶的改造、优化和应用。通过对酶分子进行定向进化&#xff0c;可以获得具有更高催化效率、更广泛底物特异性或更强稳定性的酶。酶突变文库筛选技术&#xff0c;尤其是酵母展示平台&#xff0c;提供了一种高效且可操作的方法…...

C++Primer 类简介

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

人工智能知识分享第三天-机器学习中交叉验证和网格搜索

交叉验证和网格搜索 交叉验证解释: 概述: 它是一种更加完善的, 可信度更高的模型预估方式, 思路是: 把数据集分成n份, 每次都取1份当做测试集, 其它的当做训练集, 然后计算模型的: 评分. 然后再用下1份当做测试集, 其它当做训练集, 计算模型评分, 分成几份, 就进行几次计算, 最…...

00序言:我为什么会选择AI?

序言&#xff1a;我为什么会选择AI&#xff1f; 2023年&#xff0c;对我来说是一个转折点。那一年&#xff0c;我在人工智能领域已经积累了几年的经验&#xff0c;深刻感受到了这场技术变革的巨大冲击。曾经&#xff0c;我也像许多人一样&#xff0c;怀疑自己是否能跟上这个快…...

【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计

引言 在当今快节奏的生活中&#xff0c;咖啡早已不仅仅是提神醒脑的饮品&#xff0c;更成为了一种情感寄托和生活态度的表达。本文将介绍一个独特的"魔法咖啡馆"互动体验设计&#xff0c;通过将咖啡与情感、魔法元素相结合&#xff0c;创造出一个充满想象力和治愈感…...

VSCode outline显示异常的解决方法——清除VSCode的配置和用户文件

1. 删除所有配置文件 sudo apt remove --purge code2. 删除所有用户文件 rm -rf ~/.config/Code rm -rf ~/.vscode rm -rf ~/.local/share/code rm -rf ~/.cache/Code3. 重装Code sudo dpkg -i code_1.96.2-1734607745_amd64.deb如此&#xff0c;可修复异常导致的outline无…...

Maple软件的安装和使用

文章目录 1.前言说明2.我为什么要学习Maple3.软件的安装4.如何使用4.1基本的赋值语句4.2函数的定义4.3三个类型的书写介质 5.指数运算5.1使用面板5.2自己输入 6.对数的使用 1.前言说明 众所周知&#xff0c;我虽然是一名这个计算机专业的学生&#xff0c;但是我对于数学&#…...

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求&#xff0c;现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为&#xff1a;co.elastic.clients:elasticsearch-…...

android13 系统文字大小和显示大小的修改

没啥可解释&#xff0c;如题所示&#xff0c;修改系统默认文字大小和显示大小 一修改系统文字大小&#xff1a; 系统文字太小&#xff0c;需要修改文字大小修改如下 commit 82675b7d8ac278e80d94e6b2b1417b266065d2ec Author: admin <bianjbflyscale.cn> Date: Sat …...

【华为OD-E卷 - 任务总执行时长 100分(python、java、c++、js、c)】

【华为OD-E卷 - 任务总执行时长 100分&#xff08;python、java、c、js、c&#xff09;】 题目 任务编排服务负责对任务进行组合调度。 参与编排的任务有两种类型&#xff0c;其中一种执行时长为taskA&#xff0c;另一种执行时长为taskB。 任务一旦开始执行不能被打断&#x…...

vue中子组件给父组件传值

在 Vue.js 中&#xff0c;子组件向父组件传递数据或事件通常是通过 $emit 方法来实现的。这个方法允许子组件触发一个自定义事件&#xff0c;父组件可以通过监听这些事件来接收信息。以下是实现这一过程的基本步骤&#xff1a; 1. 子组件触发事件 在子组件中&#xff0c;使用…...

【js】记录预览pdf文件

接口调用拿到pdf的文件流&#xff0c;用blob处理这个文件流拿到url&#xff0c;使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…...

【Spring MVC 异常处理机制】应对意外情况

在 Web 应用中&#xff0c;异常是不可避免的。用户的输入不合法&#xff0c;服务的某部分出错&#xff0c;或者数据库连接失败&#xff0c;这些情况都可能触发异常。那么问题来了&#xff1a;如何优雅地捕获并处理这些异常&#xff0c;让用户体验不至于因为一时的错误而受损&am…...

《计算机组成及汇编语言原理》阅读笔记:p128-p132

《计算机组成及汇编语言原理》学习第 10 天&#xff0c;p128-p132 总结&#xff0c;总计 5 页。 一、技术总结 1.8088 organization and architecture 8088处理器是16位电脑&#xff0c;寄存器是16位&#xff0c;数据总线(data bus)是8位&#xff0c;地址总线是20位。 (1)g…...

留学生交流互动系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

Windows IPC

进程间通信 (IPC&#xff0c;Inter-Process Communication) 进程间通信 (IPC) 是一种在进程之间建立连接的机制&#xff0c;在两台计算机或一台多任务计算机上运行&#xff0c;以允许数据在这些进程之间流动。进程间通信 (IPC) 机制通常用于客户端/服务器环境&#xff0c;并在…...

BMS存储模块的设计

目的 电池管理系统中存在着数据本地存储的要求&#xff0c;保证控制器重新上电后能够根据存储器中的一些参数恢复控制状态&#xff0c;和信息的下电存储1.继电器故障信息的存储。2. 系统性故障的存储。3.SOC、SOH相关信息的存储。4.均衡参数的存储。5.系统时间信息。6.出厂信息…...

2024-12-29-sklearn学习(25)无监督学习-神经网络模型(无监督) 烟笼寒水月笼沙,夜泊秦淮近酒家。

文章目录 sklearn学习(25) 无监督学习-神经网络模型&#xff08;无监督&#xff09;25.1 限制波尔兹曼机25.1.1 图形模型和参数化25.1.2 伯努利限制玻尔兹曼机25.1.3 随机最大似然学习 sklearn学习(25) 无监督学习-神经网络模型&#xff08;无监督&#xff09; 文章参考网站&a…...

【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码

欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;带你众人皆知的约瑟夫环问题 制作日期&#xff1a;2024.12.29 隶属专栏&#xff1a;C/C题海汇总 目录 引言&#xff1a; 一约瑟夫环问题介绍&#xff1a; 11问题介绍&#xff1a; 1.2起源与历史背景&…...

【Elasticsearch】DSL查询文档

目录 1.DSL查询文档 1.1.DSL查询分类 1.2.全文检索查询 1.2.1.使用场景 1.2.2.基本语法 1.2.3.示例 1.2.4.总结 1.3.精准查询 1.3.1.term查询 1.3.2.range查询 1.3.3.总结 1.4.地理坐标查询 1.4.1.矩形范围查询 1.4.2.附近查询 1.5.复合查询 1.5.1.相关性算分 …...

MySQL第三弹----函数

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;MySQL &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 一、合计/统计函数 1.1count…...

路由器刷机TP-Link tp-link-WDR5660 路由器升级宽带速度

何在路由器上设置代理服务器&#xff1f; 如何在路由器上设置代理服务器&#xff1f; 让所有连接到该路由器的设备都能够享受代理服务器的好处是一个不错的选择&#xff0c;特别是当需要访问特定的网站或加速网络连接的时候。下面是一些您可以跟随的步骤&#xff0c;使用路由器…...

Qml 中实现水印工具

【写在前面】 在 Qt 的 Quick 模块中&#xff0c;QQuickPaintedItem 是一个非常有用的类&#xff0c;它允许我们在 Qml 中自定义绘制逻辑。 我们可以通过这种方式实现水印工具&#xff0c;包括在文本、图片或整个窗口上添加水印。 本文将介绍如何在 Qml 中实现一个简单但功能…...

2024年数字政府服务能力优秀创新案例汇编(附下载)

12月19日&#xff0c;由中国电子信息产业发展研究院指导、中国软件评测中心主办的“2024数字政府评估大会”在北京召开&#xff0c;大会主题是&#xff1a;为公众带来更好服务体验。 会上&#xff0c;中国软件评测中心副主任吴志刚发布了2024年数字政府服务能力评估结果&#…...

数据链路层知识要点

这里写目录标题 数据链路层的功能1.封装成帧2.差错控制2.1循环冗余校验&#xff08;CRC&#xff09;2.2奇偶校验法 3.可靠传输3.1停止等待协议(SW)3.2后退N帧协议(GBN)3.3选择重传协议(SR) 4.使用广播信道的数据链路层5.以太网(局域网)5.1以太网与网卡5.2以太网的MAC地址 6.VLA…...

Linux实验报告6-用户管理

目录 一&#xff1a;实验目的 二&#xff1a;实验内容 (1)查看 Linux 系统的相关文件,回答以下问题 ①root 用户的 UID为多少?他的主目录在哪里? ②请举出一个普通用户,指出他的主目录及其所使用的 shell 是什么? (2)新建用户abc1(abc代表你的姓名拼音字母,下同),为其…...

微信小程序打印生产环境日志

微信小程序打印生产环境日志 新建一个log.js文件&#xff0c;写入以下代码&#xff1a; let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…...

Edge如何获得纯净的启动界面

启动Edge会出现快速链接&#xff0c;推广链接&#xff0c;网站导航&#xff0c;显示小组件&#xff0c;显示信息提要&#xff0c;背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…...

探索开源项目 kernel:技术的基石与无限可能

在开源的广袤世界中&#xff0c;有一颗璀璨的明星——kernel&#xff08;https://gitee.com/openeuler/kernel&#xff09;&#xff0c;它宛如一座技术的宝藏&#xff0c;蕴含着无数的智慧与创新&#xff0c;为众多开发者所瞩目和敬仰。 一、初窥 kernel 项目 当我第一次接触…...

使用PHP函数 “setcookie“ 设置cookie

在网站开发中&#xff0c;cookie是一种非常常用的技术&#xff0c;它用于在用户的浏览器中存储少量的数据&#xff0c;以便在不同页面之间传递信息。PHP提供了一个名为 "setcookie" 的函数&#xff0c;用于设置cookie的值和属性。在本文中&#xff0c;我们将学习如何…...

LUA基础语法

目录 变量篇 算数运算符 条件分支语句与循环语句 函数 表 Table 全局变量与本地变量 协程 元表 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09; 常用自带库 垃圾回收 变量篇 print("hello") print("lua") --注释 --[[…...

链路聚合

链路聚合 目的&#xff1a;备份链路以及提高链路带宽。 链路聚合技术&#xff08;Eth-Trunk&#xff09;&#xff1a;将多个物理接口捆绑成一个逻辑接口&#xff0c;将N条物理链路逻辑上聚合为一条逻辑链路。 正常情况下&#xff0c;想要配置链路聚合 1、A设备通过多条链路连接…...

OpenCV-Python实战(4)——图像处理基础知识

一、坐标 在 OpenCV 中图像左上角坐标为&#xff08;0&#xff0c;0&#xff09;&#xff0c;竖直向下为 Y&#xff08;height&#xff09; &#xff1b;水平向右为 X&#xff08;width&#xff09;。 二、生成图像 2.1 灰度图像 img np.zeros((h,w), dtype np.uint8) i…...

爬虫案例-爬取网页图片

爬虫案例-爬取网页图片 1、安装依赖库2、爬取图片的代码3、效果图 1、安装依赖库 #以下是安装http请求的第三方库 pip install requests urllib3 #以下是安装处理图片的第三方库 pip install image pillow #以下是安装python解析html的第三方库 pip install beautifulsoup4 …...

KAN网络最新优化改进——基于小波变换的KAN网络

KAN网络概念 KAN网络(Kolmogorov-Arnold Networks)是一种革命性的神经网络架构,源于Kolmogorov-Arnold表示定理。 该定理表明,多变量连续函数可通过有限数量的单变量连续函数的嵌套加法表示 。KAN的核心创新在于将传统神经网络中的固定激活函数替换为可学习的单变量函数,…...

【潜意识Java】深入理解Java中的方法重写,理解重写的意义,知道其使用场景,以及重写的访问权限限制等的完整笔记详细总结。

目录 一、方法重写是啥玩意儿 &#xff08;一&#xff09;定义和概念 &#xff08;二&#xff09;为啥要方法重写 二、方法重写的规则 &#xff08;一&#xff09;方法签名必须相同 &#xff08;二&#xff09;返回类型的要求 &#xff08;三&#xff09;访问权限的限制…...

Android Thread优先级和调度算法

Thread优先级设置方式&#xff1a; java&#xff1a; Process.setThreadPriority&#xff1a; android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST、Process.THREAD_PRIORITY_URGENT_AUDIO、-20) c: #include <sched.h> setpriority( https://blo…...

OpenCV-Python实战(6)——图相运算

一、加法运算 1.1 cv2.add() res cv2.add(img1,img2,dstNone,maskNone,dtypeNone) img1、img2&#xff1a;要 add 的图像对象。&#xff08;shape必须相同&#xff09; mask&#xff1a;图像掩膜。灰度图&#xff08;维度为2&#xff09;。 dtype&#xff1a;图像数据类型…...

2、C#基于.net framework的应用开发实战编程 - 设计(二、四) - 编程手把手系列文章...

二、设计&#xff1b; 二&#xff0e;四、制定设计规范&#xff1b; 编码规范在软件编程里起到了非常重要的作用&#xff0c;主要是让代码更加的规范化&#xff0c;更加的简洁&#xff0c;更加的漂亮&#xff0c;更加的能够面向对象显示。 以前那个系列就有发布C#的编码规范的文…...

DVWA靶场Brute Force (暴力破解) 漏洞low(低),medium(中等),high(高),impossible(不可能的)所有级别通关教程

目录 暴力破解low方法1方法2 mediumhighimpossible 暴力破解 暴力破解是一种尝试通过穷尽所有可能的选项来获取密码、密钥或其他安全凭证的攻击方法。它是一种简单但通常无效率的破解技术&#xff0c;适用于密码强度较弱的环境或当攻击者没有其他信息可供利用时。暴力破解的基…...

sql字段值转字段

表alertlabel中记录变字段 如何用alertlabel表得到下面数据 实现的sql语句 select a.AlertID, (select Value from alertlabel where AlertIDa.AlertID and Labelhost) as host, (select Value from alertlabel where AlertIDa.AlertID and Labeljob) as job from (select …...