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

Java进阶:Docker

1. Docker概述

1.1. Docker简介

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。即:Docker是一种容器技术,解决软件跨环境迁移的问题。

Docker应用场景

  • Web 应用的自动化打包和发布
  • 自动化测试和持续集成、发布
  • 在服务型环境中部署和调整数据库或其他的后台应用

使用Docker可以实现开发人员的开发环境、测试人员的测试环境、运维人员的生产环境的一致性。
在这里插入图片描述

Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。

1.2. Docker容器与传统虚拟机比较

  • 传统虚拟机在这里插入图片描述
    传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如:VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。

  • Docker在这里插入图片描述
    Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。

1.3. Docker组成部分

在这里插入图片描述

名称

说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板。 镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。

Docker 容器(Container)

容器是独立运行的一个或一组应用。镜像相当于类,容器相当于类的实例

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker守护进程

是Docker服务器端进程,负责支撑Docker 容器的运行以及镜像的管理。

Docker 仓库DockerHub(Registry)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub提供了庞大的镜像集合供使用。用户也可以将自己本地的镜像推送到Docker仓库供其他人下载。

2. Docker安装与启动

2.1. Docker安装

Docker可以运行在MAC、Windows、CentOS、DEBIAN、UBUNTU等操作系统上,提供社区版和企业版,本课程基于CentOS安装Docker。CentOS6对docker支持的不好,使用docker建议使用CentOS7。

以下是在CentOS7中安装Docker的步骤:

# 1、yum 包更新到最新
sudo yum update
# 2、作用:安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依
赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
# 3.1、方案一:使用ustc的(推荐)
sudo yum-config-manager --add-repohttp://mirrors.ustc.edu.cn/dockerce/linux/centos/docker-ce.repo
# 3.2、方案二:使用阿里云(可能失败)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4、 安装docker;出现输入的界面都按 y
sudo yum install docker-ce
# 5、 查看docker版本
docker -v

2.2. 设置ustc镜像

ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很
快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker

  1. 编辑文件/etc/docker/daemon.json

    # 执行如下命令:
    mkdir /etc/docker
    vi /etc/docker/daemon.json
    
  2. 在文件中加入下面内容

    {"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    

2.3. Docker启动与停止命令

# 启动docker服务:
systemctl start docker
# 停止docker服务:
systemctl stop docker
# 重启docker服务:
systemctl restart docker
# 查看docker服务状态:
systemctl status docker
# 设置开机启动docker服务:
systemctl enable docker

3. Docker常用命令

3.1. 镜像相关命令

镜像:Docker镜像是由文件系统叠加而成(是一种文件的存储形式);是docker中的核心概念,可以认为镜像就是对某些运行环境或者软件打的包,用户可以从docker仓库中下载基础镜像到本地,比如开发人员可以从docker仓库拉取(下载)一个只包含centos7系统的基础镜像,然后在这个镜像中安装jdk、mysql、Tomcat和自己开发的应用,最后将这些环境打成一个新的镜像。开发人员将这个新的镜像提交给测试人员进行测试,测试人员只需要在测试环境下运行这个镜像就可以了,这样就可以保证开发人员的环境和测试人员的环境完全一致。在这里插入图片描述
Docker提供的关于镜像的操作有:

  • 查看镜像
  • 搜索镜像
  • 拉取镜像
  • 删除镜像
3.1.1. 查看镜像
# 查看镜像可以使用如下命令:
docker images

在这里插入图片描述

  • REPOSITORY:镜像名称
  • TAG:镜像标签
  • IMAGE ID:镜像ID
  • CREATED:镜像的创建日期
  • SIZE:镜像大小
3.1.2. 搜索镜像
# 如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称

在这里插入图片描述

  • NAME:镜像名称
  • DESCRIPTION:镜像描述
  • STARS:用户评价,反应一个镜像的受欢迎程度
  • OFFICIAL:是否官方
  • AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
3.1.3. 拉取镜像
# 拉取镜像就是从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本
命令如下:
docker pull 镜像名称
# 如拉取centos 7;
docker pull centos:7

在这里插入图片描述

3.1.4. 删除镜像
# 可以按照镜像id删除镜像,命令如下:
docker rmi 镜像id

在这里插入图片描述

  1. docker rmi $IMAGE_ID:删除指定镜像
  2. docker rmi docker images -q:删除所有镜像

3.2. 容器相关命令

容器,也是docker中的核心概念,容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。

Docker提供的关于容器的操作有:

  • 查看容器
  • 创建容器
  • 启动容器
  • 停止容器
  • 文件拷贝
  • 目录挂载
  • 查看容器ip地址
  • 删除容器
3.2.1. 查看容器

查看正在运行的容器使用命令:docker ps

查看所有容器使用命令:docker ps -a

在这里插入图片描述

3.2.2. 创建并启动容器

可以基于已有的镜像来创建和启动容器,创建与启动容器使用命令:docker run

参数说明:
-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

–name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

3.2.2.1. 交互式容器

以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态。

# 先拉取一个镜像;这一步不是每次启动容器都要做的,而是因为前面我们删除了镜像,无镜像可用所以才再拉取一个
docker pull centos:7
#创建并启动名称为 mycentos7 的交互式容器;下面指令中的镜像名称 centos:7 也可以使用镜像id
docker run -it --name=mycentos7 centos:7 /bin/bash

在这里插入图片描述

3.2.2.2. 守护式容器

创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。命令如下(容器名称不能重复):

#创建并启动守护式容器
docker run -di --name=mycentos2 centos:7
#登录进入容器命令为:docker exec -it container_name (或者 container_id) /bin/bash(exit退出
时,容器不会停止)
docker exec -it mycentos2 /bin/bash

