Docker常用命令详解与示例

Docker是现代软件开发和部署中不可或缺的工具,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

1. Docker镜像命令

1.1 拉取镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • 解释:从Docker Hub或其他配置的注册表中拉取镜像。
  • 示例:拉取最新版本的Nginx镜像。
docker pull nginx:latest

1.2 查看镜像列表

docker images [OPTIONS] [REPOSITORY[:TAG]]
  • 选项
    • -a--all:显示所有镜像(默认只显示最新的)。
    • -q--quiet:仅显示镜像ID。
  • 示例
    • 显示所有镜像:

      docker images -a
    • 仅显示镜像ID:

      docker images -q

1.3 删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]
  • 选项
    • -f--force:强制删除镜像,即使该镜像被其他镜像所依赖。
  • 示例
    • 强制删除名为nginx:latest的镜像:

      docker rmi -f nginx:latest

2. Docker容器命令

2.1 运行容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 常用选项
    • -d--detach:后台运行容器,并返回容器ID。
    • -i--interactive:即使没有附加也保持STDIN开放。
    • -t--tty:分配一个伪终端。
    • --name:为容器指定一个名称。
  • 示例
    • 在后台运行一个名为my_nginx的Nginx容器:

      docker run -d --name my_nginx nginx:latest

2.2 查看容器列表

docker ps [OPTIONS]
  • 选项
    • -a--all:显示所有容器(默认只显示运行的)。
    • -q--quiet:仅显示容器ID。
  • 示例
    • 显示所有容器(包括未运行的):

      docker ps -a
    • 仅显示容器ID:

      docker ps -aq

2.3 停止容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]
  • 示例
    • 停止名为my_nginx的容器:

      docker stop my_nginx

2.4 启动容器

docker start [OPTIONS] CONTAINER [CONTAINER...]
  • 示例
    • 启动名为my_nginx的容器:

      docker start my_nginx

2.5 进入容器

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • 常用选项
    • -it:通常一起使用,-i 保持STDIN开放,-t 分配一个伪终端。
  • 示例
    • 进入名为my_nginx的容器,并启动bash:

      docker exec -it my_nginx bash

2.6 删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • 选项
    • -f--force:强制删除正在运行的容器(会先停止容器)。
  • 示例
    • 强制删除名为my_nginx的容器:

      docker rm -f my_nginx

3. Docker Compose命令

Docker Compose是Docker的官方编排工具,用于定义和运行多容器Docker应用程序。

3.1 启动服务

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
  • 解释:此命令用于构建、(重新)创建、启动和附加到由docker-compose.yml文件定义的容器和服务。如果服务没有运行,它们会被创建并启动。如果已经运行,docker-compose up会重新创建它们(除非使用--no-recreate选项),并附加到容器的标准输入/输出/错误。

  • 常用选项

    • -d:在后台运行服务,并打印容器ID。
    • --build:在启动之前构建镜像,即使它们已经存在。
    • --scale:为指定的服务设置运行容器的数量。
  • 示例

    • 在后台启动所有服务:

      docker-compose up -d
    • 在启动之前构建镜像,并启动所有服务:

      docker-compose up --build
    • web服务的容器数量扩展到3个:

      docker-compose up --scale web=3

3.2 停止服务

docker-compose down [options]
  • 解释:停止并移除由docker-compose.yml定义的所有容器、网络、卷、镜像(由--rmi--remove-images指定)和默认网络。

  • 常用选项

    • --rmi--remove-images:停止服务后,移除构建此服务的镜像。
    • -v--volumes:移除服务使用的卷。
  • 示例

    • 停止并移除所有容器、网络和卷(如果需要):

      docker-compose down -v
    • 停止服务并移除所有容器、网络和镜像:

      docker-compose down --rmi --volumes

3.3 查看服务状态

虽然docker-compose没有直接的命令来“查看服务状态”,但可以使用docker-compose ps来列出当前运行的服务及其状态。

docker-compose ps [options] [SERVICE...]
  • 解释:列出由docker-compose.yml定义的服务及其容器ID、端口、状态等信息。

  • 选项

    • -q:仅显示容器ID。
  • 示例

    • 列出所有服务的状态:

      docker-compose ps
    • 仅列出容器ID:

      docker-compose ps -q

