Docker 核心概念
在深入功能之前,我们先来理解几个 Docker 的核心概念:
镜像 (Image):Docker 镜像是一个轻量级、独立、可执行的软件包,包含运行应用程序所需的一切,包括代码、运行时、系统工具、系统库和设置。可以理解为面向对象编程中的“类”。
容器 (Container):容器是镜像的运行实例。每个容器都是相互隔离的,拥有自己的文件系统、网络接口、进程空间等。可以理解为面向对象编程中的“对象”。
仓库 (Registry):仓库是集中存放镜像的地方,例如 Docker Hub。可以理解为存放代码的 GitHub。
Dockerfile:Dockerfile 是一个文本文件,包含一系列的指令,用于自动构建 Docker 镜像。
Docker 主要功能教程
0. 前置条件:配置镜像站!!!
配置daemon.json文件
sudo vi /etc/docker/daemon.json复制以下内容
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
}重启docker
sudo service docker restart然后就可以正常docker pull文件。
1. Docker 的安装
要使用 Docker,首先需要在您的系统上安装它。Docker 提供了多种安装方式,具体取决于您的操作系统。
教程步骤:
访问 Docker 官方安装指南:
对于 Windows:访问 Docker Desktop for Windows
对于 macOS:访问 Docker Desktop for Mac
对于 Linux:访问 Install Docker Engine on Ubuntu (以 Ubuntu 为例,其他 Linux 发行版请查找对应文档)
按照指南进行安装: 官方文档提供了详细的步骤和依赖说明,请务必仔细阅读并遵循。
验证安装: 安装完成后,打开终端或命令提示符,运行以下命令:
docker run hello-world如果看到 “Hello from Docker!” 的消息,说明 Docker 已成功安装并运行。
2. Docker 镜像管理
镜像是 Docker 的基石,学会管理镜像是使用 Docker 的第一步。
常用命令:
1. 搜索镜像:
docker search [镜像名] # 示例:docker search ubuntu拉取镜像: 从 Docker 仓库下载镜像到本地。
# {===repository 镜像库===} 一个镜像库存放着一个镜像的多个版本 docker pull docker.io/library/nginx:latest docker pull [registry 仓库地址]/[命名空间]/[镜像名]:[标签/就是版本号] #如果是官方镜像就可以简化掉前面的命令,因为默认是从官方地址和官方的命名空间里拉取 docker pull [镜像名]:[标签/就是版本号] # 示例:docker pull ubuntu:latestdocker pull: 这是 Docker 的一个命令,用于从远程仓库下载(拉取)一个镜像到本地机器上。docker.io/library/nginx: 这是指定要拉取的镜像的完整路径。docker.io: 这是 Docker 官方仓库(Docker Hub)的默认域名。通常,当您拉取一个官方镜像时,这个部分是可以省略的,Docker 会自动假定您指的是docker.io/library下的镜像。library: 这是 Docker Hub 上一个特殊的命名空间,用于存放官方维护的镜像。nginx: 这是镜像的名称,这里指的是 Nginx Web 服务器的官方镜像。:latest: 这是镜像的标签(tag)。latest是一个常用的标签,通常指向最新稳定版本的镜像。
如果您不指定标签,latest是默认的。
指定拉取哪个平台(架构)的镜像
docker pull是从远程仓库下载镜像的命令,而--platform用于指定拉取哪个平台(架构)的镜像。其基本语法如下:docker pull --platform=<平台> <镜像名>:<标签>其中
<平台>的格式通常是:<OS>/<架构>[/<变体>]例如:
linux/amd64— 常见的 PC/服务器 Linux 平台linux/arm64— 适用于 ARM64 的 Linux(比如苹果 M 系列或某些云主机)windows/amd64— Windows 平台
举例:
docker pull --platform=linux/arm64 nginx:latest这条命令会从 Docker Hub 拉取
nginx:latest镜像,并指定架构为linux/arm64。这在以下场景非常有用:
✅ 在不同 CPU 架构的机器之间交叉构建或测试
✅ 在苹果 M1/M2 Mac 上使用 amd64 镜像
✅ 在 CI/CD 环境里统一镜像架构如果不写
--platform,Docker 会默认拉取与你本地机器架构相同的平台镜像。
查看本地镜像:
docker images删除镜像: 删除本地的一个或多个镜像。
docker rmi [镜像ID或镜像名]:[标签] # 示例:docker rmi ubuntu:latest # 强制删除:docker rmi -f [镜像ID或镜像名]构建镜像 (通过 Dockerfile):
在一个包含 Dockerfile 的目录下执行:
docker build -t [新镜像名]:[标签] . # 示例:docker build -t myapp:1.0 .这里的
.表示 Dockerfile 在当前目录。
3. Docker 容器管理
容器是镜像的运行实例,是 Docker 应用的实际运行载体。
常用命令:
运行容器:
docker run [选项] [镜像名]:[标签] [命令] # 常用选项: # -d:后台运行容器 # -p [宿主机端口]:[容器端口]:端口映射 # -v [宿主机路径]:[容器路径]:数据卷挂载 # --name [容器名]:指定容器名称 # -it:交互式运行(通常用于进入容器内部) # 示例:运行一个 Nginx 容器,并将宿主机的 80 端口映射到容器的 80 端口 docker run -d -p 80:80 --name mynginx nginx:latest # 示例:运行一个交互式的 Ubuntu 容器 docker run -it ubuntu:latest /bin/bash查看运行中的容器:
docker ps查看所有容器 (包括已停止的):
docker ps -a停止容器:
docker stop [容器ID或容器名] # 示例:docker stop mynginx启动已停止的容器:
docker start [容器ID或容器名]重启容器:
docker restart [容器ID或容器名]删除容器:
docker rm [容器ID或容器名] # 强制删除:docker rm -f [容器ID或容器名]进入正在运行的容器:
docker exec -it [容器ID或容器名] /bin/bash # 示例:docker exec -it mynginx /bin/bash查看容器日志:
docker logs [容器ID或容器名] # 实时查看:docker logs -f [容器ID或容器名]
4. Dockerfile 编写
Dockerfile 是自动化构建 Docker 镜像的关键。
Dockerfile 常用指令:
FROM:指定基础镜像。
Dockerfile
FROM ubuntu:latestWORKDIR:设置工作目录。
WORKDIR /appCOPY:复制文件或目录到镜像中。
COPY . /appADD:与 COPY 类似,但支持解压 tar 文件和获取 URL。
ADD https://example.com/software.tar.gz /app/RUN:在镜像构建过程中执行命令。
RUN apt-get update && apt-get install -y nodejsCMD:容器启动时执行的默认命令。如果
docker run命令指定了其他命令,CMD 将被覆盖。CMD ["node", "app.js"]ENTRYPOINT:与 CMD 类似,但通常用于定义容器的主要执行命令,
docker run后面的命令会作为参数传递给 ENTRYPOINT。ENTRYPOINT ["nginx", "-g", "daemon off;"]EXPOSE:声明容器将监听的端口(仅用于文档说明,不实际发布端口)。
EXPOSE 80ENV:设置环境变量。
ENV MY_VARIABLE="hello"
Dockerfile 示例:一个简单的 Node.js 应用
假设您有一个 app.js 文件:
// app.js
const http = require('http');
const hostname = '0.0.0.0';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello from Docker!\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});以及 package.json:
{
"name": "my-docker-app",
"version": "1.0.0",
"description": "A simple Node.js app for Docker",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
}
}现在创建一个 Dockerfile 文件:
# 使用官方 Node.js 镜像作为基础
FROM node:14-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json (如果存在)
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制整个应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 定义容器启动时运行的命令
CMD ["npm", "start"]在包含 Dockerfile、app.js 和 package.json 的目录下,运行以下命令构建镜像:
docker build -t my-node-app:1.0 .然后运行容器:
docker run -d -p 3000:3000 --name my-node-container my-node-app:1.0现在访问 http://localhost:3000 就可以看到 "Hello from Docker!"。
5. Docker 数据管理 (数据卷)
容器是短暂的,当容器被删除时,容器内部的数据也会丢失。数据卷 (Volumes) 用于持久化存储容器生成或使用的数据。
常用命令及方法:
挂载宿主机目录作为数据卷:
docker run -d -v /path/on/host:/path/in/container [镜像名] # 示例:将宿主机的 /opt/nginx/html 目录挂载到容器的 /usr/share/nginx/html 目录 docker run -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html --name mynginx-volume nginx:latest使用命名数据卷 (Named Volumes): Docker 会自动在宿主机管理这些数据卷的位置。
创建命名数据卷:
docker volume create mydata查看数据卷:
docker volume ls使用命名数据卷运行容器:
docker run -d -v mydata:/path/in/container [镜像名] # 示例: docker run -d -v mydata:/app/data --name myapp-with-data myapp:1.0检查数据卷信息:
docker volume inspect mydata删除数据卷: 确保没有容器在使用该数据卷。
docker volume rm mydata
6. Docker 网络
Docker 提供了多种网络模式,允许容器之间以及容器与外部世界进行通信。
常用网络模式:
Bridge (桥接模式 - 默认):Docker 创建一个虚拟网桥,容器连接到这个网桥,并通过 NAT 访问外部网络。
容器间通信: 同一个桥接网络中的容器可以通过 IP 地址直接通信。
端口映射: 如果要从外部访问容器,需要通过
-p或-P进行端口映射。
示例:创建自定义桥接网络
创建网络:
docker network create my-bridge-network运行容器并连接到网络:
docker run -d --name container1 --network my-bridge-network nginx docker run -d --name container2 --network my-bridge-network ubuntu:latest sleep infinity容器间通过名称互相访问: 在
container2中 pingcontainer1docker exec -it container2 ping container1
Host (主机模式):容器直接使用宿主机的网络命名空间,共享宿主机的 IP 地址和端口。
优点: 性能高,没有额外的网络层。
缺点: 失去了容器间的隔离性,可能会导致端口冲突。
docker run -d --network host --name my-host-nginx nginxNone (无网络模式):容器没有网络接口,只能通过挂载数据卷或其他方式进行通信。
docker run -d --network none --name my-isolated-container ubuntu:latest sleep infinity
7. Docker Compose (多容器应用编排)
对于由多个服务(如 Web 应用、数据库、缓存)组成的应用,手动管理多个 Docker 容器会变得复杂。Docker Compose 是一个工具,允许您使用 YAML 文件来定义和运行多容器 Docker 应用。
教程步骤:
安装 Docker Compose: Docker Desktop 通常自带 Compose。如果没有,请参考 Docker Compose 安装指南。
创建
docker-compose.yml文件: 定义您的服务、网络和数据卷。docker-compose.yml示例:一个简单的 WordPress 应用version: '3.8' # Docker Compose 文件格式版本 services: wordpress: image: wordpress:latest container_name: wordpress_app ports: - "80:80" # 映射宿主机 80 端口到容器 80 端口 environment: WORDPRESS_DB_HOST: db:3306 # 数据库主机名和端口,这里的 'db' 是另一个服务的名称 WORDPRESS_DB_USER: wordpress_user WORDPRESS_DB_PASSWORD: wordpress_password WORDPRESS_DB_NAME: wordpress_db volumes: - wordpress_data:/var/www/html # 挂载数据卷以持久化 WordPress 数据 depends_on: - db # 确保 db 服务在 wordpress 服务之前启动 db: image: mysql:5.7 container_name: wordpress_db_server environment: MYSQL_ROOT_PASSWORD: root_password # MySQL root 用户密码 MYSQL_DATABASE: wordpress_db # 数据库名称 MYSQL_USER: wordpress_user # 数据库用户 MYSQL_PASSWORD: wordpress_password # 数据库密码 volumes: - db_data:/var/lib/mysql # 挂载数据卷以持久化数据库数据 volumes: wordpress_data: # 定义命名数据卷 db_data:启动应用: 在
docker-compose.yml所在的目录下执行:docker-compose up -d # -d 表示在后台运行Compose 会自动创建网络、启动服务,并按照依赖关系顺序启动容器。
停止和移除应用:
docker-compose down # -v 参数会移除数据卷:docker-compose down -v查看服务状态:
docker-compose ps查看服务日志:
docker-compose logs -f
8. Docker Swarm (集群管理与编排)
Docker Swarm 是 Docker 官方提供的集群管理和编排工具,可以将多个 Docker 主机组合成一个虚拟的 Docker 主机,并像管理单个主机一样管理它们。它提供了服务发现、负载均衡、滚动更新等功能。
教程步骤 (概念性):
初始化 Swarm: 在一个节点上初始化 Swarm,使其成为 Swarm 管理器。
docker swarm init --advertise-addr [Manager_IP]这会输出一个
docker swarm join命令,用于其他节点加入 Swarm。将其他节点加入 Swarm: 在其他机器上运行加入命令,使其成为工作节点或另一个管理器。
docker swarm join --token [TOKEN] [Manager_IP]:[PORT]部署服务: 使用
docker service命令部署服务。docker service create --name my-web --publish 80:80 --replicas 3 nginx这会在 Swarm 集群中启动 3 个 Nginx 容器实例。
扩展服务:
docker service scale my-web=5滚动更新:
docker service update --image nginx:1.21 my-web
9. Docker Hub (镜像仓库)
Docker Hub 是 Docker 官方提供的公共镜像仓库,您可以从中拉取镜像,也可以推送自己的镜像。
教程步骤:
注册 Docker Hub 账号: 如果您还没有账号,请访问 Docker Hub 注册。
登录 Docker Hub: 在终端中登录。
docker login输入您的用户名和密码。
给本地镜像打标签: 标签格式为
[您的DockerHub用户名]/[镜像名]:[标签]。docker tag my-node-app:1.0 your_dockerhub_username/my-node-app:1.0推送镜像到 Docker Hub:
docker push your_dockerhub_username/my-node-app:1.0从 Docker Hub 拉取镜像:
docker pull your_dockerhub_username/my-node-app:1.0
进阶学习建议
Docker 安全: 学习如何编写更安全的 Dockerfile,以及如何保护您的容器。
Docker 监控与日志: 了解如何监控容器的性能和收集日志。
CI/CD 与 Docker: 将 Docker 集成到您的持续集成/持续部署 (CI/CD) 流程中。
Kubernetes: 当您的容器化应用变得非常复杂和庞大时,Kubernetes 是更强大的容器编排平台。
-.-
评论区