在这里插入图片描述

3.2.3. 停止并启动容器
# 停止正在运行的容器:docker stop 容器名称或者ID
docker stop mycentos2
# 启动已运行过的容器:docker start 容器名称或者ID
docker start mycentos2

在这里插入图片描述

3.2.4 文件拷贝
  • 将linux宿主机中的文件拷贝到容器内可以使用命令:

    # docker cp 需要拷贝的文件或目录 容器名称:容器目录
    # 创建一个文件abc.txt
    touch abc.txt
    # 复制abc.txt到mycentos2的容器的 / 目录下
    docker cp abc.txt mycentos2:/
    # 进入mycentos2容器
    docker exec -it mycentos2 /bin/bash
    # 查看容器 / 目录下文件
    ll
    

    在这里插入图片描述

  • 将文件从容器内拷贝出来到linux宿主机使用命令:

    # docker cp 容器名称:容器目录 需要拷贝的文件或目录
    #进入容器后创建文件cba.txt
    touch cba.txt
    # 退出容器
    exit
    # 在Linux宿主机器执行复制;将容器mycentos2的/cba.txt文件复制到 宿主机器的/root目录下
    docker cp mycentos2:/cba.txt /root
    

    在这里插入图片描述

    注意:容器在停止状态下也可以完成文件的拷贝

3.2.5. 目录挂载

可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器时添加-v参数,后边为宿主机目录:容器目录,例如: docker run -di -v /usr/local/test:/usr/local/test –
name=mycentos3 centos:7

# 创建linux宿主机器要挂载的目录
mkdir /usr/local/test
# 创建并启动容器mycentos3,并挂载linux中的/usr/local/test目录到容器的/usr/local/test;也就是在
linux中的/usr/local/test中操作相当于对容器相应目录操作
docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7
# 在linux下创建文件
touch /usr/local/test/def.txt
# 进入容器
docker exec -it mycentos3 /bin/bash
# 在容器中查看目录中是否有对应文件def.txt
ll /usr/local/test

在这里插入图片描述

注意:如果你共享的是多级的目录,可能会出现权限不足的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。

3.2.6. 查看容器ip

可以通过以下命令查看容器运行的各种数据 docker inspect 容器名称(容器ID)

# 在linux宿主机下查看 mycentos3 的ip
docker inspect mycentos3

在这里插入图片描述

容器之间在一个局域网内,linux宿主机器可以与容器进行通信;但是外部的物理机笔记本是不能与容器直接通信的,如果需要则需要通过宿主机器端口的代理。

3.2.7. 删除容器

删除指定的容器:docker rm 容器名称(容器ID) 删除所有容器:docker rm docker ps -a -q

# 删除容器
docker rm mycentos7

在这里插入图片描述

如果容器是运行状态则删除失败,需要停止容器才能删除

4. Docker应用部署

4.1. MySQL部署

4.1.1. 拉取镜像
# 拉取MySQL 5.7镜像
docker pull centos/mysql-57-centos7

在这里插入图片描述

4.1.2. 创建容器

·docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql·

  • -p 代表端口映射,格式为 宿主机映射端口:容器运行端口

  • -e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登陆密码(如果是在容器中使用root登录的话,那么其密码为空)

    创建mysql5.7容器

    docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-
    57-centos7

在这里插入图片描述

4.1.3. 操作容器MySQL
# 拉取MySQL 5.7镜像
docker exec -it mysql5.7 /bin/bash
# 登录容器里面的mysql
mysql -u root -p

在这里插入图片描述

4.1.4. 远程登录MySQL
# 查看ip;如果以后要内部连接该mysql,如其他容器中要连接mysql容器的mysql的时候,可以使用如下命令查看Ip
docker inspect mysql5.7

在这里插入图片描述
使用Navicat在windows中进行远程登录在docker容器中的mysql。
在这里插入图片描述

4.2. Tomcat部署

4.2.1. 拉取镜像
# 拉取tomcat镜像
docker pull tomcat

在这里插入图片描述

4.2.2. 创建容器
# 创建tomcat容器;并挂载了webapps目录
docker run -di --name=mytomcat -p 9000:8080 -v
/usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat
# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work.
#执行如下操作
# 1、编辑 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打开的文件中后面添加
net.ipv4.ip_forward=1
# 3、重启network
systemctl restart network

在这里插入图片描述
测试访问宿主机的端口号为9000的 tomcat。地址:http://宿主机ip:9000,也可以往/user/local/tomcat/webapps下部署应用,然后再访问。

4.3. Nginx部署

4.3.1. 拉取镜像
# 拉取nginx镜像
docker pull nginx
4.3.2. 创建容器
# 创建nginx容器
docker run -di --name=mynginx -p 80:80 nginx

启动后再宿主机上访问:http://宿主机IP/

4.4. Redis部署

4.4.1. 拉取镜像
# 拉取redis镜像
docker pull redis
4.4.2. 创建容器
# 创建redis容器
docker run -di --name=myredis -p 6379:6379 redis
4.4.3. 操作redis容器
#进入redis容器
docker exec -it myredis /bin/bash
#进入redis安装目录
cd /usr/local/bin
#连接redis
./redis-cli

在这里插入图片描述

4.4.4. 远程连接redis

可以使用redis图形界面客户端工具连接redis,端口也是6379。

5. Docker Compose

