1. 什么是 Docker 容器?
Docker 容器是一个轻量级、可移植的虚拟化单元,用于打包、分发和运行应用程序。容器与传统的虚拟机不同,它不需要运行整个操作系统,而是利用宿主机操作系统的内核。每个容器都包含应用程序及其依赖,保证了应用的一致性和可移植性。
容器与虚拟机的区别:
- 容器:共享宿主机内核,启动速度快,占用资源少。
- 虚拟机:每个虚拟机都运行一个完整的操作系统,占用更多资源,启动较慢。
2. Docker 容器的基本概念
2.1 容器的特点
- 轻量级:容器不包含操作系统,只包含应用程序和依赖,启动速度快,资源占用少。
- 隔离性:每个容器运行在独立的环境中,相互之间没有影响。
- 可移植性:容器可以在任何地方运行,无论是开发环境、测试环境还是生产环境。
- 易于管理:容器可以通过 Docker CLI 或 Docker Compose 管理。
3. Docker 容器的创建与运行
3.1 拉取 Docker 镜像
在创建容器之前,我们首先需要从 Docker Hub 或其他仓库拉取镜像。镜像是容器的基础,是一个只读的应用程序模板。
docker pull nginx:latest
此命令会从 Docker Hub 拉取 Nginx 镜像,并将其存储在本地。
3.2 创建并运行 Docker 容器
使用 docker run
命令可以创建并运行一个容器。该命令不仅创建容器,还启动并运行它。
docker run -d -p 8080:80 --name my-nginx nginx:latest
-d
:表示容器在后台运行(detached mode)。-p 8080:80
:将宿主机的 8080 端口映射到容器的 80 端口,允许通过访问localhost:8080
来访问 Nginx。--name my-nginx
:为容器指定一个名称,方便后续管理。nginx:latest
:使用从 Docker Hub 拉取的nginx
镜像。
3.3 查看正在运行的容器
运行 docker ps
命令查看当前正在运行的容器:
docker ps
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6d510d8c377 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp my-nginx
3.4 进入容器
如果需要进入容器进行调试或查看文件,可以使用 docker exec
命令:
docker exec -it my-nginx bash
这将打开容器的交互式终端,让你可以在容器内部执行命令。
4. Docker 容器的管理
4.1 查看所有容器
除了查看正在运行的容器(docker ps
),你还可以查看所有容器,包括已经停止的容器。
docker ps -a
4.2 停止容器
停止容器可以使用 docker stop
命令:
docker stop my-nginx
这会停止名为 my-nginx
的容器。
4.3 启动已停止的容器
如果容器已经停止,可以使用 docker start
启动它:
docker start my-nginx
4.4 重启容器
如果容器在运行过程中出现问题,或者你修改了容器配置,可以使用 docker restart
来重启容器:
docker restart my-nginx
4.5 删除容器
如果不再需要容器,可以使用 docker rm
删除容器。需要先停止容器,然后删除它:
docker stop my-nginx
docker rm my-nginx
如果你想强制删除正在运行的容器,可以使用 -f
参数:
docker rm -f my-nginx
4.6 删除镜像
如果不再需要某个镜像,可以使用 docker rmi
删除它:
docker rmi nginx:latest
5. 容器与数据管理
5.1 持久化数据:数据卷(Volumes)
Docker 容器是临时的,容器删除后,容器内的数据也会丢失。为了持久化数据,我们可以使用 数据卷(Volumes),它可以将数据存储在宿主机上,不受容器生命周期的影响。
创建和使用数据卷:
docker run -d -p 8080:80 --name my-nginx -v /my/host/data:/usr/share/nginx/html nginx:latest
-v /my/host/data:/usr/share/nginx/html
:将宿主机/my/host/data
目录映射到容器的/usr/share/nginx/html
目录。容器对该目录的所有更改都会同步到宿主机上。
5.2 持久化容器的日志
Docker 允许你将容器的日志输出到宿主机,便于日志分析和存档。可以使用 -v
参数将容器的日志目录挂载到宿主机:
docker run -d -p 8080:80 --name my-nginx -v /my/host/logs:/var/log/nginx nginx:latest
6. 使用 Docker Compose 管理多个容器
6.1 什么是 Docker Compose?
Docker Compose 是一个工具,用于定义和管理多容器 Docker 应用。它使用 YAML 文件来配置应用的服务,然后通过一个简单的命令启动所有服务。
6.2 创建 docker-compose.yml
文件
例如,一个简单的 Web 应用可能需要两个服务:Web 服务和数据库服务。以下是一个 docker-compose.yml
示例:
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpassword
6.3 使用 Docker Compose 启动服务
在项目目录下创建 docker-compose.yml
文件后,使用以下命令启动所有服务:
docker-compose up
这将拉取所需镜像并启动 web
和 db
服务。
6.4 停止和删除服务
要停止并删除容器,可以使用以下命令:
docker-compose down
7. Docker 容器的最佳实践
7.1 使用官方镜像
尽量使用 Docker 官方提供的镜像,这些镜像经过测试和优化,确保了安全性和可靠性。例如,使用 nginx:latest
和 ubuntu:20.04
。
7.2 最小化镜像大小
为了优化镜像的构建时间和存储空间,尽量使用轻量级的基础镜像,如 alpine
镜像:
FROM node:14-alpine
7.3 使用 .dockerignore
文件
.dockerignore
文件用于排除不必要的文件(如 .git
、node_modules
)进入镜像,减少镜像体积:
.dockerignore
示例:
.git
node_modules
*.log
7.4 使用多阶段构建
多阶段构建可以通过多个 FROM
指令优化镜像,减少不必要的构建依赖。
# 第一阶段:构建阶段
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 第二阶段:生产阶段
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
8. 总结
- Docker 容器 是一个轻量级、可移植的应用运行环境,容器化应用可以快速部署、迁移,并保证一致性。
- 容器的基本操作 包括创建、运行、停止、删除容器,管理容器的数据。
- 使用 Docker Compose 可以轻松管理多容器应用,简化开发和部署流程。
- 优化 Docker 镜像 可以减少构建时间和存储空间,提高 Docker 容器的运行效率。