Docker 简介

Docker 简介

Docker是一种轻量级的容器化平台,使得应用程序及其依赖项可以在一个独立的环境中运行。本文将深入介绍Docker的常用命令,帮助你更好地使用和管理Docker容器。

    1. 容器生命周期管理
    • 1.1 启动容器
    • 1.2 列出运行中的容器
    • 1.3 停止容器
    • 1.4 启动已停止的容器
    • 1.5 重启容器
    1. 容器信息查看
    • 2.1 查看容器详细信息
    • 2.2 查看容器日志
    1. 容器交互和文件操作
    • 3.1 进入运行中的容器
    • 3.2 复制文件到容器
    • 3.3 从容器复制文件到本地
    1. 镜像管理
    • 4.1 列出本地镜像
    • 4.2 拉取镜像
    • 4.3 删除本地镜像
    • 4.4 构建镜像
    1. 网络管理
    • 5.1 列出网络
    • 5.2 创建网络
    • 5.3 连接容器到网络
    1. 数据卷和数据管理
    • 6.1 创建数据卷
    • 6.2 列出数据卷
    • 6.3 挂载数据卷
    • 6.4 删除数据卷
    1. Docker Compose
    • 7.1 创建并启动容器组
    • 7.2 停止并删除容器组
    • 7.3 查看容器组状态
    1. 容器备份与恢复
    • 8.1 导出容器
    • 8.2 导入容器
    1. Docker Swarm
    • 9.1 初始化Swarm
    • 9.2 创建服务
    • 9.3 列出服务
    • 9.4 扩展服务
    1. 安全性和权限
    • 10.1 用户权限管理
    • 10.2 安全扫描
    • 10.3 Docker Bench for Security
    1. Docker与持续集成/持续部署(CI/CD)
    • 11.1 Docker与Travis CI
    • 11.2 Docker与Jenkins
    1. Docker与云服务
    • 12.1 Docker与AWS
    • 12.2 Docker与Azure
    1. Docker和日志管理
    • 13.1 查看容器日志
    • 13.2 设置日志驱动
    • 13.3 指定日志标签
    1. Docker和资源限制
    • 14.1 设置容器内存限制
    • 14.2 设置CPU共享
    1. Docker和环境变量
    • 15.1 设置环境变量
    • 15.2 从文件加载环境变量
    1. Docker与监控
    • 16.1 查看容器资源使用情况
    • 16.2 使用cAdvisor监控容器
    1. Docker和自动化脚本
    • 17.1 Docker Compose自动化脚本
    • 17.2 使用Dockerfile构建自定义镜像
    1. Docker和容器间通信
    • 18.1 容器间通信
    • 18.2 使用Link进行容器通信
    1. 多阶段构建
    1. Docker和服务发现
    1. Docker和容器健康检查
    1. Docker和GPU支持
    1. Docker和分布式存储
    1. Docker和自动扩展
  • 总结

1. 容器生命周期管理

1.1 启动容器

使用docker run命令启动一个容器,同时指定镜像名称。

1
docker runhello-world

上述命令将下载并运行hello-world镜像。如果本地不存在该镜像,Docker将自动从Docker Hub下载。

1.2 列出运行中的容器

使用docker ps命令列出当前正在运行的容器。

1
docker ps

如果需要显示所有容器(包括停止的),可以使用-a选项。

1
docker ps -a

1.3 停止容器

使用docker stop命令停止运行中的容器。

1
docker stop <container_id>

1.4 启动已停止的容器

使用docker start命令启动一个已停止的容器。

1
docker start <container_id>

1.5 重启容器

使用docker restart命令重启容器。

1
docker restart <container_id>

2. 容器信息查看

2.1 查看容器详细信息

使用docker inspect命令查看容器的详细信息。

1
docker inspect <container_id>

2.2 查看容器日志

使用docker logs命令查看容器的日志信息。

1
docker logs <container_id>

上述命令将显示容器的标准输出日志。如果需要实时查看日志,可以使用-f选项。

