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) 容器共享主机操作系统的内核,具…...
Java语法总结
Java的数据类型分为基本数据类型和引用数据类型。 1.基本数据类型:四类八种 byte 和short 比较特殊,不必考虑int类型,只关注是否超出了表示范围。 数据超出了int的范围,改正:在后边添加L ,定义变量报错…...
Linux文件系统的安全保障---Overlayroot!
overlayroot 是一种使用 OverlayFS 实现的功能,可将根文件系统挂载为只读,并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例,介绍制作 overlayroot 的…...
net-http-transport 引发的句柄数(协程)泄漏问题
Reference 关于 Golang 中 http.Response.Body 未读取导致连接复用问题的一点研究https://manishrjain.com/must-close-golang-http-responsehttps://www.reddit.com/r/golang/comments/13fphyz/til_go_response_body_must_be_closed_even_if_you/?rdt35002https://medium.co…...
Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索
作者:来自 Elastic Tommaso Teofili 了解如何使用智能提前终止策略让 HNSW 加快 KNN 搜索速度。 在高维空间中高效地找到最近邻的挑战是向量搜索中最重要的挑战之一,特别是当数据集规模增长时。正如我们之前的博客文章中所讨论的,当数据集规模…...
嵌入式c语言的内存管理
目录 一、内存布局概述 二、栈(Stack) 2.1. 定义与用途 2.2. 内存分配与释放 2.3. 增长方向与大小限制 三、堆(Heap) 3.1. 定义与用途 3.2. 内存分配与释放 3.3. 增长方向与潜在问题 四、全局/静态存储区 4.1. 定义与用…...
uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端
采用 uniapp-vue3 实现, 是一款带有丝滑动画效果的单选框组件,提供点状、条状的动画过渡效果,支持多项自定义配置,适配 web、H5、微信小程序(其他平台小程序未测试过,可自行尝试) 可到插件市场下载尝试&…...
【Linux】shell脚本编程
目录 概念: shell脚本的本质: shell脚本编程: shell变量: 变量的定义格式: 变量的分类 自定义变量: 环境变量: 命令变量与命令行参数: 预定义变量: shell中的…...
ingress-nginx-controller安装
ingress-nginx-controller安装 ingress-nginx-controller是配置ingress发布的基础。以下主要采用Helm安装。地址: GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for Kubernetes 1 Helm安装 安装不难,需要找到合适的压缩包就行。我自…...
机器学习基础-机器学习的常用学习方法
目录 半监督学习的概念 规则学习的概念 基本概念 机器学习里的规则 逻辑规则 规则集 充分性与必要性 冲突消解 命题逻辑 → 命题规则 序贯覆盖 单条规则学习 剪枝优化 强化学习的概念 1. 强化学习对应了四元组 2. 强化学习的目标 强化学习常用马尔可夫决策过程…...
如何在Windows 11 WSL2 Ubuntu 环境下安装和配置perf性能分析工具?
在Windows 11 WSL2 Ubuntu 环境下完整安装和配置perf性能分析工具 一、背景二、准备工作三、获取并编译Linux内核源码四、安装和配置perf五、测试perf六、总结 一、背景 由于WSL2使用的是微软定制的内核,并非标准的Ubuntu内核,因此直接使用apt安装linux…...
人工智能知识分享第十天-机器学习_聚类算法
聚类算法 1 聚类算法简介 1.1 聚类算法介绍 一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。 目的是将数据集中的对象分成多个簇(Cluster),使得同一簇内的对象相似度较高,而不同簇之间的对象相…...
使用wav2vec 2.0进行音位分类任务的研究总结
使用wav2vec 2.0进行音位分类任务的研究总结 原文名称: Using wav2vec 2.0 for phonetic classification tasks: methodological aspects 研究背景 自监督学习在语音中的应用 自监督学习在自动语音识别任务中表现出色,例如说话人识别和验证。变换器模型…...
【Leetcode 热题 100】33. 搜索旋转排序数组
问题背景 整数数组 n u m s nums nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前, n u m s nums nums 在预先未知的某个下标 k ( 0 ≤ k < n u m s . l e n g t h ) k(0 \le k \lt nums.length) k(0≤k<nums.length) 上进行了 旋转&…...
【VScode】设置代理,通过代理连接服务器
文章目录 VScode编辑器设置代理1.图形化界面1.1 进入proxy设置界面1.2 配置代理服务器 2.配置文件(推荐)2.1 打开setting.json 文件2.2 配置代理 VScode编辑器设置代理 根据情况安装nmap 1.图形化界面 1.1 进入proxy设置界面 或者使用快捷键ctrl , 。…...
每日一题-两个链表的第一个公共结点
文章目录 两个链表的第一个公共结点问题描述示例说明示例 1示例 2 方法及实现方法描述代码实现 复杂度分析示例运行过程示例 1示例 2 总结备注 两个链表的第一个公共结点 问题描述 给定两个无环的单向链表,找到它们的第一个公共节点。如果没有公共节点,…...
Linux存储管理之核心秘密(The Core Secret of Linux Storage Management)
Linux存储管理之核心秘密 如果你来自Windows环境,那么Linux处理和管理存储设备的方式对你而言可能显得格外不同。我们知道,Linux的文件系统并不采用Windows那样的物理驱动器表示方式(如C:、D:或E:),而是构建了一个以&…...
js单例模式
保证一个类只有一个实例,并提供一个访问它的全局访问点 实现 静态方法实现 class SingleTon{//全局的访问点static getInstance(){// 保证一个类只有一个实例if(!this.instance){this.instancenew SingleTon()}return this.instance}}let aSingleTon.getInstance()let bSing…...
搭建一个本地轻量级且好用的学习TypeScript语言的环境
需求说明 虽然 TypeScript 的在线 Playground 很方便 https://www.tslang.com.cn/play/,但毕竟是在浏览器中使用,没有本地的 IDE 那么顺手。所以我想搭建一个本地类似 Playground 的环境,这样在学习 TypeScript 的过程中,可以更方…...
大模型(LLM)面试全解:主流架构、训练目标、涌现能力全面解析
系列文章目录 大模型(LLMs)基础面 01-大模型(LLM)面试全解:主流架构、训练目标、涌现能力全面解析 大模型(LLMs)进阶面 文章目录 系列文章目录大模型(LLMs)基础面一、目…...
入门嵌入式(七)——PWM
PWM 脉冲宽度调制PWM(Pulse-Width Modulation) 一组方波 周期 1ms 频率 1s / 周期 占空比 高电平/周期 数字信号:0/1高低电平 串口 IIC PWM都属于数字信号 模拟信号:电压值, 会受到电磁影响 ADC 模数转换 用于读取…...
Flutter 实现 列表滑动过程控件停靠效果 学习
实现一个 Flutter 应用程序,使用 Sliver 系列组件来创建具有滚动效果的复杂布局。使用 NestedScrollView 和 SliverPersistentHeader 来实现固定和动态的头部效果,以及一个可滚动的列表。 前置知识点学习 SingleTickerProviderStateMixin SingleTicker…...
STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显
资料下载地址:STM32WIFI获取网络时间8位数码管显示0.96OLED 1、项目介绍 主控芯片STM32C8T6 接线:串口1:PA9 PA10 OELD :PB6 PB7 数码管使用:MAX7219 8位数码管 Max7219_pinCLK PAout(5) Max7219_pinC…...
Kivy App开发之UX控件Slider滑块
在app中可能会调节如音量,亮度等,可以使用Slider来实现,该控件调用方便,兼容性好,滑动平稳。在一些参数设置中,也可以用来调整数值。 支持水平和垂直方向,可以设置默认值,最小及最大值。 使用方法,需用引入Slider类,通过Slider类生成一个滑块并设置相关的样式后,再…...
STM32学习(十)
I2C模块内部结构 I2C(Inter-Integrated Circuit)模块是一种由Philips公司开发的二线式串行总线协议,用于短距离通信,允许多个设备共享相同的总线。 硬件连接简单:I2C通信仅需要两条总线,即SCL&…...
何为“正则表达式”!
详细解释: ^:在JSON的正则表达式中,^表示匹配输入字符串的开始位置。这意味着正则表达式将从字符串的开头开始进行匹配,确保整个字符串符合后续的模式要求。例如,对于字符串"3.14",正则表达式会…...
创建Java项目,并添加MyBatis包和驱动包
一 : Mybatis和jsp使用上,只有Dao层有区别 Mybatis 使用方法: 测试类的7步骤 1.读取核心配置文件 2.构建sql会话工厂 3.开启sql会话 4.获取mapper接口 5.调用相对应的增删改查方法 6.打印 7.关闭回话 /*** 用户列表* throws IOException*/Testpublic void roleList() throws IO…...
目标检测文献阅读-DETR:使用Transformer进行端到端目标检测
目录 摘要 Abstract 1 引言 2 DETR结构 2.1 Backbone 2.2 Encoder 2.3 Decoder 2.4 FFN 3 目标检测集合预测损失 3.1 二分图匹配损失 3.2 损失函数 总结 摘要 本周阅读的论文题目是《End-to-End Object Detection with Transformers》(使用Transformer进行端到端目…...
C#里对已经存在的文件进行压缩生成ZIP文件
先要对目录下所有文件获取到: private List<string> GetXDFiles(string dirPath){//获取目录中的所有文件string suffix = "*.txt"; // 要查找的文件后缀var files = Directory.GetFiles(dirPath, suffix, SearchOption.TopDirectoryOnly).ToList();return fi…...
单片机软件定时器V4.0
单片机软件定时器V4.0 用于单片机定时执行任务等,比如LED GPIO等定时控制,内置前后台工作模式 头文件有使用例子 #ifndef __SORFTIME_APP_H #define __SORFTIME_APP_H#ifdef __cplusplus extern "C" { #endif#include <stdint.h>// #…...
【嵌入式硬件】嵌入式显示屏接口
数字显示串行接口(Digital Display Serial Interface) SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备,下面是接口…...
vuedraggable 选项介绍
vuedraggable 是基于 SortableJS 的 Vue 组件,提供了丰富的选项来定制拖拽行为。以下是 vuedraggable 常用的选项和它们的详细说明: 常用选项介绍 group 配置拖拽分组。多个列表可以共享同一个分组,允许它们之间的项目互相拖拽。 group: { na…...
OpenAI CEO 奥特曼发长文《反思》
OpenAI CEO 奥特曼发长文《反思》 --- 引言:从 ChatGPT 到 AGI 的探索 ChatGPT 诞生仅一个多月,如今我们已经过渡到可以进行复杂推理的下一代模型。新年让人们陷入反思,我想分享一些个人想法,谈谈它迄今为止的发展,…...
Appium(一)--- 环境搭建
一、Android自动化环境搭建 1、JDK 必须1.8及以上(1) 安装:默认安装(2) 环境变量配置新建JAVA_HOME:安装路径新建CLASSPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar在path中增加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(3) 验证…...
如何查看服务器上的MySQL/Redis等系统服务状态和列表
如果呢你知道系统服务名称,要看状态很简单: systemctl status server-name 比如 systemctl status nginxsystemctl status redis # 等 这是一个nginx的示例: 那问题是 当你不知道服务名称时该怎么办。举个例子,比如mysql在启动…...
多模态论文笔记——U-ViT
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍U-ViT的模型架构和实验细节,虽然没有后续的DiT在AIGC领域火爆,但为后来的研究奠定了基础,但其开创性的探索值得学习…...
08-1_队列的理论讲解
08-1_队列的理论讲解 队列概念理解 队列就是一个传送带,就是一个流水线 工人放入的数据, 放在传送带上,送给消费者, 消费者第一次拿到的数据,就是工人第一次放上的数据(类比队列,先进先出) freertos队列应用思考 队列对于消费者(取数据): (1)当队列没有数据, 消费者需要进入…...
HTML基础入门——简单网页页面
目录 一,网上转账电子账单 编辑 1,所利用到的标签 2,代码编写 3,运行结果 二,李白诗词 1,所用到的标签 2,照片的编辑 3,代码编写 4,运行结果 一,网…...
Proteus-8086调试汇编格式的一点心得
这阵子开始做汇编的微机实验(微机原理与接口技术题解及实验指导,吴宁版本13章),中间出了挺多问题,解决后记录下。 先上电路图 用子电路来仿真发现仿真的时候子电路这块根本没有高低电平输出,只好把子电路拿…...
Python入门教程 —— 多任务
1.线程 1.1.线程安全问题 线程访问全局变量 import threading g_num = 0 def test(n):global g_numfor x in range(n):g_num += xg_num -= xprint(g_num)if __name__ == __main__:t1 = threading.Thread(target=test, args=(10,))t2 = threading.Thread(target=test, args=(…...
【笔记】算法记录
1、求一个数的素因子(试除法) // 获取一个数的所有素因子 set<int> getPrimeFactors(int num) {set<int> primeFactors;for (int i 2; i * i < num; i) {while (num % i 0) {primeFactors.insert(i);num / i;}}if (num > 1) {prime…...
2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无
2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无 前端代码开源库 关于开源说明:企业服务-招聘信息管理系统-前端uniapp-系统前端开放源代码仅供学习-优雅草科技-目前优雅草科…...
【网络】计算机网络的分类 局域网 (LAN) 广域网 (WAN) 城域网 (MAN)个域网(PAN)
局域网是通过路由器接入广域网的 分布范围 局域网Local Area Network:小范围覆盖,速度高,延迟低(办公室,家庭,校园,网络) 广域网Wide Area Network 大范围覆盖,速度相对低,延迟高…...
DeepSeek:性能强劲的开源模型
deepseek 全新系列模型 DeepSeek-V3 首个版本上线并同步开源。登录官网 chat.deepseek.com 即可与最新版 V3 模型对话。 性能对齐海外领军闭源模型 DeepSeek-V3 为自研 MoE 模型,671B 参数,激活 37B,在 14.8T token 上进行了预训练。 论…...
MySql 通过 LOAD DATA INFILE 导入大量数据
背景:要在本地Mysql导入几十万-百万条数据非常耗时,从网上找到通过load data infile 方式可以快速导入大量数据,就动手尝试了。结果就是不太适合复杂的格式数据导入,比如字段多,数据格式多等,但对于简单的表…...
Linux系统中解决端口占用问题
在日常的 Linux 系统管理和开发过程中,端口占用是一个常见且令人头疼的问题。无论是部署新服务、调试应用程序,还是进行系统维护,遇到端口被占用都可能导致服务无法正常启动或运行。本文将详细介绍在 Linux 系统中如何识别和解决端口占用问题…...
两种方式实现Kepware与PLC之间的心跳检测
两种方式实现Kepware与PLC之间的心跳检测 实现Kepware与PLC之间的心跳检测1.OPCUA 外挂程序2.Kepware Advanced Tag 实现Kepware与PLC之间的心跳检测 1.OPCUA 外挂程序 这是通过上位程序来触发心跳的一种机制,在C#中,可以利用OPC UAOPCAutodll的方式…...
使用DockerCompose部署服务
由于格式或图片解析问题,为了更好的阅读体验,可前往 阅读原文 以前我们总是用命令管理每个容器的启动、停止等等,若有多个容器时可能还存在启动优先级的问题,那就要等到指定的容器启动后再去启动另一个容器,对于整体的…...
第P5周-Pytorch实现运动鞋品牌识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch (二)具体步骤 时间…...
react-quill 富文本组件编写和应用
index.tsx文件 import React, { useRef, useState } from react; import { Modal, Button } from antd; import RichEditor from ./RichEditor;const AnchorTouchHistory: React.FC () > {const editorRef useRef<any>(null);const [isModalVisible, setIsModalVis…...