5.1. Compose简介

5.1.1. 概念

Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的docker应用工具。使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件
创建和运行所有的服务。

5.1.2. 组成

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例。

  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名
    字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose
    所完成的任务。
  • 项目(project):由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义。即是
    Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如:要部署一个Web项目,除了Web服务容器,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

5.2. 安装与卸载

Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。

5.2.1. 安装
curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(
uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version

在这里插入图片描述

5.2.2. 卸载
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

5.3. Compose常用命令参考

使用Compose前,可以通过执行docker-compose --help|-h来查看Compose基本命令用法。

也可以通过执行docker-compose [COMMAND] --help或者docker-compose --help [COMMAND] 来查看某个具体的使用格式。

可以知道Compose命令的基本的使用格式为:

docker-compose [-f 参数...] [options] 1 [COMMAND] [ARGS...]

命令选项如下:

-f,–file FILE指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,–project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
-x-network-driver 使用Docker的可拔插网络后端特性(需要Docker 1.9 及以后版本)
-x-network-driver DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9 及以后版本)
-verbose输出更多调试信息
-v,–version打印版本并退出

Docker Compose常用命令列表如下:

命令

说明

build

构建项目中的服务容器

help

获得一个命令的帮助

kill

通过发送SIGKILL信号来强制停止服务容器

config

验证和查看compose文件配置

create

为服务创建容器。只是单纯的create,还需要使用start启动compose

down

停止并删除容器,网络,镜像和数据卷

exec

在运行的容器中执行一个命令

logs

查看服务容器的输出

pause

暂停一个服务容器

port

打印某个容器端口所映射的公共端口

ps

列出项目中目前的所有容器

pull

拉取服务依赖的镜像

push

推送服务镜像

restart

重启项目中的服务

rm

删除所有(停止状态的)服务容器

run

在指定服务上执行一个命令

scale

设置指定服务运行的容器个数

start

启动已经存在的服务容器

stop

停止已经处于运行状态的容器,但不删除它

top

显示运行的进程

unpause

恢复处于暂停状态中的服务

up

自动完成包括构建镜像、创建服务、启动服务并关闭关联服务相关容器的一些列操作

version

打印版本信息

5.3.1. up

格式为:

docker-compose up [options] [--scale SERVICE=1 NUM...] [SERVICE...]

up命令十分强大,它尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一些列操作。链接的服务都将会被自动启动,除非已经处于运行状态。

多数情况下我们可以直接通过该命令来启动一个项目。

选项包括:

-d 在后台运行服务容器
–no-color 不使用颜色来区分不同的服务的控制输出
–no-deps 不启动服务所链接的容器
–force-recreate 强制重新创建容器,不能与–no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, --timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
–scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
5.3.2. ps

格式为:

docker-compose ps [options] 1 [SERVICE...]

列出项目中目前的所有容器。

选项包括:

-q 只打印容器的ID信息
5.3.3. stop

格式为:

docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。

选项包括:

-t, --timeout TIMEOUT 停止容器时候的超时(默认为10秒)
5.3.4. down

格式为:

docker-compose down [options]

停止和删除容器、网络、卷、镜像,这些内容是通过docker-compose up命令创建的. 默认值删除 容器 网络,可以通过指定 rmi 、volumes参数删除镜像和卷。

选项包括:

–rmi type 删除镜像,类型必须是: ‘all’: 删除compose文件中定义的所以镜像;‘local’: 删除镜像名为空的
镜像
-v, --volumes 删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans 删除服务中没有在compose中定义的容器
5.3.5. restart

格式为:

docker-compose restart [options] 1 [SERVICE...]

重启项目中的服务。

选项包括:

-t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为10秒)
5.3.6. rm

格式为:

docker-compose rm [options] [SERVICE...]

删除所有(停止状态的)服务容器。

选项包括:

–f, --force 强制直接删除,包括非停止状态的容器
-v 删除容器所挂载的数据卷
5.3.7. start

格式为:

docker-compose start [SERVICE...]

启动已经存在的服务容器。

5.3.8. run

格式为:

docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE
[COMMAND] [ARGS...]

在指定服务上执行一个命令。
例如:

docker-compose run ubuntu 1 ping www.baidu.com

将会执行一个ubuntu容器,并执行ping www.baidu.com命令。
默认情况下,如果存在关联,则所有关联的服务将会自动被启动,除非这些服务已经在运行中。该命令类似于启动容器后运行指定的命令,相关卷、链接等都会按照配置自动创建。有两个不同点:

  1. 给定命令将会覆盖原有的自动运行命令
  2. 不会自动创建端口,以避免冲突

如果不希望自动启动关联的容器,可以使用–no-deps选项,例如:

docker-compose run --no-deps web

将不会启动web容器关联的其他容器。

选项包括:

-d 在后台运行服务容器
–name NAME 为容器指定一个名字
–entrypoint CMD 覆盖默认的容器启动指令
-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量
-u, --user="" 指定运行容器的用户名或者uid
–no-deps 不自动启动管理的服务容器
–rm 运行命令后自动删除容器,d模式下将忽略
-p, --publish=[] 映射容器端口到本地主机
–service-ports 配置服务端口并映射到本地主机
-v, --volume=[] 绑定一个数据卷,默认为空
-T 不分配伪tty,意味着依赖tty的指令将无法运行
-w, --workdir="" 为容器指定默认工作目录
5.3.9. config

格式为:

docker-compose config [options]

验证并查看compose文件配置。

选项包括:

