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账户
-
访问 Docker Hub
https://hub.docker.com
。 -
点击“Sign Up”按钮进行注册。
-
填写相关信息并完成账户注册。
登录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,首先需要给镜像打标签,然后推送:
- 给镜像打标签:
docker tag <本地镜像ID或名称>:<标签> <Docker Hub用户名>/<镜像名>:<标签>
例如,将本地镜像myapp打标签为Docker Hub的myapp:
docker tag myapp:latest myusername/myapp:latest
- 推送镜像:
docker push <Docker Hub用户名>/<镜像名>:<标签>
例如,推送myapp镜像:
docker push myusername/myapp:latest
管理镜像库
在Docker Hub网站上可以管理自己的镜像库,包括创建新的仓库、设置仓库的可见性(公共或私有)、查看镜像的详细信息和下载次数等。
私有Docker仓库
搭建私有仓库
Docker官方提供了一个开源的私有仓库实现——Docker Registry。可以使用官方的Registry镜像快速搭建一个私有仓库。
- 拉取Registry镜像:
docker pull registry:2
- 运行Registry容器:
docker run -d -p 5000:5000 --name myregistry registry:2
此时,私有仓库将运行在本地主机的5000端口。
推送和拉取私有仓库的镜像
- 给镜像打标签:
docker tag <本地镜像ID或名称>:<标签> localhost:5000/<镜像名>:<标签>
例如,将本地镜像myapp打标签为私有仓库的myapp:
docker tag myapp:latest localhost:5000/myapp:latest
- 推送镜像:
docker push localhost:5000/myapp:latest
- 拉取镜像:
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集成,当代码库有新的提交时自动构建并推送镜像。
- 设置自动构建
-
在Docker Hub上创建新的仓库,选择自动构建。
-
连接到GitHub或Bitbucket,选择代码库和分支。
-
配置Dockerfile的路径和构建规则。
Webhooks
Webhooks允许Docker Hub在镜像构建完成后向指定的URL发送HTTP请求,用于触发后续的CI/CD流程。
- 配置Webhooks
-
在Docker Hub仓库的设置页面,找到Webhooks。
-
添加新的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 config
和docker 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 create
、docker volume ls
、docker volume rm
。 -
卷挂载:在
docker run
命令中使用-v
选项。 -
网络(Network):容器之间通信的桥梁。
-
创建和管理网络:
docker network create
、docker network ls
、docker network rm
。 -
网络模式:Bridge、Host、Overlay等。
Docker Compose
-
定义和运行多容器应用:
-
使用YAML文件定义服务、网络和卷。
-
启动和管理服务:
docker-compose up
、docker-compose down
、docker-compose ps
。 -
高级功能:
-
多环境配置:通过多个Compose文件支持不同环境配置。
-
扩展服务:通过
docker-compose scale
扩展服务副本。
Docker Swarm
-
集群管理和编排:
-
初始化Swarm集群:
docker swarm init
。 -
加入和离开集群:
docker swarm join
、docker swarm leave
。 -
管理节点和服务:
docker node
、docker service
。 -
高级功能:
-
服务滚动更新和回滚:
docker service update
、docker service rollback
。 -
配置和密钥管理:
docker config
、docker secret
。 -
多主机网络:通过Overlay网络实现跨主机通信。
相关文章:
Docker的安装和使用
容器技术 容器与虚拟机的区别 虚拟机 (VM) VM包含完整的操作系统,并在虚拟化层之上运行多个操作系统实例。 VM需要更多的系统资源(CPU、内存、存储)来管理这些操作系统实例。 容器 (Container) 容器共享主机操作系统的内核,具…...
Flink系统知识讲解之:Flink内存管理详解
Flink系统知识讲解之:Flink内存管理详解 在现阶段,大部分开源的大数据计算引擎都是用Java或者是基于JVM的编程语言实现的,如Apache Hadoop、Apache Spark、Apache Drill、Apache Flink等。Java语言的好处是不用考虑底层,降低了程…...
使用JMeter模拟多IP发送请求!
你是否曾遇到过这样的场景:使用 JMeter 进行压力测试时,单一 IP 被服务器限流或者屏蔽?这时,如何让 JMeter 模拟多个 IP 发送请求,成功突破测试限制,成为测试工程师必须攻克的难题。今天,我们就…...
【Ubuntu与Linux操作系统:六、软件包管理】
第6章 软件包管理 6.1 Linux软件安装基础 Linux的软件包是以二进制或源码形式发布的程序集合,包含程序文件和元数据。软件包管理器是Linux系统的重要工具,用于安装、更新和卸载软件。 1. 常见的软件包管理器: DEB 系统(如Ubunt…...
【数据结构-堆】力扣1834. 单线程 CPU
给你一个二维数组 tasks ,用于表示 n 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。 现…...
【前端动效】原生js实现拖拽排课效果
目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示,页面左侧有一个包含不同课程(如语文、数学等)的列表,页面右侧…...
C#使用OpenTK绘制3D可拖动旋转图形三棱锥
接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…...
排序的本质、数据类型及算法选择
排序的本质、数据类型及算法选择 一、排序的本质二、排序的数据类型三、排序算法的选择依据 前两天老金写了篇 “十大排序简介”,有点意犹未尽,这一回老金想把排序连根拔起,从排序的本质说道说道。 一、排序的本质 从字面上理解,…...
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功能实现 最近在学习鸿蒙开发过程中,阅读了官方文档,在之前做flutter时候,经常使用overlay,使用OverlayEntry加入到overlayState来做添加悬浮按钮、提示弹窗、加载中指示器、加载失败的t…...
【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】
第1章 Ubuntu安装与基本使用 1.1 Linux与Ubuntu Linux是一种开源、类Unix操作系统内核,拥有高稳定性和强大的网络功能。由于其开源性和灵活性,Linux被广泛应用于服务器、嵌入式设备以及桌面环境中。 Ubuntu是基于Debian的一个流行Linux发行版…...
React 元素渲染
React 元素渲染 React 是一个用于构建用户界面的 JavaScript 库,它允许开发人员创建大型应用程序,这些应用程序可以随着时间的推移而高效地更新和渲染。React 的核心概念之一是元素渲染,它描述了如何将 JavaScript 对象转换为 DOM࿰…...
【2024年华为OD机试】 (C卷,100分)- 括号匹配(Java JS PythonC/C++)
一、问题描述 题目描述 给定一个字符串,里边可能包含“()”、“[]”、“{}”三种括号,请编写程序检查该字符串中的括号是否成对出现,且嵌套关系正确。 若括号成对出现且嵌套关系正确,或该字符串中无括号字符,输出&am…...
解锁企业数字化转型新力量:OpenCoze(开源扣子)
在当今数字化浪潮席卷之下,企业对于高效管理和协同运作的需求愈发迫切,而开源技术正逐渐成为众多企业破局的关键利器。今天,想给大家介绍一款极具潜力的开源项目 ——OpenCoze,中文名称 “开源扣子”。 一、OpenCoze 是什么&…...
【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题解析
文章目录 选择题答案及解析理论题答案及解析实操题答案及解析下一步进阶 选择题答案及解析 RIP路由协议是基于哪种算法的动态路由协议? 答案:B. 距离矢量算法解析:链路状态算法用于OSPF等协议;最小生成树算法主要用于生成树协议&…...
【微服务】8、分布式事务 ( XA 和 AT )
文章目录 利用Seata解决分布式事务问题(XA模式)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 插件中发现了一个严重漏洞,该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777,CVSS 评分为 9.8,表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装,为全球无数捐赠平…...
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 的任务调度系统
文末附有完整项目代码 在当今科技飞速发展的时代,任务调度系统的重要性日益凸显。本文将详细介绍一个基于 SSH(SpringStruts2Hibernate)的任务调度系统的设计与实现。 一、系统概述 本系统旨在改变传统人工任务调度方式,通过计算…...
filestream安装使用全套+filebeat的模块用法
1 filestream介绍 官方宣布:输入类型为log在filebeat7.16版本已经弃用了 Filestream 是 Filebeat 中的一种 输入类型(Input),用于处理日志文件的读取。它是为了取代 Filebeat 中传统的 log 输入(Input)设…...
java项目之房屋租赁系统源码(springboot+mysql+vue)
项目简介 房屋租赁系统实现了以下功能: 房屋租赁系统的主要使用者分为: 系统管理:个人中心、房屋信息管理、预约看房管理、合同信息管理、房屋报修管理、维修处理管理、房屋评价管理等模块的查看及相应操作; 房屋信息管理&#…...
sap mm学习笔记
1. 业务流程 2. 组织架构 3. 物料主数据 4.采购主数据 5. 采购管理 6. 库存管理 7.物料主数据 8. 采购申请 ME51N...
代码随想录_链表
代码随想录02 链表 203.移除链表元素 力扣题目链接(opens new window) 题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2: 输入:he…...
EF Code 并发控制
【悲观控制】 不推荐用,EF Core 没有封装悲观并发控制的使用,需要使用原生Sql来使用悲观并发控制 一般使用行锁、表锁等排他锁对资源进行锁定,同时只有一个使用者操作被锁定的资源 拿sql server举例,可以使用表所、或者行所解决…...
ceph fs status 输出详解
ceph fs status 命令用于显示 Ceph 文件系统的状态信息,其中各列的含义如下: RANK:元数据服务器(MDS)的等级或标识符。 STATE:MDS 的当前状态,例如 active(活跃)、stan…...
FFmpeg Muxer HLS
使用FFmpeg命令来研究它对HLS协议的支持程度是最好的方法: 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版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句…...
回归预测 | MATLAB实GRU多输入单输出回归预测
回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…...
【OpenGL/Assimp】渲染模型、半透明材质与封装光源
文章目录 渲染成果Assimp库准备:Mesh类修改:透明贴图使用:光源封装:使用方式在如下测试环境中: 渲染成果 Assimp库准备: 从GitHub拉取源码,根据网络教程,借助CMake生成VS工程项目&a…...
pandas与sql对应关系【帮助sql使用者快速上手pandas】
本页旨在提供一些如何使用pandas执行各种SQL操作的示例,来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…...
网站一般做多大像素/品牌推广渠道有哪些
简单有效的文本匹配,具有更丰富的对齐功能 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) 是不建议的,因此很多安装时会不勾选这一选项。 然后使用vscode调用cmd运行Python的编辑器调试Python时,终端经常会出现诸如 …...
盐城个人网站建设/株洲网页设计
线程同步基础 并发场景下,有时我们并不仅仅想保护数据,我们还希望多个线程之间同步某些操作,例如等待某个条件为真或者某个事件发生时执行一些操作。C标准库提供了条件变量(condition variables)和futures;…...
政府网站建设总结报告/自己制作网页的网站
da-dapps在过去的几周中,我们使用Blockstack构建了一个去中心化的应用程序 ,使您可以创建和保存Web应用程序片段。 到目前为止,这些代码段已私下保存到您自己的个人存储中。 甚至应用程序的创建者都无法访问它们! 但是网络也是关于…...
怎样做班级网站/搜索引擎优化的方法有哪些
ie6下不支持PNG 24 的透明度; 所以保存为PNG 8最为靠谱。杂边选择“无”; PS我玩的还可以。大家有问题可以问我。 网页制作时记得把PS首选项的单位改成像素; 今天试了一下切图插件:cutterman 这个插件有个BUG 会自动覆盖重名文件。࿰…...
php网站开发进程/seo搜索引擎优化到底是什么
1. basename("/mnt/img/image01.jpg")函数:得到文件名;输出结果为:image01.jpg. 使用 basename($uriString) 我们可以得到一个包含扩展名的文件名; 如果不需要扩展名,也可以使用 basename($uriString, $extString) 过滤扩展名,仅仅…...