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

Docker的安装和使用

容器技术

容器与虚拟机的区别

  • 虚拟机 (VM)

  • VM包含完整的操作系统,并在虚拟化层之上运行多个操作系统实例。

  • VM需要更多的系统资源(CPU、内存、存储)来管理这些操作系统实例。

  • 容器 (Container)

  • 容器共享主机操作系统的内核,具有独立的文件系统、进程和网络空间。

  • 容器更轻量级,启动速度快,占用资源少。

特性虚拟机容器
启动时间几分钟几秒
资源开销高(包含操作系统内核)低(共享主机操作系统内核)
性能中等高(更接近主机性能)
隔离级别强(完全隔离)较弱(共享内核)
适用场景多种操作系统和更高安全隔离需求快速部署、微服务、开发测试等

容器化的优点

  • 快速启动:容器可以在几秒钟内启动,提高了开发和部署效率。

  • 轻量级:容器共享主机操作系统内核,占用更少的系统资源。

  • 一致性:确保应用程序在开发、测试和生产环境中的行为一致,减少“环境问题”。

  • 便捷性:容器化应用可以打包成独立的单元,便于分发、复制和管理。

  • 可移植性:容器化应用可以在任何支持Docker的平台上运行,无需修改代码。

Docker的基本概念

镜像 (Image)

Docker镜像是一个轻量级、独立、可执行的软件包,包含了运行某个应用程序所需的全部内容,包括代码、运行时、库、环境变量和配置文件。镜像是只读的,当容器启动时,Docker会在镜像的顶部添加一个可写层。

容器 (Container)

容器是镜像的一个运行实例,它包括了镜像中的所有内容以及一个可写层。容器是独立的、可移植的单元,可以在任何支持Docker的平台上运行。

仓库 (Repository)

Docker仓库是存储和分发镜像的地方。Docker Hub是官方的公共仓库,用户也可以搭建私有仓库来存储自己的镜像。仓库中可以包含多个镜像,每个镜像可以有不同的标签(Tag)。

Docker引擎 (Docker Engine)

Docker引擎是一个轻量级的运行时和工具集,用于创建和管理容器。它包括以下组件:

  • Docker守护进程 (Docker Daemon):负责管理容器的生命周期。

  • Docker CLI (命令行界面):用于与Docker守护进程交互的命令行工具。

  • Docker Registries (镜像仓库):存储和分发Docker镜像。

Docker架构

Docker客户端与服务端

Docker采用了客户端-服务端(Client-Server)架构,客户端通过Docker CLI与服务端的Docker守护进程通信。Docker CLI发送命令给Docker守护进程,后者负责执行这些命令(如构建、运行和分发容器)。

Docker的组件

  • Docker守护进程 (Docker Daemon):后台进程,负责管理Docker对象(如镜像、容器、网络和卷)。

  • Docker CLI:命令行工具,用户通过它与Docker守护进程通信。

  • Docker Registries:存储和分发Docker镜像的地方,包含公共的Docker Hub和私有的Docker Registry。

安装Docker

  • Windows

  • 下载并安装Docker Desktop for Windows。

  • 启动Docker Desktop并进行基本配置。

  • 验证安装:在命令行中运行docker --version

  • macOS

  • 下载并安装Docker Desktop for Mac。

  • 启动Docker Desktop并进行基本配置。

  • 验证安装:在终端中运行docker --version

  • Linux

  • 更新APT包索引:sudo apt-get update

  • 安装必要的包:sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

  • 添加Docker的官方GPG密钥:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  • 设置Docker的稳定版仓库:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

  • 安装Docker Engine:sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io

  • 验证安装:sudo docker --version

  • 以Ubuntu为例:

Docker镜像

Docker镜像是构建容器的基础,它包含了应用程序运行所需的所有依赖和配置。镜像是不可变的,每次运行镜像时都会生成一个新的容器实例。

常见的Docker镜像源包括:

  • Docker Hub:最广泛使用的公共镜像库,包含了大量官方和社区维护的镜像。

  • 私有镜像库:用户可以搭建自己的Docker Registry来存储和管理私有镜像。

Docker镜像的基础操作

拉取镜像 (docker pull)

docker pull命令用于从镜像仓库拉取镜像。语法如下:

docker pull <镜像名>:<标签>

例如,拉取官方的nginx镜像:

docker pull nginx:latest

查看镜像 (docker images)

docker images命令用于列出本地存储的所有Docker镜像。语法如下:

docker images

删除镜像 (docker rmi)

docker rmi命令用于删除本地的Docker镜像。语法如下:

docker rmi <镜像ID或镜像名>:<标签>

例如,删除nginx镜像:

docker rmi nginx:latest

构建Docker镜像

Dockerfile是一个文本文件,包含了构建Docker镜像所需的一系列指令。每个指令在构建过程中创建镜像的一层。常用的Dockerfile指令包括:

  • FROM:指定基础镜像

  • RUN:在镜像内执行命令

  • COPY:将文件从宿主机复制到镜像内

  • CMD:指定容器启动时要执行的命令