3.4 Docker Compose 重启服务

有时候,可能需要重启一个或多个服务而不是完全停止并重新创建它们。Docker Compose 提供了 restart 命令来实现这一点。

docker-compose restart [options] [SERVICE...]
  • 解释:重启由docker-compose.yml定义的一个或多个服务。

  • 选项

    • -t--timeout TIMEOUT:指定重启服务前的超时时间(秒)。
  • 示例

    • 重启所有服务:

      docker-compose restart
    • 重启名为web的服务:

      docker-compose restart web

3.5 Docker Compose 日志

查看服务的日志是调试和监控应用行为的重要部分。Docker Compose 提供了 logs 命令来访问这些日志。

docker-compose logs [options] [SERVICE...]
  • 解释:查看由docker-compose.yml定义的服务日志。

  • 选项

    • --follow-f:持续跟踪日志输出。
    • --tail="all":从日志末尾显示指定数量的行。默认为“all”。
  • 示例

    • 查看所有服务的日志:

      docker-compose logs
    • 持续跟踪web服务的日志:

      docker-compose logs -f web

3.6 Docker Compose 配置文件

Docker Compose 支持使用多个配置文件,这允许根据环境(如开发、测试、生产)定义不同的服务配置。

docker-compose -f <file> ... [options] [COMMAND] [ARGS...]
  • 解释-f 或 --file 选项允许指定一个或多个 Compose 配置文件。可以通过多次使用 -f 选项来指定多个文件。

  • 示例

    • 使用自定义的 docker-compose.override.yml 文件来覆盖默认配置:

      docker-compose -f docker-compose.yml -f docker-compose.override.yml up

3.7 Docker Compose 版本

了解正在使用的 Docker Compose 版本对于解决问题和兼容性检查非常有用。

docker-compose --version
  • 解释:显示 Docker Compose 的版本信息。

4. Docker 镜像和容器的其他命令

4.1 保存和加载镜像

可以将镜像保存为一个文件,然后将其加载到另一个 Docker 主机上。

  • 保存镜像

    docker save -o <path_to_save_image> <image_name>
  • 加载镜像

    docker load -i <path_to_image_file>

4.2 容器端口映射

当运行容器时,经常需要将容器的端口映射到宿主机的端口上。这可以通过 docker run 命令的 -p 或 --publish 选项来实现。

docker run -p <host_port>:<container_port> <image_name>
  • 示例

    docker run -p 8080:80 nginx:latest

这个命令会将容器的 80 端口映射到宿主机的 8080 端口上。

5. Docker Compose 环境变量

Docker Compose允许通过环境变量来配置服务,这使得在不同环境中部署应用变得更加灵活。可以在docker-compose.yml文件中使用环境变量占位符,然后在运行docker-compose命令时通过-e选项或.env文件来设置这些环境变量的值。

使用.env文件

在项目的根目录下创建一个.env文件,并在其中定义环境变量。然后,在docker-compose.yml文件中引用这些环境变量。

示例 .env 文件:

DB_HOST=db  
DB_USER=admin  
DB_PASS=secret

 

示例 docker-compose.yml 引用:

version: '3'  
services:  
  web:  
    image: my-web-app  
    environment:  
      - DB_HOST=${DB_HOST}  
      - DB_USER=${DB_USER}  
      - DB_PASS=${DB_PASS}

 

使用-e选项

也可以在运行docker-compose命令时直接使用-e选项来设置环境变量。

docker-compose up -e DB_HOST=db -e DB_USER=admin -e DB_PASS=secret

6. Docker Compose 配置文件扩展

除了使用多个-f选项来指定多个配置文件外,Docker Compose还支持通过extends关键字在多个配置文件中共享配置。然而,需要注意的是,extends关键字在Docker Compose文件版本3及以上已被弃用,因为它可能导致配置难以理解和维护。

作为替代,可以使用YAML的锚点(&)和别名(*)功能,或者简单地将共享配置放在一个或多个基础配置文件中,并在需要时通过-f选项包含它们。

7. Docker 网络

Docker网络允许容器之间进行通信。Docker Compose会自动为项目创建一个默认网络,但也可以自定义网络配置。