1
docker logs -f <container_id>

3. 容器交互和文件操作

3.1 进入运行中的容器

使用docker exec命令进入正在运行的容器。

1
docker exec -it <container_id> /bin/bash

上述命令中,-it选项允许交互式访问,/bin/bash是要执行的命令,你也可以替换成其他Shell。

3.2 复制文件到容器

使用docker cp命令将本地文件复制到容器中。

1
docker cp /local/path/file.txt <container_id>:/container/path/file.txt

3.3 从容器复制文件到本地

反之,可以使用docker cp命令将容器中的文件复制到本地。

1
docker cp <container_id>:/container/path/file.txt /local/path/file.txt

4. 镜像管理

4.1 列出本地镜像

使用docker images命令列出本地所有的镜像。

1
docker images

4.2 拉取镜像

使用docker pull命令从Docker Hub拉取指定的镜像。

1
docker pull ubuntu:latest

4.3 删除本地镜像

使用docker rmi命令删除本地的一个或多个镜像。

1
docker rmi <image_id>

4.4 构建镜像

使用docker build命令根据Dockerfile构建自定义镜像。

1
docker build -t my-custom-image:latest .

5. 网络管理

5.1 列出网络

使用docker network ls命令列出所有网络。

1
docker network ls

5.2 创建网络

使用docker network create命令创建一个新网络。

1
docker network create my-network

5.3 连接容器到网络

使用docker network connect命令将容器连接到指定网络。

1
docker network connect my-network <container_id>

6. 数据卷和数据管理

6.1 创建数据卷

使用docker volume create命令创建一个新的数据卷。

1
docker volume create my-volume

6.2 列出数据卷

使用docker volume ls命令列出所有数据卷。

1
docker volume ls

6.3 挂载数据卷

在运行容器时,使用-v选项将数据卷挂载到容器内。

1
docker run -v my-volume:/container/path my-image

6.4 删除数据卷

使用docker volume rm命令删除一个或多个数据卷。

1
docker volume rm my-volume

7. Docker Compose

7.1 创建并启动容器组

使用docker-compose up命令创建并启动Docker Compose定义的所有容器组。

1
docker-compose up

7.2 停止并删除容器组

使用docker-compose down命令停止并删除Docker Compose定义的所有容器组。

1
docker-compose down

7.3 查看容器组状态

使用docker-compose ps命令查看Docker Compose定义的容器组状态。

1
docker-compose ps

8. 容器备份与恢复

8.1 导出容器

使用docker export命令将容器导出为一个文件。

1
docker export -o my-container.tar my-container

8.2 导入容器

使用docker import命令从一个文件导入容器。

1
docker import my-container.tar my-imported-container

9. Docker Swarm

Docker Swarm是Docker官方提供的容器编排和集群管理工具。它允许将多个Docker主机组合成一个虚拟的主机,以简化容器的部署、伸缩和管理。

9.1 初始化Swarm

使用docker swarm init命令初始化一个Swarm。

1
docker swarm init

此命令将输出一个加入Swarm的命令,你可以将该命令复制到其他主机上以将它们加入Swarm。

9.2 创建服务

使用docker service create命令创建一个新的服务。

1
docker service create --name my-web-service -p 8080:80 my-web-image

9.3 列出服务

使用docker service ls命令列出所有正在运行的服务。

1
docker service ls

9.4 扩展服务

使用docker service scale命令扩展服务的副本数量。

1
docker service scale my-web-service=5

10. 安全性和权限

10.1 用户权限管理

Docker有一个docker组,只要用户属于该组,就可以在不使用sudo的情况下运行Docker命令。将用户添加到docker组:

1
sudo usermod -aG docker $USER

10.2 安全扫描

使用Docker安全扫描工具,如Clair,对容器中的镜像进行漏洞扫描。

1
docker scan my-image

10.3 Docker Bench for Security

Docker Bench for Security 是一个开源项目,用于检查Docker运行时的安全性设置。