Dockerfile指令

  • FROM

FROM ubuntu:20.04

指定基础镜像为Ubuntu 20.04。

  • RUN

RUN apt-get update && apt-get install -y nginx

在镜像内执行命令,安装nginx。

  • COPY

COPY . /app

将当前目录下的所有文件复制到镜像内的/app目录。

  • CMD

CMD ["nginx", "-g", "daemon off;"]

指定容器启动时执行的命令。

构建镜像 (docker build)

docker build命令用于根据Dockerfile构建镜像。语法如下:

docker build -t <镜像名>:<标签> <Dockerfile路径>

例如,构建一个名为mynginx的镜像:

docker build -t mynginx:latest .

优化Docker镜像

多阶段构建

多阶段构建可以在一个Dockerfile中使用多个FROM指令,减少最终镜像的大小。例如:

# 第一阶段:构建应用程序  
FROM golang:1.16 as builder  
WORKDIR /app  
COPY . .  
RUN go build -o myapp  # 第二阶段:创建最终镜像  
FROM alpine:latest  
WORKDIR /app  
COPY --from=builder /app/myapp .  
CMD ["./myapp"]

镜像瘦身技巧

  • 使用轻量级基础镜像:如Alpine Linux。

  • 减少镜像层数:合并多个RUN指令。

  • 清理不必要的文件:在Dockerfile中删除临时文件。

管理镜像

标签用于标识镜像的不同版本。通过标签,用户可以方便地管理和拉取特定版本的镜像。例如:

docker tag nginx:latest mynginx:v1.0

通过合理使用标签和版本控制系统(如Git),可以有效管理镜像的不同版本,确保应用程序在各个环境中的一致性。

Docker容器

Docker容器是运行在Docker引擎上的独立运行环境。每个容器都是从一个镜像启动的,并在镜像的基础上添加一个可写层。容器提供了应用程序的隔离环境,使其运行所需的所有依赖和配置都封装在容器内。

镜像是静态的文件系统和应用程序配置的组合,而容器是镜像的运行实例。当我们启动一个容器时,Docker会在镜像的基础上创建一个可写层,从而使容器变得可操作。镜像可以被多次使用来创建多个容器。

Docker容器的基本操作

创建并启动容器 (docker run)

docker run命令用于创建并启动一个容器。语法如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

例如,运行一个nginx容器:

docker run -d -p 80:80 nginx

此命令会下载nginx镜像(如果本地没有),然后在后台运行一个nginx容器,并将主机的80端口映射到容器的80端口。

停止与重启容器 (docker stop, docker start)

  • 停止容器

docker stop <容器ID或容器名>

例如,停止一个名为mynginx的容器:

docker stop mynginx

  • 重启容器

docker start <容器ID或容器名>

例如,重启mynginx容器:

docker start mynginx

进入容器 (docker exec, docker attach)

  • 使用docker exec进入容器

docker exec命令用于在运行的容器内执行命令。语法如下:

docker exec -it <容器ID或容器名> <命令>

例如,进入一个正在运行的容器的bash环境:

docker exec -it mynginx /bin/bash

  • 使用docker attach连接到容器

docker attach命令用于连接到一个运行中的容器。语法如下:

docker attach <容器ID或容器名>

例如,连接到mynginx容器:

docker attach mynginx

容器的生命周期管理

容器的状态管理

  • 查看运行中的容器

docker ps

该命令列出所有正在运行的容器。

  • 查看所有容器(包括停止的)

docker ps -a

  • 删除容器

docker rm <容器ID或容器名>

例如,删除mynginx容器:

docker rm mynginx

持久化存储 (Volumes)

Docker容器中的数据默认是临时的,当容器删除时,数据也随之删除。为了持久化数据,我们可以使用卷(Volumes)。

  • 创建卷

docker volume create <卷名>

例如,创建一个名为myvolume的卷:

docker volume create myvolume

  • 使用卷

在运行容器时挂载卷:

docker run -d -p 80:80 -v myvolume:/data nginx

该命令将myvolume挂载到容器内的/data目录。

  • 查看卷

docker volume ls

  • 删除卷

docker volume rm <卷名>

容器网络

Docker的网络模式

Docker提供了多种网络模式,用于配置容器之间的通信。

  • 桥接网络 (Bridge Network)

默认网络模式。每个容器连接到一个桥接网络,可以通过容器IP进行通信。

docker run --network bridge <镜像>

  • 主机网络 (Host Network)

容器与主机共享网络栈。

docker run --network host <镜像>

  • 无网络 (None Network)

容器不连接到任何网络。

docker run --network none <镜像>

自定义网络

  • 创建自定义桥接网络

docker network create <网络名>

例如,创建一个名为mynetwork的自定义桥接网络:

docker network create mynetwork

  • 将容器连接到自定义网络

docker run --network mynetwork <镜像>

容器间通信

通过自定义网络,可以使用容器名直接进行通信。例如,在mynetwork中运行两个容器,一个容器可以通过另一个容器的名字进行通信:

docker run -d --network mynetwork --name container1 nginx docker run -d --network mynetwork --name container2 nginx

此时,container2可以通过ping container1与container1通信。

容器日志与调试

容器日志查看 (docker logs)

docker logs命令用于查看容器的日志。语法如下:

docker logs <容器ID或容器名>

例如,查看mynginx容器的日志:

docker logs mynginx

容器调试技巧

  • 查看容器内进程

docker top <容器ID或容器名>

  • 检查容器的资源使用情况

docker stats <容器ID或容器名>

  • 导出容器的元数据

docker inspect <容器ID或容器名>

Docker仓库与Docker Hub

Docker仓库用于存储和分发Docker镜像,方便开发团队之间共享应用程序。Docker仓库分为公共仓库和私有仓库。公共仓库如Docker Hub,提供了大量的开源镜像资源;私有仓库则用于存储企业内部的专有镜像,保障安全和合规。

Docker Hub是最广泛使用的Docker公共仓库,提供了海量的官方和社区镜像。用户可以从Docker Hub拉取、推送镜像,并使用Docker Hub的CI/CD集成功能。

使用Docker Hub

创建Docker Hub账户

  1. 访问 Docker Hub https://hub.docker.com

  2. 点击“Sign Up”按钮进行注册。

  3. 填写相关信息并完成账户注册。

登录Docker Hub

在命令行中使用docker login命令登录Docker Hub:

docker login

输入Docker Hub的用户名和密码即可完成登录。

拉取镜像 (docker pull)

从Docker Hub拉取镜像非常简单,使用docker pull命令:

docker pull <镜像名>:<标签>

例如,拉取官方的Python镜像:

docker pull python:3.9

推送镜像 (docker push)

要推送镜像到Docker Hub,首先需要给镜像打标签,然后推送:

  1. 给镜像打标签:

docker tag <本地镜像ID或名称>:<标签> <Docker Hub用户名>/<镜像名>:<标签>

例如,将本地镜像myapp打标签为Docker Hub的myapp:

docker tag myapp:latest myusername/myapp:latest

  1. 推送镜像:

docker push <Docker Hub用户名>/<镜像名>:<标签>

例如,推送myapp镜像:

docker push myusername/myapp:latest

管理镜像库

在Docker Hub网站上可以管理自己的镜像库,包括创建新的仓库、设置仓库的可见性(公共或私有)、查看镜像的详细信息和下载次数等。

私有Docker仓库

搭建私有仓库

Docker官方提供了一个开源的私有仓库实现——Docker Registry。可以使用官方的Registry镜像快速搭建一个私有仓库。

  1. 拉取Registry镜像:

docker pull registry:2

  1. 运行Registry容器:

docker run -d -p 5000:5000 --name myregistry registry:2

此时,私有仓库将运行在本地主机的5000端口。

推送和拉取私有仓库的镜像

  1. 给镜像打标签:

docker tag <本地镜像ID或名称>:<标签> localhost:5000/<镜像名>:<标签>

例如,将本地镜像myapp打标签为私有仓库的myapp:

docker tag myapp:latest localhost:5000/myapp:latest

  1. 推送镜像:

docker push localhost:5000/myapp:latest

  1. 拉取镜像:

docker pull localhost:5000/myapp:latest

安全性配置

为了提高私有仓库的安全性,可以启用SSL/TLS和基础认证。

  • 启用SSL/TLS

需要生成自签名证书或从CA获取证书,并配置Registry容器使用这些证书。

生成自签名证书:

mkdir -p certs  
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt  

启动Registry容器时挂载证书:

docker run -d -p 5000:5000 --name myregistry \  -v $(pwd)/certs:/certs \  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \  registry:2  
  • 启用基础认证

需要创建一个包含用户名和密码的htpasswd文件,并配置Registry容器使用这个文件。

安装htpasswd工具:

sudo apt-get install apache2-utils

创建htpasswd文件:

mkdir -p auth  
htpasswd -Bc auth/htpasswd myusername  

启动Registry容器时挂载htpasswd文件:

docker run -d -p 5000:5000 --name myregistry \  -v $(pwd)/auth:/auth \  -e "REGISTRY_AUTH=htpasswd" \  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \  -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \  registry:2  

Docker仓库的高级功能

自动构建

Docker Hub提供了自动构建功能,可以与GitHub或Bitbucket集成,当代码库有新的提交时自动构建并推送镜像。

  • 设置自动构建
  1. 在Docker Hub上创建新的仓库,选择自动构建。

  2. 连接到GitHub或Bitbucket,选择代码库和分支。

  3. 配置Dockerfile的路径和构建规则。