–resolve-image-digests 将镜像标签标记为摘要
-q, --quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
–services 打印服务名,一行一个
–volumes 打印数据卷名,一行一个
5.3.10. kill

格式为:

docker-compose kill [options] 1 [SERVICE...]

通过发送SIGKILL信号来强制停止服务容器。 支持通过-s参数来指定发送的信号,例如:通过如下指令发送SIGINT信号:

docker-compose kill -s SIGINT

5.3.11. create

格式为:

docker-compose create [options] [SERVICE...]

为服务创建容器.只是单纯的create,还需要使用start启动compose。
选项包括:

–force-recreate 重新创建容器,即使它的配置和镜像没有改变,不兼容–no-recreate参数
–no-recreate 如果容器已经存在,不需要重新创建. 不兼容–force-recreate参数
–no-build 不创建镜像,即使缺失
–build 创建容器前,生成镜像
5.3.12. exec

格式为:

docker-compose exec [options] SERVICE COMMAND [ARGS...]

与docker exec 命令功能相同,可以通过service name登陆到容器中。
选项包括:

-d 分离模式,后台运行命令.
–privileged 获取特权.
–user USER 指定运行的用户.
-T 禁用分配TTY. By default docker-compose exec分配 a TTY.
–index=index 当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose
exec --index=1 web /bin/bash ,web服务中包含多个容器

5.4. Compose模版文件

模板文件是使用Compose的核心,涉及的指令关键字也比较多,大部分指令与docker run 相关参数的含义都是类似的。默认的模板文件名称为docker-compose.yml,格式为YAML格式。

比如一个Compose模板文件:

version: "2"
services:web:images: nginxports:- "8080:80"volumes:- /usr/local/abc:/usr/local/cba
#volumes:#networks:

Docker Compose的模板文件主要分为3个区域,如下:

  • services
    服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等。
  • volumes
    数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用。
  • networks
    应用的网络,在它下面可以定义应用的名字、使用的网络类型等等。

Docker Compose常用模板文件主要命令:

指令

功能

build

指定服务镜像Dockerfile所在路径

cap_add,cap_drop

指定容器的内核能力(capacity)分配

command

覆盖容器启动后默认执行的命令

cgroup_parent

指定父cgroup组,意味着将基础该组的资源限制

container_name

指定容器名称。默认将会使用项目名称服务名称序号这样的格式

devices

指定设置映射关系

dns

自定义DNS服务器。可以是一个值,也可以是一个列表

dns_search

配置DNS搜索域。可以是一个值,也可以是一个列表

dockerfile

指定额外编译镜像的Dockerfile文件,可以通过该指令来指定

env_file

从文件中获取环境变量,可以为单独的文件路径或列表

environment

设置环境变量,可以使用数组或字典两种格式

expose

暴露端口

external_links

链接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器

extra_hosts

指定额外的host名称映射信息

image

指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取这个镜像

labels

指定服务镜像Dockerfile所在路径

links

链接到其他服务中的容器

log_driver

指定日志驱动类型,类似于Docker中的–log-driver参数。目前支持三种日志驱动类型:log_driver:“json-file”、log_driver:“syslog”、log_driver:“none”log_opt 日志驱动的相关参数

net

设置网络模式。参数类似于docker clinet的–net参数一样

pid跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程ID来相互访问和操作

ports

暴露端口信息

security_opt

指定容器模板标签(label)机制的默认属性(如用户、角色、类型、级别等)

ulimits

指定容器的ulimits限制值

volumes

数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)

5.5. Compose应用

需求:编写compose模版文件,实现同时启动tomcat、mysql和redis容器。

5.5.1. 编写模版文件
# 创建文件夹
mkdir -p /usr/local/mycompose
#进入文件夹
cd /usr/local/mycompose
#创建 docker-compose.yml文件;内容如下
vi docker-compose.yml

docker-compose.yml文件内容如下(文件内容请从 资料配置文件docker-compose.yml 复制):

version: '3'
services:redis1:image: redisports:- "6379:6379"container_name: "redis1"networks:- devmysql1:image: centos/mysql-57-centos7environment:MYSQL_ROOT_PASSWORD: "root"ports:- "3306:3306"container_name: "mysql1"networks:- devweb1:image: tomcatports:- "9090:8080"container_name: "web1"networks:- dev- pro
networks:dev:driver: bridgepro:driver: bridge

上面我们声明了3个服务;分别是:redis1、mysql1、web1;并且对3个服务都指定了对应的docker 镜像和端口。

5.5.2. 启动
#启动前最好把docker重启,不然原来的tomcat/mysql/redis容器也是启动状态的话,那么端口会冲突而启动失败
systemctl restart docker
cd /usr/local/mycompose
docker-compose up
# 如果后台启动则使用如下命令
docker-compose up -d
# 若要停止
docker-compose stop

可以查看到命令中,创建了两个自定义的网络(mycompose_dev和mycompose_pro),然后创建容器,并「Attaching to …」,将网络应用到服务上。

可以查看一下具体的网络,使用docker network ls 如下:
在这里插入图片描述
查看启动的容器:
在这里插入图片描述

5.5.3. 测试

在windows下访问启动的3个服务进行测试都可以;如下面访问9090的tomcat如下:
在这里插入图片描述

6. 迁移与备份

在这里插入图片描述
其中涉及到的命令有:

  • docker commit 将容器保存为镜像
  • docker save 将镜像备份为tar文件
  • docker load 根据tar文件恢复为镜像

6.1. 将Docker容器保存为镜像

