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

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

11.1 Docker与Travis CI

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

  1. # .travis.yml
  2. language: generic
  3. services:
  4. - docker
  5. script:
  6. - docker build -t my-app .
  7. - docker run my-app npm test

11.2 Docker与Jenkins

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

  1. // Jenkinsfile
  2. pipeline {
  3. agent any
  4. stages {
  5. stage('Build') {
  6. steps {
  7. script {
  8. docker.build('my-app')
  9. }
  10. }
  11. }
  12. stage('Test') {
  13. steps {
  14. script {
  15. docker.image('my-app').withRun('-p 8080:80') {
  16. sh 'npm test'
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

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. docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro \
  2. --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 \
  3. --detach=true --name=cadvisor google/cadvisor:latest

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

17. Docker和自动化脚本

17.1 Docker Compose自动化脚本

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

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

17.2 使用Dockerfile构建自定义镜像

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

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

18. Docker和容器间通信

18.1 容器间通信

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

  1. # 创建自定义网络
  2. docker network create my-network
  3. # 运行容器并加入网络
  4. docker run --network my-network --name container-1 my-image
  5. docker run --network my-network --name container-2 my-image

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

18.2 使用Link进行容器通信

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

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

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

19. 多阶段构建

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

  1. # Dockerfile
  2. # 阶段一:构建应用
  3. FROM node:14 AS build
  4. WORKDIR /app
  5. COPY package*.json ./
  6. RUN npm install
  7. COPY . .
  8. RUN npm run build
  9. # 阶段二:生成最终镜像
  10. FROM nginx:alpine
  11. COPY --from=build /app/dist /usr/share/nginx/html

20. Docker和服务发现

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

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

21. Docker和容器健康检查

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

  1. # Dockerfile
  2. FROM nginx:alpine
  3. # 添加健康检查
  4. HEALTHCHECK --interval=5s --timeout=3s \
  5. CMD wget -qO- http://localhost/ || exit 1

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

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

22. Docker和GPU支持

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

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

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

23. Docker和分布式存储

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

  1. # 使用Docker卷
  2. 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支持、分布式存储以及自动扩展等多个方面。