1
2
3
4
5
6
7
docker run -it --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/systemd:/usr/lib/systemd \
-v /etc:/etc --label docker_bench_security \
docker/docker-bench-security

11. Docker与持续集成/持续部署(CI/CD)

11.1 Docker与Travis CI

Travis CI是一个流行的持续集成服务,可以与Docker集成以构建和测试应用程序。

1
2
3
4
5
6
7
8
9
# .travis.yml
language: generic

services:
- docker

script:
- docker build -t my-app .
- docker run my-app npm test

11.2 Docker与Jenkins

Jenkins是另一个强大的持续集成工具,可以使用Docker插件构建和部署应用程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Jenkinsfile
pipeline {
agent any

stages {
stage('Build') {
steps {
script {
docker.build('my-app')
}
}
}
stage('Test') {
steps {
script {
docker.image('my-app').withRun('-p 8080:80') {
sh 'npm test'
}
}
}
}
}
}

12. Docker与云服务

12.1 Docker与AWS

亚马逊AWS提供了一系列服务来支持Docker容器的运行和管理,如Amazon ECS、Amazon EKS等。

12.2 Docker与Azure

微软Azure也提供了强大的Docker集成,包括Azure Container Instances和Azure Kubernetes Service等服务。

13. Docker和日志管理

13.1 查看容器日志

使用docker logs命令查看容器的标准输出日志。

1
docker logs <container_id>

13.2 设置日志驱动

通过--log-driver选项,可以设置容器的日志驱动程序。

1
docker run --log-driver=syslog my-image

13.3 指定日志标签

使用--log-opt选项,可以指定一些日志标签。

1
docker run --log-opt tag=my-app my-image

14. Docker和资源限制

14.1 设置容器内存限制

通过-m选项,可以设置容器的内存限制。

1
docker run -m 512m my-image

14.2 设置CPU共享

通过--cpu-shares选项,可以设置容器的CPU共享。

1
docker run --cpu-shares 256 my-image

15. Docker和环境变量

15.1 设置环境变量

使用-e选项,可以在运行容器时设置环境变量。

1
docker run -e MY_VARIABLE=my-value my-image

15.2 从文件加载环境变量

使用--env-file选项,可以从文件中加载环境变量。

1
docker run --env-file my-env-file my-image

16. Docker与监控

16.1 查看容器资源使用情况

使用docker stats命令查看运行容器的资源使用情况。

1
docker stats <container_id>

16.2 使用cAdvisor监控容器

cAdvisor 是由Google开发的用于监控容器资源使用的工具。你可以通过以下方式使用它:

1
2
3
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 \
--detach=true --name=cadvisor google/cadvisor:latest

然后在浏览器中访问 http://localhost:8080 来查看监控信息。

17. Docker和自动化脚本

17.1 Docker Compose自动化脚本

使用docker-compose.yml文件来定义多容器服务,然后通过docker-compose命令进行管理。

1
2
3
4
5
6
7
8
9
# docker-compose.yml
version: '3'
services:
web:
image: nginx:alpine
database:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
1
docker-compose up -d

17.2 使用Dockerfile构建自定义镜像

创建一个Dockerfile文件,定义如何构建镜像。

1
2
3
4
# Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
CMD ["nginx", "-g", "daemon off;"]
1
docker build -t my-nginx-image .

18. Docker和容器间通信

18.1 容器间通信

使用docker network create命令创建一个自定义网络,然后在运行容器时指定该网络,以实现容器间的通信。

1
2
3
4
5
6
# 创建自定义网络
docker network create my-network

# 运行容器并加入网络
docker run --network my-network --name container-1 my-image
docker run --network my-network --name container-2 my-image

此时,container-1container-2可以通过容器名相互通信。

18.2 使用Link进行容器通信

通过--link选项,可以将一个容器连接到另一个容器,实现它们之间的通信。