Webhooks

Webhooks允许Docker Hub在镜像构建完成后向指定的URL发送HTTP请求,用于触发后续的CI/CD流程。

  • 配置Webhooks
  1. 在Docker Hub仓库的设置页面,找到Webhooks。

  2. 添加新的Webhook,填写目标URL。

镜像扫描

Docker Hub提供了镜像扫描功能,可以扫描镜像中的已知漏洞,帮助提高应用程序的安全性。

  • 启用镜像扫描在Docker Hub仓库的设置页面,启用镜像扫描功能。每次推送新镜像时,Docker Hub将自动进行安全扫描,并提供扫描报告。

Docker Compose

Docker Compose 是用于定义和运行多容器Docker应用程序的工具。通过一个简单的YAML文件,用户可以配置应用程序需要的所有服务,并使用单个命令启动和停止这些服务。Compose 是开发、测试和部署微服务架构应用的利器。

Docker Compose 通常与Docker一起安装,但也可以单独安装。以下是在不同平台上的安装步骤:

  • Linux:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  
sudo chmod +x /usr/local/bin/docker-compose  
  • MacOS: 使用 Homebrew 安装

brew install docker-compose

  • Windows: Docker Desktop 自带Docker Compose,安装 Docker Desktop 即可。

Docker Compose的基本概念

服务(Services)

在Docker Compose中,服务定义了一个容器的配置。一个服务可以是数据库、Web服务器等。Compose文件通过services关键字定义多个服务,每个服务对应一个容器。

网络(Networks)

Compose允许定义多个网络,服务可以连接到这些网络中进行通信。默认情况下,Compose会为所有服务创建一个默认网络。

卷(Volumes)

卷用于持久化存储。Compose允许定义卷,并将其挂载到服务的容器中。

Docker Compose文件格式

一个简单的docker-compose.yml文件示例如下:

version: '3'  
services:  web:  image: nginx  ports:  - "80:80"  db:  image: mysql:5.7  environment:  MYSQL_ROOT_PASSWORD: example  

版本(Version)

Compose文件的版本定义了语法的格式,不同版本支持的功能有所不同。建议使用最新的版本(如3或3.8)。

version: '3.8'

服务配置详解

  • image: 指定使用的镜像

  • build: 指定构建镜像的上下文路径和Dockerfile

  • ports: 端口映射

  • environment: 环境变量

  • volumes: 卷的挂载

services:  web:  image: nginx  ports:  - "80:80"  volumes:  - ./html:/usr/share/nginx/html  db:  image: mysql:5.7  environment:  MYSQL_ROOT_PASSWORD: example  volumes:  - db_data:/var/lib/mysql  

网络配置

默认情况下,所有服务都连接到一个名为default的网络。可以定义自定义网络:

networks:  frontend:  backend:  

并将服务连接到这些网络:

services:  web:  networks:  - frontend  db:  networks:  - backend  

卷配置

在Compose文件中可以定义卷:

volumes:  db_data:  

并将其挂载到服务的容器中:

services:  db:  volumes:  - db_data:/var/lib/mysql  

Docker Compose的基本操作

启动和停止服务 (docker-compose up, docker-compose down)

  • 启动服务:

docker-compose up

该命令将启动Compose文件中定义的所有服务,并在控制台中输出日志。

  • 后台运行服务:

docker-compose up -d

  • 停止服务:

docker-compose down

查看服务状态 (docker-compose ps)

docker-compose ps命令用于查看当前运行的服务状态:

docker-compose ps

重启服务 (docker-compose restart)

docker-compose restart命令用于重启服务:

docker-compose restart <服务名>

查看服务日志 (docker-compose logs)

docker-compose logs命令用于查看服务的日志:

docker-compose logs <服务名>

Docker Compose的高级功能

多环境配置

通过使用多个Compose文件,可以为不同的环境(如开发、测试、生产)定义不同的配置。

  • 基础Compose文件 (docker-compose.yml):
version: '3.8'  
services:  web:  image: nginx  ports:  - "80:80"  
  • 覆盖Compose文件 (docker-compose.override.yml):
version: '3.8'  
services:  web:  environment:  - NGINX_ENV=development  
  • 启动服务时,会自动应用覆盖文件:
docker-compose up  
  • 自定义环境Compose文件:

例如,为生产环境创建docker-compose.prod.yml:

version: '3.8'  
services:  web:  environment:  - NGINX_ENV=production  

启动时指定环境文件:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d  

扩展服务

通过scale选项可以扩展服务的副本数量,用于负载均衡和高可用。

  • 扩展服务副本:
docker-compose up -d --scale web=3  

以上命令将启动3个web服务的副本。

依赖管理

可以通过depends_on选项管理服务启动的依赖关系。例如,web服务依赖于db服务:

services:  web:  image: nginx  depends_on:  - db  db:  image: mysql:5.7  environment:  MYSQL_ROOT_PASSWORD: example  