使用docker commit命令可以将容器保存为镜像。
命令形式:docker commit 容器名称 镜像名称

# 保存nginx容器为镜像
docker commit mynginx mynginx

此镜像的内容就是当前容器的内容,接下来你可以用此镜像再次运行新的容器

6.2. 镜像备份

使用docker save命令可以将已有镜像保存为tar 文件。
命令形式:docker save –o tar文件名 镜像名

# 保存镜像为文件
docker save -o mynginx.tar mynginx

在这里插入图片描述

6.3. 镜像恢复与迁移

使用docker load命令可以根据tar文件恢复为docker镜像。

命令形式:docker load -i tar文件名

# 停止mynginx容器
docker stop mynginx
# 删除mynginx容器
docker rm mynginx
# 删除mynginx镜像
docker rmi mynginx
# 加载恢复mynginx镜像
docker load -i mynginx.tar
# 在镜像恢复之后,基于该镜像再次创建启动容器
docker run -di --name=mynginx -p 80:80 mynginx

在这里插入图片描述
在这里插入图片描述

注意:在执行docker load命令恢复镜像时,需要先删除原镜像。

7. Dockerfile文件

7.1. 什么是Dockerfile文件

前面的课程中已经知道了,要获得镜像,可以从Docker仓库中进行下载。那如果我们想自己开发一个镜像,那该如何做呢?答案是:Dockerfile

Dockerfile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的描述来构建镜像。

Dockerfile文件内容一般分为4部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行的指令

7.2. Dockerfile常用命令

在这里插入图片描述

7.3. 使用Dockerfile创建镜像

# 1、创建目录
mkdir –p /usr/local/dockerjdk8
cd /usr/local/dockerjdk8
# 2、下载jdk-8u202-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
# 3、在/usr/local/dockerjdk8目录下创建Dockerfile文件,文件内容如下:
vi Dockerfile
FROM centos:7
MAINTAINER ITCAST
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 4、执行命令构建镜像;不要忘了后面的那个 .
docker build -t='jdk1.8' .
# 5、查看镜像是否建立完成
docker images

在这里插入图片描述

7.4. 基于镜像创建容器

基于刚刚创建的镜像 jdk1.8 创建并启动容器进行测试;

# 创建并启动容器
docker run -it --name=testjdk jdk1.8 /bin/bash
# 在容器中测试jdk是否已经安装
java -version

在这里插入图片描述

8. Docker私有仓库

8.1. 私有仓库搭建与配置

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

私有仓库搭建步骤:

# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://宿主机ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库
搭建成功
# 4、修改daemon.json
vi /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将宿主机ip修改为自己宿主
机真实ip
{"insecure-registries":["宿主机ip:5000"]}
# 5、重启docker 服务
systemctl restart docker
docker start registry

在这里插入图片描述
在这里插入图片描述

8.2. 将镜像上传至私有仓库

操作步骤:

# 1、标记镜像为私有仓库的镜像
docker tag jdk1.8 宿主机IP:5000/jdk1.8
# 2、再次启动私有仓库容器
docker restart registry
# 3、上传标记的镜像
docker push 宿主机IP:5000/jdk1.8
# 4、输入网址查看仓库效果

在这里插入图片描述
在这里插入图片描述

8.3. 从私有仓库拉取镜像

8.3.1. 私有仓库所在服务器拉取镜像

若是在私有仓库所在的服务器上去拉取镜像;那么直接执行如下命令:

# 因为私有仓库所在的服务器上已经存在相关镜像;所以先删除;请指定镜像名,不是id
docker rmi 服务器ip:5000/jdk1.8
#拉取镜像
docker pull 服务器ip:5000/jdk1.8
#可以通过如下命令查看 docker 的信息;了解到私有仓库地址
docker info

在这里插入图片描述
执行 docker info 命令之后显示内容:在这里插入图片描述

在仓库所在服务器上去拉取镜像是比较少有的操作;作为了解即可。

8.3.2. 其它服务器拉取私有仓库镜像

大多数情况下,都是某台服务器部署了私有镜像仓库之后;到其它服务器上从私有仓库中拉取镜像,若要拉取私有仓库镜像需要去修改docker的配置文件,设置启动时候的仓库地址。

# 打开配置文件
vi /usr/lib/systemd/system/docker.service
# 在打开的上述文件中按照下面的图,添加如下的内容;注意修改下面内容中的ip地址
--add-registry=192.168.12.135:5000 --insecure-registry=192.168.12.135:5000 

修改完后需要重新加载docker配置文件并重启docker

systemctl daemon-reload
systemctl restart docker

在这里插入图片描述
在重启之后;那么则可以去拉取私有仓库中的镜像:

# 执行拉取镜像命令并查看
docker pull jdk1.8
docker images

在这里插入图片描述
整体docker的私有仓库运作形如下图:在这里插入图片描述

相关文章:

Java进阶:Docker

1. Docker概述 1.1. Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱…...

Winform禁止高分辨下缩放布局成功方法

Windows自动缩放布局会导致窗体上的按钮和文本挤在一起根本看不清楚。 那么该如何解决呢? 具体操作步骤如下: 1、在项目属性上切换到【安全性】菜单,勾选【启用ClickOnce安全设置】,然后立刻取消勾选; 为了生成app.…...

力扣142题——环形链表II

#题目# #代码# #链接# 这道链表题还是需要一些思维,这里把代码随想录的链接也贴在这里,有需要的小伙伴自行点击: https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%…...

工厂设计模式