1
2
3
# 运行容器并链接到其他容器
docker run --name container-1 my-image
docker run --name container-2 --link container-1:alias my-image

现在,container-2可以通过alias来访问container-1

19. 多阶段构建

多阶段构建允许你在一个Dockerfile中定义多个构建阶段,最终生成一个小巧的镜像。

1
2
3
4
5
6
7
8
9
10
11
12
# Dockerfile
# 阶段一:构建应用
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 阶段二:生成最终镜像
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html

20. Docker和服务发现

Docker提供了内置的服务发现工具,可通过容器名或服务名来解析服务的IP地址。

1
2
3
# 使用容器名访问服务
docker run --name my-container my-image
docker exec my-container ping my-other-container
1
2
3
# 使用服务名访问服务
docker service create --name my-service my-image
docker exec my-container ping my-service

21. Docker和容器健康检查

Docker容器健康检查是通过HEALTHCHECK指令在Dockerfile中定义的。这有助于在运行时监测容器的健康状态。

1
2
3
4
5
6
# Dockerfile
FROM nginx:alpine

# 添加健康检查
HEALTHCHECK --interval=5s --timeout=3s \
CMD wget -qO- http://localhost/ || exit 1

运行容器时,可以使用docker inspect命令查看容器的健康状态。

1
2
docker run --name my-nginx-container my-nginx-image
docker inspect --format='{{json .State.Health.Status}}' my-nginx-container

22. Docker和GPU支持

Docker支持在容器中使用GPU资源,这对于深度学习等GPU密集型任务非常有用。

1
2
# 运行容器并使用GPU
docker run --gpus all my-gpu-image

请注意,使用GPU需要安装NVIDIA Container Toolkit等相应的工具。

23. Docker和分布式存储

Docker提供了多种方式来处理容器中的数据持久性,其中包括使用分布式存储系统。

1
2
# 使用Docker卷
docker run -v my-volume:/data my-image

此外,你还可以考虑使用分布式存储系统,如GlusterFS、Ceph等,以实现跨多个Docker主机的数据共享。

24. Docker和自动扩展

Docker Swarm允许你自动扩展服务,以适应不断变化的负载。

1
2
# 扩展服务副本数量
docker service scale my-service=5

这将自动创建或销毁服务的副本,以保持指定数量的运行中容器。

总结

Docker作为一种轻量级的容器化平台,通过其强大的特性和丰富的生态系统,为应用程序的构建、部署和管理提供了高效、便捷的解决方案。本文深入介绍了Docker的常用命令,覆盖了容器的生命周期管理、网络配置、资源限制、环境变量设置、多阶段构建、监控与日志、服务发现、GPU支持、分布式存储以及自动扩展等多个方面。

通过学习本文,你将掌握:

  • 容器的基本生命周期管理: 启动、停止、重启、删除容器,以及查看运行中容器的状态。
  • 容器间通信与网络配置: 使用自定义网络、Link选项等实现容器之间的通信,以及使用cAdvisor监控容器资源使用情况。
  • 资源限制和环境变量: 设置容器内存限制、CPU共享,以及在运行容器时设置环境变量。
  • Docker Compose和自动化脚本: 利用Docker Compose定义和管理多容器服务,以及使用Dockerfile构建自定义镜像。
  • 多阶段构建和服务发现: 使用多阶段构建生成小巧的镜像,以及通过服务名或容器名实现容器间的服务发现。
  • 容器健康检查和GPU支持: 在Dockerfile中定义容器健康检查,以及在容器中使用GPU资源。
  • 分布式存储和自动扩展: 利用Docker卷处理容器中的数据持久性,以及使用Docker Swarm实现自动扩展服务。

Docker的强大功能使其成为现代应用程序开发和部署的理想选择。通过熟练掌握这些命令,你将能够更加灵活、高效地管理和运行容器化应用。


Docker 简介
https://schrodingerfish.github.io/2025/02/07/Docker/Docker简介/
作者
Johnson
发布于
2025年2月7日
许可协议