假设我们要构建一个简单的Web应用程序,包括一个前端服务(使用nginx)、一个后端服务(使用Node.js)和一个数据库服务(使用MySQL)。

创建一个docker-compose.yml文件,定义前端、后端和数据库服务:

version: '3.8'  
services:  frontend:  image: nginx:latest  ports:  - "80:80"  volumes:  - ./frontend:/usr/share/nginx/html  networks:  - app-network  backend:  build:  context: ./backend  dockerfile: Dockerfile  ports:  - "3000:3000"  networks:  - app-network  db:  image: mysql:5.7  environment:  MYSQL_ROOT_PASSWORD: example  MYSQL_DATABASE: appdb  volumes:  - db_data:/var/lib/mysql  networks:  - app-network  networks:  app-network:  volumes:  db_data:  

创建必要的目录和文件:

  • 前端目录结构:
frontend/  
└── index.html  
  • 后端目录结构:
backend/  
├── Dockerfile  
└── app.js  

编写前端的index.html:

<!DOCTYPE html>  
<html>  
<head>  <title>My App</title>  
</head>  
<body>  <h1>Hello from Nginx</h1>  
</body>  
</html>  

编写后端的Dockerfile:

FROM node:14  
WORKDIR /app  
COPY package*.json ./  
RUN npm install  
COPY . .  
EXPOSE 3000  
CMD ["node", "app.js"]  

编写后端的app.js:

const express = require('express');  
const app = express();  
const port = 3000;  app.get('/', (req, res) => {  res.send('Hello from Node.js');  
});  app.listen(port, () => {  console.log(`Server is running on http://localhost:${port}`);  
});  

启动应用:

docker-compose up -d

此时,应用的前端服务通过http://localhost访问,后端服务通过http://localhost:3000访问。

Docker Swarm

Docker Swarm是Docker原生的容器编排工具,用于在多主机上管理和编排Docker容器。Swarm集群由多个Docker引擎组成,提供了高可用性、扩展性和负载均衡等功能。使用Swarm,开发者可以像管理单个Docker实例一样,管理整个集群中的多个节点和容器。

Docker Swarm和Kubernetes是两种主要的容器编排工具。Swarm集成在Docker中,使用简单,适合中小型项目;Kubernetes功能强大,适合大规模复杂应用。根据项目需求选择合适的编排工具,是提升开发和运维效率的关键。

Docker Swarm的基本概念

节点(Nodes)

Swarm集群由多个节点组成。每个节点都是一个运行Docker的主机,分为管理节点(Manager Node)和工作节点(Worker Node)。管理节点负责集群管理和任务调度,工作节点负责实际运行容器。

服务(Services)

服务是Swarm管理的基本单位。服务定义了应用程序的容器镜像、运行参数和数量。Swarm会根据服务定义在集群中部署和管理容器。

任务(Tasks)

任务是服务的具体实例。每个任务对应一个运行中的容器,Swarm负责调度和管理任务,确保服务的高可用性和负载均衡。

堆栈(Stacks)

堆栈是由多个服务组成的应用程序。使用堆栈,开发者可以定义和管理整个应用的服务、网络和卷。堆栈文件类似于Compose文件,但适用于Swarm集群。

设置和管理Docker Swarm集群

初始化Swarm集群

在主机上初始化Swarm集群,使用docker swarm init命令:

docker swarm init --advertise-addr <管理节点IP>

初始化成功后,命令行会输出加入Swarm集群的命令和token。

加入和离开Swarm集群

在工作节点上,使用docker swarm join命令加入集群:

docker swarm join --token <worker-token> <管理节点IP>:2377

使用docker swarm leave命令离开集群:

docker swarm leave

在管理节点上使用docker swarm leave --force命令强制离开并停止集群:

docker swarm leave --force

管理节点和角色

  • 查看节点列表:

docker node ls

  • 提升节点为管理节点:

docker node promote <节点ID>

  • 降级管理节点为工作节点:

docker node demote <节点ID>

创建和管理Swarm服务

创建服务

使用docker service create命令创建服务:

docker service create --name <服务名> --replicas <副本数量> <镜像>

例如,创建一个运行nginx的服务:

docker service create --name web --replicas 3 -p 80:80 nginx

更新服务

使用docker service update命令更新服务:

docker service update --replicas <新的副本数量> <服务名>

例如,将web服务的副本数量更新为5:

docker service update --replicas 5 web

删除服务

使用docker service rm命令删除服务:

docker service rm <服务名>

例如,删除web服务:

docker service rm web

查看服务状态

使用docker service ls命令查看服务列表:

docker service ls

使用docker service ps命令查看服务的任务状态:

docker service ps <服务名>

Swarm支持服务的滚动更新,确保应用程序在更新过程中保持高可用性。使用docker service update命令并指定更新参数:

docker service update --image <新镜像> <服务名>

例如,更新web服务的镜像:

docker service update --image nginx:latest web

如果服务更新出现问题,可以使用docker service rollback命令回滚到上一个版本:

docker service rollback <服务名>

Swarm支持创建覆盖网络,使容器可以跨主机通信。使用docker network create命令创建覆盖网络:

docker network create --driver overlay <网络名>

然后在服务创建时指定网络:

docker service create --name <服务名> --network <网络名> <镜像>

Swarm支持配置和密钥管理,确保敏感信息安全地传递给服务。使用docker configdocker secret命令管理配置和密钥。

例如,创建一个配置:

echo "my-config-data" | docker config create my-config -

在服务创建时使用配置:

docker service create --name <服务名> --config source=my-config,target=/path/in/container <镜像>

写在最后

Docker作为现代容器化技术的核心,极大地改变了软件开发、测试和部署的方式。

最后我们来个简单的总结,方便大家快速的掌握本文内容,能看到最后的勇士,可以好好记总结部分。

Docker的基础概念

  • 容器(Container):轻量级、独立的可执行软件包,包括应用程序及其所有依赖项。

  • 镜像(Image):不可变的容器模板,用于创建容器。

  • Docker引擎(Docker Engine):运行Docker容器的核心引擎。

  • Dockerfile:构建Docker镜像的脚本,定义了镜像的构建过程。

Docker的基本操作

  • 镜像操作

  • docker pull:从Docker Hub拉取镜像。

  • docker build:根据Dockerfile构建镜像。

  • docker push:将镜像推送到Docker Hub。

  • 容器操作

  • docker run:启动容器。

  • docker stop:停止容器。

  • docker rm:删除容器。

  • docker exec:在运行中的容器内执行命令。

数据管理与网络

  • 卷(Volume):持久化存储,独立于容器生命周期。

  • 创建和管理卷:docker volume createdocker volume lsdocker volume rm

  • 卷挂载:在docker run命令中使用-v选项。

  • 网络(Network):容器之间通信的桥梁。

  • 创建和管理网络:docker network createdocker network lsdocker network rm

  • 网络模式:Bridge、Host、Overlay等。

Docker Compose

  • 定义和运行多容器应用

  • 使用YAML文件定义服务、网络和卷。

  • 启动和管理服务:docker-compose updocker-compose downdocker-compose ps

  • 高级功能

  • 多环境配置:通过多个Compose文件支持不同环境配置。

  • 扩展服务:通过docker-compose scale扩展服务副本。

Docker Swarm

  • 集群管理和编排

  • 初始化Swarm集群:docker swarm init

  • 加入和离开集群:docker swarm joindocker swarm leave

  • 管理节点和服务:docker nodedocker service

  • 高级功能

  • 服务滚动更新和回滚:docker service updatedocker service rollback

  • 配置和密钥管理:docker configdocker secret

  • 多主机网络:通过Overlay网络实现跨主机通信。

相关文章:

Docker的安装和使用

容器技术 容器与虚拟机的区别 虚拟机 (VM) VM包含完整的操作系统&#xff0c;并在虚拟化层之上运行多个操作系统实例。 VM需要更多的系统资源&#xff08;CPU、内存、存储&#xff09;来管理这些操作系统实例。 容器 (Container) 容器共享主机操作系统的内核&#xff0c;具…...

Flink系统知识讲解之:Flink内存管理详解

Flink系统知识讲解之&#xff1a;Flink内存管理详解 在现阶段&#xff0c;大部分开源的大数据计算引擎都是用Java或者是基于JVM的编程语言实现的&#xff0c;如Apache Hadoop、Apache Spark、Apache Drill、Apache Flink等。Java语言的好处是不用考虑底层&#xff0c;降低了程…...

使用JMeter模拟多IP发送请求!

你是否曾遇到过这样的场景&#xff1a;使用 JMeter 进行压力测试时&#xff0c;单一 IP 被服务器限流或者屏蔽&#xff1f;这时&#xff0c;如何让 JMeter 模拟多个 IP 发送请求&#xff0c;成功突破测试限制&#xff0c;成为测试工程师必须攻克的难题。今天&#xff0c;我们就…...

【Ubuntu与Linux操作系统:六、软件包管理】

第6章 软件包管理 6.1 Linux软件安装基础 Linux的软件包是以二进制或源码形式发布的程序集合&#xff0c;包含程序文件和元数据。软件包管理器是Linux系统的重要工具&#xff0c;用于安装、更新和卸载软件。 1. 常见的软件包管理器&#xff1a; DEB 系统&#xff08;如Ubunt…...

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列&#xff0c;需要 processingTimei 的时长完成执行。 现…...

【前端动效】原生js实现拖拽排课效果

目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;页面左侧有一个包含不同课程&#xff08;如语文、数学等&#xff09;的列表&#xff0c;页面右侧…...