工厂设计模式 简介 工厂模式是一种创建型设计模式,用于创建产品,代替手动new,主要包括简单工厂模式、工厂方法模式、抽象工厂模式。 一、简单工厂模式 定义:通过一个工厂类根据传入的参数匹配创建的产品 结构组成&#xff1a…...

网络安全之探险

因为工作相关性,看着第三方公司出具的网络安全和shentou测试报告就想更深入研究一下,于是乎开始探索网络安全方面的知识,度娘、知乎开始一步步开始,总结昨天学到皮毛知识。 1.考证大全,开始是奔着这个目的去的 2.有用…...

Python基础语法精要

文章目录 一、Python的起源二、Python的用途三、Python的优缺点优点缺点 四、基础语法(1)常量和表达式(2)变量变量的语法(i)定义变量(ii)变量命名的规则 (3)变…...

C语言(枚举类型)

目录 1、什么是枚举 2、枚举成员的类型 3、枚举类型的实际应用 1、什么是枚举 枚举的定义就是:枚举(Enumeration)是一种用户自定义的数据类型,用于定义一组具有离散值的符号常量。 那通俗一点说就是把一些固定的值,一…...

讯方·智汇云校华为授权培训机构的介绍

官方授权 华为授权培训服务伙伴(Huawei Authorized Learning Partner,简称HALP)是获得华为授权,面向公众(主要为华为企业业务的伙伴/客户)提供与华为产品和技术相关的培训服务,培养华为产业链所…...

高级 Conda 使用:环境导出、共享与优化

1. 引言 在 Conda 的基础包管理功能中,我们了解了如何安装、更新和卸载包。但对于开发者来说,如何更好地管理环境、导出环境配置、共享环境,以及如何优化 Conda 的使用效率,才是提高工作效率的关键。本篇博客将进一步深入 Conda …...

从算法到落地:DeepSeek如何突破AI工具的同质化竞争困局

🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 ​ Linux网络编程笔记: https://blog.cs…...

P9584 「MXOI Round 1」城市

题目描述 小 C 是 F 国的总统,尽管这个国家仅存在于网络游戏中,但他确实是这个国家的总统。 F 国由 n 个城市构成,这 n 个城市之间由 n−1 条双向道路互相连接。保证从任意一个城市出发,都能通过这 n−1 条双向道路,…...

CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发

CodeGPT IDEA DeepSeek,在IDEA中引入DeepSeek 版本说明 建议和我使用相同版本,实测2022版IDEA无法获取到CodeGPT最新版插件。(在IDEA自带插件市场中搜不到,可以去官网搜索最新版本) ToolsVersionIntelliJ IDEA202…...

Filter过滤器

Filter:过滤器 概念: web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能 过滤器的作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符处理… 过滤器的生…...

git如何下载指定版本

要使用Git下载指定版本,可以通过以下步骤进行操作‌: ‌1. 使用Git命令行下载指定版本‌: 1.1 首先,使用git clone命令克隆整个git库到本地。例如:git clone [库的URL]。这将下载最新的代码到本地。‌ 1.2 进入克隆…...

开源的 DeepSeek-R1「GitHub 热点速览」

春节假期回来,一睁眼全是王炸级的开源模型 DeepSeek-R1! GitHub 地址→github.com/deepseek-ai/DeepSeek-R1 DeepSeek-R1 开源还不到一个月,Star 数就飙升至冲破天际的 70k。虽然目前仅开源了模型权重,但同时发布的技术论文详细地…...

Open FPV VTX开源之OSD使用分类

Open FPV VTX开源之OSD使用分类 1. 源由2. 硬件2.1 【天空端】SigmaStar2.2 【天空端】Raspberry Pi2.3 【地面端】 3. 软件3.1 天空端软件3.2 地面端软件 4. 分类4.1 嵌入式OSD分类A1-嵌入式OSD:SigmaStar Android分类A2-嵌入式OSD:SigmaStar Hi3536分…...

请求超时处理