示例 docker-compose.yml 定义自定义网络:

version: '3'  
networks:  
  default:  
    driver: bridge  
    ipam:  
      config:  
        - subnet: 172.20.0.0/16

 

8. Docker Compose 命令行工具的高级用法

Docker Compose命令行工具还提供了许多其他有用的命令和选项,例如:

  • docker-compose exec:在运行的容器中执行命令。
  • docker-compose pause 和 docker-compose unpause:暂停和恢复服务。
  • docker-compose port:打印绑定的端口。
  • docker-compose top:显示容器中运行的进程。

9. Docker 容器卷

容器卷是Docker用于存储和持久化数据的机制。你可以将卷附加到容器上,以便在容器重启时保留数据。

docker-compose.yml中,你可以使用volumes关键字来定义卷,并将其挂载到服务的容器中。

示例 docker-compose.yml 定义卷:

# Docker Compose 文件版本 3  
version: '3'  
  
# 定义服务  
services:  
  # 服务名称: db  
  db:  
    # 使用的镜像名称  
    image: postgres  
    # 挂载的卷配置  
    volumes:  
      # 将名为 db-data 的卷挂载到容器的 /var/lib/postgresql/data 目录  
      # 这个目录是PostgreSQL存储其数据库文件的地方  
      - db-data:/var/lib/postgresql/data  
  
# 定义卷  
volumes:  
  # 卷名称: db-data  
  db-data:  
    # 在这个简单的例子中,没有为卷指定额外的配置(如驱动程序或选项)  
    # 默认情况下,Docker会使用本地驱动程序来创建和管理这个卷  
    # 这个卷将用于存储PostgreSQL数据库的数据,确保即使容器被删除,数据也不会丢失  
    # 注意:在Compose文件中直接定义卷时,不需要指定外部属性(如external: true),  
    # 除非你想引用一个已经在Docker中存在的卷

这个配置文件的作用是:

  1. 使用postgres镜像创建一个名为db的容器服务。
  2. 创建一个名为db-data的Docker卷,并将其挂载到db容器的/var/lib/postgresql/data目录上。这样做的目的是让PostgreSQL的数据(如数据库文件、表等)被存储在Docker卷中,而不是容器的可写层中。这样做的好处是,即使容器被删除并重新创建,存储在卷中的数据也会保持不变,从而实现了数据的持久化。

此外,需要注意的是,由于这个docker-compose.yml文件直接定义了db-data卷,因此当您首次使用docker-compose up命令启动服务时,Docker会自动创建这个卷。如果希望引用一个已经存在的卷(可能是之前创建的,或者是通过其他方式管理的),可以在卷定义中添加external: true属性,并省略卷的详细配置。然而,在这个简单的例子中,我们直接让Docker自动管理卷的创建和删除。

10.Docker 命令中的 -it

在 Docker 的 docker run 命令中,-it 是两个选项的组合,-i 和 -t,它们通常一起使用以提供交互式的终端。

  • -i 或 --interactive:保持容器的标准输入(STDIN)开放,即使没有附加任何东西也是如此。这允许用户与容器内的进程进行交互。
  • -t 或 --tty:分配一个伪终端(pseudo-TTY)或终端。这允许用户像在使用普通终端一样与容器交互,包括处理信号和窗口大小变化等。

组合使用-it 一起使用时,提供了一个完整的交互式终端,让用户能够像在本地终端中一样与容器中的程序进行交互。

其他常用 Docker 命令选项

  • --name:为容器指定一个名称。如果不指定,Docker 会自动生成一个随机名称。

    docker run --name my-container-name -it ubuntu /bin/bash

  • -d 或 --detach:在后台运行容器,并打印容器 ID。这允许你运行容器并在需要时附加到它,而不是阻塞终端。

    docker run -d --name my-detached-container ubuntu /bin/bash -c "while true; do echo hello world; sleep 1; done"

  • -p 或 --publish:发布容器端口到主机上。格式为 <主机端口>:<容器端口>

    docker run -p 8080:80 --name my-web-server nginx

  • --rm:容器停止后自动删除容器。这有助于清理不再需要的容器,避免占用额外的磁盘空间。

    docker run --rm -it ubuntu /bin/bash

  • --env 或 -e:设置环境变量。这允许你传递配置信息到容器中运行的程序。

    docker run -e MY_VAR=myvalue -it ubuntu /bin/bash

  • --volume 或 -v:挂载卷。这允许你将主机上的目录或文件挂载到容器内的指定位置,实现数据持久化或共享数据。

    docker run -v /my/host/dir:/my/container/dir -it ubuntu /bin/bash

  • --network:指定容器运行的网络。Docker 提供了多种网络模式,包括桥接(bridge)、主机(host)、覆盖(overlay)等。

    docker run --network my-custom-network -it ubuntu /bin/bash