C#使用OpenTK绘制3D可拖动旋转图形三棱锥

接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…...

排序的本质、数据类型及算法选择

排序的本质、数据类型及算法选择 一、排序的本质二、排序的数据类型三、排序算法的选择依据 前两天老金写了篇 “十大排序简介”&#xff0c;有点意犹未尽&#xff0c;这一回老金想把排序连根拔起&#xff0c;从排序的本质说道说道。 一、排序的本质 从字面上理解&#xff0c…...

Python的列表基础知识点(超详细流程)

目录 一、环境搭建 二、列表 2.1 详情 2.2 列表定义 2.3 列表长度 2.4 列表索引 2.5 切片索引 2.6 添加 2.7 插入 2.8 剔除 2.8.1 pop方法 2.8.2 del方法 2.9 任何数据类型 2.10 拼接 2.10.1 “” 2.10.2 “*” 2.11 逆序 ​编辑 2.12 计算出现次数 2.13 排序…...

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现

HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现 最近在学习鸿蒙开发过程中&#xff0c;阅读了官方文档&#xff0c;在之前做flutter时候&#xff0c;经常使用overlay&#xff0c;使用OverlayEntry加入到overlayState来做添加悬浮按钮、提示弹窗、加载中指示器、加载失败的t…...

【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】

第1章 Ubuntu安装与基本使用 1.1 Linux与Ubuntu Linux是一种开源、类Unix操作系统内核&#xff0c;拥有高稳定性和强大的网络功能。由于其开源性和灵活性&#xff0c;Linux被广泛应用于服务器、嵌入式设备以及桌面环境中。 Ubuntu是基于Debian的一个流行Linux发行版&#xf…...

React 元素渲染

React 元素渲染 React 是一个用于构建用户界面的 JavaScript 库&#xff0c;它允许开发人员创建大型应用程序&#xff0c;这些应用程序可以随着时间的推移而高效地更新和渲染。React 的核心概念之一是元素渲染&#xff0c;它描述了如何将 JavaScript 对象转换为 DOM&#xff0…...