RequestMapping("/test") public DeferredResult<String> test() {DeferredResult<String> deferredResult new DeferredResult<>(6000L); // 设置超时时间为6秒// 模拟长时间任务new Thread(() -> {try {Thread.sleep(10000); // 模拟10秒的任…...

利用prompt技术结合大模型对目标B/S架构软件系统进行测试

利用prompt技术结合大模型对目标B/S架构软件系统进行测试,可参考以下步骤和方法: 测试需求理解与prompt设计 明确测试点:梳理B/S架构软件系统的功能需求、非功能需求(如性能、安全性、兼容性等),确定具体的测试点,如用户登录功能、数据查询功能、系统响应时间要求等。设…...

Go 语言里中的堆与栈

在 Go 语言里&#xff0c;堆和栈是内存管理的两个重要概念&#xff0c;它们在多个方面存在明显差异&#xff1a; 1. 内存分配与回收方式 栈 分配&#xff1a;Go 语言中&#xff0c;栈内存主要用于存储函数的局部变量和调用信息。当一个函数被调用时&#xff0c;Go 会自动为其…...

【人工智能】如何选择合适的大语言模型,是能否提高工作效率的关键!!!

DeepSeek R1入门指南 导读一、提示语差异1.1 指令侧重点不同1.2 语言风格差异1.3 知识运用引导不同 二、挑选原则2.1 模型选择2.2 提示语设计2.3 避免误区 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在前面的内容中&#xff0c…...

常见的IP地址分配方式有几种:深入剖析与适用场景‌

在数字互联的世界里&#xff0c;IP地址如同网络世界的“门牌号”&#xff0c;是设备间通信的基础。随着网络技术的飞速发展&#xff0c;IP地址的分配方式也日趋多样化&#xff0c;以适应不同规模、不同需求的网络环境。本文将深入探讨当前主流的几种IP地址分配方式&#xff0c;…...

无人机常见的开源飞控项目

开源飞控软件项目为无人机等无人载具的开发和应用提供了丰富的资源和灵活的解决方案&#xff0c;以下是一些常见的开源飞控软件项目&#xff1a; 1、PX4 简介&#xff1a;PX4 是一个高度模块化、可扩展的开源飞行控制平台&#xff0c;被广泛应用于各种类型的无人机&#xff0…...

模型报错infeasible,如何查看冲突约束

在使用Gurobi求解模型时&#xff0c;如果模型不可行&#xff08;infeasible&#xff09;&#xff0c;可以通过以下步骤来查看冲突的约束或变量&#xff0c;帮助诊断问题&#xff1a; 1. 使用 computeIIS() 方法 Gurobi 提供了 computeIIS() 方法&#xff0c;用于计算不可行模…...

谭浩强C语言程序设计(5) 9章

1、统计三个候选人的票数 #include <cstdio> // 引入标准输入输出库 #include <cstring> // 引入字符串处理库&#xff0c;用于 strcmp 函数 #define N 10 // 定义一个宏常量 N&#xff0c;表示数组的最大长度// 定义一个结构体 Person&#xff0c;用于存储…...

Large Language Model Distilling Medication Recommendation Model

摘要&#xff1a;药物推荐是智能医疗系统的一个重要方面&#xff0c;因为它涉及根据患者的特定健康需求开具最合适的药物。不幸的是&#xff0c;目前使用的许多复杂模型往往忽视医疗数据的细微语义&#xff0c;而仅仅严重依赖于标识信息。此外&#xff0c;这些模型在处理首次就…...

STM32F407通过FSMC扩展外部SRAM和NAND FLASH

1 扩展外部SRAM 1.1 地址情况 FSMC控制器的存储区分为4个区(Bank)&#xff0c;每个区256MB。其中&#xff0c;Bank1可以用于连接SRAM、NOR FLASH、PSRAM&#xff0c;还可以连接TFT LCD。Bank1的地址范围是0x60000000&#xff5e;0x6FFFFFFF。Bank1又分为4个子区&#xff0c;每…...

ArcGIS注册开发账号及API KEY

注册与激活 Sign up | ArcGIS Location Platform 填写信息&#xff0c;然后邮箱收到激活邮件&#xff0c;激活&#xff0c;再补充信息。 参考 Tutorial: Create an API key | Documentation | Esri Developer 产生API KEY Tutorial: Create an API key | Documentation |…...

C++-----------酒店客房管理系统

酒店客房管理系统 要求&#xff1a; 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订&#xff0c;系统会自动判断客房的可用情况; 4.入住管理:客户入住…...

AI 编程私有化部署,在使用 cline 时,可能无法避免私隐的泄漏问题

摘录&#xff1a;Cline Privacy Policy https://github.com/cline/cline/blob/main/docs/PRIVACY.md Key Points Cline operates entirely client-side as a VS Code extensionNo code or data is collected, stored, or transmitted to Clines servers 问题是&#xff1a…...

DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解

DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解全集&#xff1a; 第一部分&#xff1a;Windows本地部署DeepSeek R1 第二部分&#xff1a;Macos本地部署DeepSeek R1 第三部分&#xff1a;Linux本地部署DeepSeek R1 第四部分&#xff1a;DeepSeek …...

2.14学习总结

#include <stdio.h> #include <stdlib.h> #include <math.h>#define MAX_N 32767// 二分查找最接近目标值的元素 int binarySearch(int* arr, int left, int right, int target) {while (left < right) {int mid left (right - left) / 2;if (arr[mid] …...

基于单片机的并联均流电源设计(论文+源码)

2.1 系统的功能及方案设计 两个电源&#xff0c;实现电流均衡效果。 在对系统进行功能设计过程中&#xff0c;主要框图如图2.1所示&#xff0c;系统的控制核心主要是由AT89S52单片机来进行控制&#xff0c;主要的核心控制模块由AT89S52单片机,两路由LM22673构成的DC/DC降压电路…...

Flask使用JWT认证

理解 JWT 认证&#x1f92b; 嘿&#xff0c;朋友们&#xff01;今天我们来聊一些在开发世界中非常酷的事情&#xff0c;那就是 Json Web Token&#xff0c;简称 JWT。这种小巧的规范使得在组织之间传递信息变得如此简单&#xff0c;就像把你的秘密记在一张纸上然后递给朋友一样…...

Reinforcement Learning Heats Up 强化学习持续升温

Reinforcement Learning Heats Up 强化学习持续升温 核心观点&#xff1a;强化学习正成为构建具有高级推理能力大语言模型&#xff08;LLMs&#xff09;的重要途径。 最新进展 模型示例&#xff1a;近期出现了如DeepSeek - R1及其变体&#xff08;DeepSeek - R1 - Zero&#xf…...

一维差分算法篇:高效处理区间加减

那么在正式介绍我们的一维差分的原理前&#xff0c;我们先来看一下一维差分所应用的一个场景&#xff0c;那么假设我们现在有一个区间为[L,R]的一个数组&#xff0c;那么我要在这个数组中的某个子区间比如[i,m] (L<i<m<R)进行一个加k值或者减去k值的一个操作&#xff…...

解决 paddle ocr 遇到 CXXABI_1.3.13 not found 的问题

ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version CXXABI_1.3.13 not found (required by /home/hum/anaconda3/envs/ipc/lib/python3.11/site-packages/paddle/base/libpaddle.so) 通过命令检查 strings /lib/x86_64-linux-gnu/libstdc.so.6|grep CXXABI 而实际上我…...

DeepSeek助力:打造属于你的GPTs智能AI助手

文章目录 一、环境准备1.安装必要的工具和库2. 选择合适的开发语言 二、核心技术选型1. 选择适合的AI框架 三、功能实现1. 文本生成与对话交互2. 代码生成与自动补全3. 数据分析与报告生成 四、案例实战1. 搭建一个简单的聊天机器人2. 创建一个代码生成器 五、总结与展望1. 当前…...

用pytorch实现一个简单的图片预测类别

前言&#xff1a; 在阅读本文之前&#xff0c;你需要了解Python&#xff0c;Pytorch&#xff0c;神经网络的一些基础知识&#xff0c;比如什么是数据集&#xff0c;什么是张量&#xff0c;什么是神经网络&#xff0c;如何简单使用tensorboard,DataLoader。 本次模型训练使用的是…...

jemalloc 5.3.0的base模块的源码及调用链使用场景的详细分析

一、背景 这篇博客&#xff0c;我们继续之前的 由jemalloc 5.3.0初始化时的内存分配的分析引入jemalloc的三个关键概念及可借鉴的高性能编码技巧-CSDN博客 博客里对初始化分配逻辑进行分析&#xff0c;已经涉及到了jemalloc 5.3.0里的非常重要的base模块的一部分逻辑&#xff…...

Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案

本文是对 Redis 知识的补充&#xff0c;在了解了如何搭建多种类型的 Redis 集群&#xff0c;并清楚了 Redis 集群搭建的过程的原理和注意事项之后&#xff0c;就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。 引言&#xff1a;虽然 Redis 是单线程的&#xf…...

DevOps工具链概述

1. DevOps工具链概述 1.1 DevOps工具链的定义 DevOps工具链是支持DevOps实践的一系列工具的集合&#xff0c;这些工具覆盖了软件开发的整个生命周期&#xff0c;包括需求管理、开发、测试、部署和运维等各个环节。它旨在通过工具的集成和自动化&#xff0c;打破开发与运维之间…...

开启AI绘画的魔法大门!探索Stable Diffusion的无限魅力~

Stable diffusion介绍&#xff1a; “StableDiffusion是一款创新的AI工具&#xff0c;将原始文本转化为精美图像。用户可调整图像的细节、风格、明暗等参数&#xff0c;创建个性化的高质量图像。这款高效的绘图工具便利了建筑、设计和插画等行业的专业人士&#xff0c;满足了他…...

LVS 负载均衡集群(DR 模式)

一、LVS-DR 模式核心原理 1.1. DR 模式工作原理 LVS-DR&#xff08;Direct Routing&#xff09;模式通过 数据链路层&#xff08;MAC 层&#xff09; 实现负载均衡&#xff0c;其核心特点是 请求流量经过 Director&#xff0c;响应流量由 Real Server 直接返回客户端&#xf…...

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…...

网页五子棋——通用模块

目录 项目创建 通用功能模块 错误码 自定义异常类 CommonResult jackson 加密工具 项目创建 使用 idea 创建 SpringBoot 项目&#xff0c;并引入相关依赖&#xff1a; 配置 MyBatis&#xff1a; 编辑 application.yml&#xff1a; spring:datasource: # 数据库连接配…...

FastAPI 高并发与性能优化

FastAPI 高并发与性能优化 目录 &#x1f680; 高并发应用设计原则&#x1f9d1;‍&#x1f4bb; 异步 I/O 优化 Web 服务响应速度⏳ 在 FastAPI 中优化异步任务执行顺序&#x1f512; 高并发中的共享资源与线程安全问题 1. &#x1f680; 高并发应用设计原则 在构建高并发应…...

阿里云IOT消息处理

文章主要讲述了阿里云IOT平台如何处理设备上报的消息、如何将消息路由到不同的处理逻辑、如何进行消息转发与转换等操作。 一、接收IOT消息 1.创建订阅 2.案列代码 官网案例代码&#xff1a;如何将AMQP JMS客户端接入物联网平台接收消息_物联网平台(IoT)-阿里云帮助中心 代码…...

缓存三大问题及其解决方案

缓存三大问题及其解决方案 1. 前言 ​ 在现代系统架构中&#xff0c;缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致&#xff0c;通常会给缓存数据设置一个过期时间。当系统接收到用户请求时&#xff0c;首先会访问缓存。如果缓…...

如何在VSCode中免费使用DeepSeek R1:本地大模型编程助手全攻略

目录 一、DeepSeek R1为何值得开发者关注? 1.1 开源的推理王者 1.2 性能实测对比 二、三步搭建本地AI编程环境 2.1 硬件准备指南 2.2 三大部署方案详解 方案一:LM Studio(新手友好) 方案二:Ollama(Docker玩家首选) 方案三:Jan(跨平台利器) 2.3 常见报错解决…...

ECCV2022 | LGV | LGV:利用大几何邻域提升对抗样本的可迁移性

LGV: Boosting Adversarial Example Transferability from Large Geometric Vicinity 摘要-Abstract引言-Introduction实验设置-Experimental SettingsLGV: 源于大几何邻域的迁移性-LGV: Transferability from Large Geometric Vicinity研究LGV特性&#xff1a;损失几何的重要性…...