Docker 的 docker run 命令提供了丰富的选项,允许用户以灵活的方式运行容器。-it 选项的组合特别有用,因为它们提供了一个交互式终端,让用户能够直接与容器内的程序交互。其他选项如 --name-d-p--rm--env--volume 和 --network 则提供了更多的控制和灵活性,让用户能够根据自己的需求定制容器的运行方式。

11. Docker Swarm 与 Docker Compose

虽然Docker Compose主要用于单机部署,但Docker Swarm允许使用类似的docker-compose.yml文件来定义和管理跨多个Docker节点的服务。Docker Stack命令(如docker stack deploy)允许使用Compose文件在Swarm集群上部署应用。

12. Docker Compose 的版本控制

由于docker-compose.yml文件是定义服务、网络和卷等的核心配置文件,因此它应该被纳入版本控制系统(如Git)中。这有助于跟踪配置更改,促进团队协作,并确保开发、测试和生产环境之间的一致性。

13. Docker Compose 的安全性考虑

  • 镜像安全:确保使用的Docker镜像来自可信源,并且是最新的,以避免已知漏洞。
  • 网络隔离:通过Docker网络隔离服务,减少潜在的攻击面。
  • 访问控制:使用Docker的访问控制功能(如Docker Content Trust)来验证镜像的完整性和来源。
  • 环境变量管理:避免在docker-compose.yml文件中硬编码敏感信息(如数据库密码)。使用环境变量或加密的配置管理工具来管理这些敏感信息。

14. Docker Compose 与 CI/CD 集成

Docker Compose可以轻松地与持续集成/持续部署(CI/CD)工具集成,以实现自动化的构建、测试和部署流程。

  • 构建阶段:在CI流程中,使用Dockerfile构建镜像,并推送到Docker仓库。
  • 测试阶段:使用Docker Compose启动服务并运行自动化测试,以确保新代码不影响现有功能。
  • 部署阶段:在CD流程中,使用Docker Compose(或Docker Stack,对于Swarm集群)将服务部署到生产环境。

15. Docker Compose 的扩展性

虽然Docker Compose主要用于单机部署,但它可以通过与Docker Swarm或Kubernetes等容器编排工具结合使用来实现更高级别的扩展性和容错性。

  • Docker Swarm:使用Docker Stack命令将Compose文件部署到Swarm集群,以实现跨多个节点的服务部署和扩展。
  • Kubernetes:虽然Kubernetes不使用Compose文件,但你可以使用工具(如Kompose)将Compose文件转换为Kubernetes的YAML配置文件,然后利用Kubernetes的强大功能来管理容器化应用。

16. Docker Compose 的性能优化

  • 资源限制:在docker-compose.yml中设置容器的CPU和内存限制,以避免单个服务占用过多资源而影响其他服务。
  • 镜像优化:优化Dockerfile以减少镜像大小和提高构建速度。
  • 网络优化:根据应用的需求选择合适的网络驱动和配置,以减少网络延迟和提高吞吐量。

17. Docker Compose 的最佳实践

  • 使用标签:为镜像和服务添加有意义的标签,以便于版本控制和管理。
  • 文档化:为docker-compose.yml文件和相关的Dockerfile编写清晰的文档,说明每个服务的配置和依赖关系。
  • 模块化:将服务拆分成多个小的、可重用的模块,并在需要时通过Compose文件组合它们。
  • 持续监控:使用监控工具(如Prometheus、Grafana)来跟踪服务的性能和健康状态。

  • 18
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值