【2024年华为OD机试】 (C卷,100分)- 括号匹配(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个字符串&#xff0c;里边可能包含“()”、“[]”、“{}”三种括号&#xff0c;请编写程序检查该字符串中的括号是否成对出现&#xff0c;且嵌套关系正确。 若括号成对出现且嵌套关系正确&#xff0c;或该字符串中无括号字符&#xff0c;输出&am…...

解锁企业数字化转型新力量:OpenCoze(开源扣子)

在当今数字化浪潮席卷之下&#xff0c;企业对于高效管理和协同运作的需求愈发迫切&#xff0c;而开源技术正逐渐成为众多企业破局的关键利器。今天&#xff0c;想给大家介绍一款极具潜力的开源项目 ——OpenCoze&#xff0c;中文名称 “开源扣子”。 一、OpenCoze 是什么&…...

【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题解析

文章目录 选择题答案及解析理论题答案及解析实操题答案及解析下一步进阶 选择题答案及解析 RIP路由协议是基于哪种算法的动态路由协议&#xff1f; 答案&#xff1a;B. 距离矢量算法解析&#xff1a;链路状态算法用于OSPF等协议&#xff1b;最小生成树算法主要用于生成树协议&…...

【微服务】8、分布式事务 ( XA 和 AT )

文章目录 利用Seata解决分布式事务问题&#xff08;XA模式&#xff09;AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…...

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…...

TypeScript Jest 单元测试 搭建

NPM TypeScript 项目搭建 创建目录 mkdir mockprojectcd mockproject初始化NPM项目 npm init -y安装TypeScript npm i -D typescript使用VSCode 打开项目 创建TS配置文件tsconfig.json {"compilerOptions": {"target": "es5","module&…...

基于 SSH 的任务调度系统

文末附有完整项目代码 在当今科技飞速发展的时代&#xff0c;任务调度系统的重要性日益凸显。本文将详细介绍一个基于 SSH&#xff08;SpringStruts2Hibernate&#xff09;的任务调度系统的设计与实现。 一、系统概述 本系统旨在改变传统人工任务调度方式&#xff0c;通过计算…...

filestream安装使用全套+filebeat的模块用法

1 filestream介绍 官方宣布&#xff1a;输入类型为log在filebeat7.16版本已经弃用了 Filestream 是 Filebeat 中的一种 输入类型&#xff08;Input&#xff09;&#xff0c;用于处理日志文件的读取。它是为了取代 Filebeat 中传统的 log 输入&#xff08;Input&#xff09;设…...

java项目之房屋租赁系统源码(springboot+mysql+vue)

项目简介 房屋租赁系统实现了以下功能&#xff1a; 房屋租赁系统的主要使用者分为&#xff1a; 系统管理&#xff1a;个人中心、房屋信息管理、预约看房管理、合同信息管理、房屋报修管理、维修处理管理、房屋评价管理等模块的查看及相应操作&#xff1b; 房屋信息管理&#…...

sap mm学习笔记

1. 业务流程 2. 组织架构 3. 物料主数据 4.采购主数据 5. 采购管理 6. 库存管理 7.物料主数据 8. 采购申请 ME51N...

代码随想录_链表

代码随想录02 链表 203.移除链表元素 力扣题目链接(opens new window) 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;he…...

EF Code 并发控制

【悲观控制】 不推荐用&#xff0c;EF Core 没有封装悲观并发控制的使用&#xff0c;需要使用原生Sql来使用悲观并发控制 一般使用行锁、表锁等排他锁对资源进行锁定&#xff0c;同时只有一个使用者操作被锁定的资源 拿sql server举例&#xff0c;可以使用表所、或者行所解决…...

ceph fs status 输出详解

ceph fs status 命令用于显示 Ceph 文件系统的状态信息&#xff0c;其中各列的含义如下&#xff1a; RANK&#xff1a;元数据服务器&#xff08;MDS&#xff09;的等级或标识符。 STATE&#xff1a;MDS 的当前状态&#xff0c;例如 active&#xff08;活跃&#xff09;、stan…...

FFmpeg Muxer HLS

使用FFmpeg命令来研究它对HLS协议的支持程度是最好的方法&#xff1a; ffmpeg -h muxerhls Muxer HLS Muxer hls [Apple HTTP Live Streaming]:Common extensions: m3u8.Default video codec: h264.Default audio codec: aac.Default subtitle codec: webvtt. 这里面告诉我…...

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起&#xff0c;支持了列存引擎&#xff0c;允许表和索引以行存、纯列存或行列冗余的形式创建&#xff0c;且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外&#xff0c;也有用户询问如何通过SQL语句…...

回归预测 | MATLAB实GRU多输入单输出回归预测

回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…...

【OpenGL/Assimp】渲染模型、半透明材质与封装光源

文章目录 渲染成果Assimp库准备&#xff1a;Mesh类修改&#xff1a;透明贴图使用&#xff1a;光源封装&#xff1a;使用方式在如下测试环境中&#xff1a; 渲染成果 Assimp库准备&#xff1a; 从GitHub拉取源码&#xff0c;根据网络教程&#xff0c;借助CMake生成VS工程项目&a…...

pandas与sql对应关系【帮助sql使用者快速上手pandas】

本页旨在提供一些如何使用pandas执行各种SQL操作的示例&#xff0c;来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…...

网站一般做多大像素/品牌推广渠道有哪些

简单有效的文本匹配&#xff0c;具有更丰富的对齐功能 github: https://github.com/daiyizheng/shortTextMatch/blob/master/src/DL_model/classic_models/models/RE2.py 本文作者提出了一种快速、强神经网络的通用文本匹配方法。保持序列间对齐可用的三个关键特征:原始点方向…...

手机自适应的网站怎么做/论坛推广软件

文章目录现象原因解决更新 20200318现象 由于安装anaconda3时在是否把anaconda3加入path那里 Add to Path…(Not recommend) 是不建议的&#xff0c;因此很多安装时会不勾选这一选项。 然后使用vscode调用cmd运行Python的编辑器调试Python时&#xff0c;终端经常会出现诸如 …...

盐城个人网站建设/株洲网页设计

线程同步基础 并发场景下&#xff0c;有时我们并不仅仅想保护数据&#xff0c;我们还希望多个线程之间同步某些操作&#xff0c;例如等待某个条件为真或者某个事件发生时执行一些操作。C标准库提供了条件变量&#xff08;condition variables&#xff09;和futures&#xff1b…...

政府网站建设总结报告/自己制作网页的网站

da-dapps在过去的几周中&#xff0c;我们使用Blockstack构建了一个去中心化的应用程序 &#xff0c;使您可以创建和保存Web应用程序片段。 到目前为止&#xff0c;这些代码段已私下保存到您自己的个人存储中。 甚至应用程序的创建者都无法访问它们&#xff01; 但是网络也是关于…...

怎样做班级网站/搜索引擎优化的方法有哪些

ie6下不支持PNG 24 的透明度&#xff1b; 所以保存为PNG 8最为靠谱。杂边选择“无”&#xff1b; PS我玩的还可以。大家有问题可以问我。 网页制作时记得把PS首选项的单位改成像素&#xff1b; 今天试了一下切图插件:cutterman 这个插件有个BUG 会自动覆盖重名文件。&#xff0…...

php网站开发进程/seo搜索引擎优化到底是什么

1. basename("/mnt/img/image01.jpg")函数:得到文件名;输出结果为:image01.jpg. 使用 basename($uriString) 我们可以得到一个包含扩展名的文件名&#xff1b; 如果不需要扩展名&#xff0c;也可以使用 basename($uriString, $extString) 过滤扩展名&#xff0c;仅仅…...