什么是Docker?
Docker是一个用来构建、分发、运行容器的平台。它常见的对象包括 image、container、network、volume 等。Docker还会默认从Docker Hub这样的镜像仓库拉取镜像。
可以将Docker体系中的核心对象概括为以下几类:
- 镜像(Image):镜像是用于创建容器的只读模板,通常包含应用程序本身、运行时环境、依赖库、配置文件以及启动所需的元数据。
- 容器(Container):容器是镜像的运行实例,是一个相对独立的执行环境。容器在运行时基于镜像创建,并在其上增加可写层以支持进程执行和状态变化。
- Dockerfile:Dockerfile是定义镜像构建过程的声明式文本文件,用于描述基础镜像、构建步骤、文件复制、环境配置以及容器启动命令等内容。
- Volume:Volume是Docker提供的数据持久化机制,用于将容器中的数据独立于容器生命周期之外进行存储,适合保存数据库文件、日志及其他需要长期保留的数据。
- Network:Network是Docker的网络抽象机制,用于实现容器之间、容器与宿主机之间以及容器与外部服务之间的通信。
- Registry:Registry是集中存储和分发镜像的仓库服务,用于镜像的上传、版本管理、共享与拉取,例如 Docker Hub或企业内部私有镜像仓库。
注意:镜像是只读模板,用来创建容器。容器是镜像的运行实例,可以启动、停止、删除。同一个镜像,可以启动多个容器。
Dockerfile
Dockerfile 是一个文本文件,里面写的是如何自动构建镜像。Docker 会按照 Dockerfile 中的指令顺序执行,且通常必须从 FROM 开始。默认文件名就叫 Dockerfile。
一个最简单的例子:
1 | # syntax=docker/dockerfile:1 |
这段的意思:
FROM:基于哪个基础镜像WORKDIR:设置工作目录COPY:把当前项目文件复制进镜像RUN:构建时执行命令CMD:容器启动时默认执行的命令
常用的Docker命令
在基于 Dockerfile 的开发流程中,常用命令主要围绕 镜像构建、容器创建、容器运行状态查看、容器内部操作以及容器清理 展开。
构建镜像
1 | docker build -t myapp:1.0 . |
该命令用于根据当前目录中的 Dockerfile 构建镜像。
其中:
build表示执行镜像构建操作-t myapp:1.0用于为镜像指定名称和tag-t:后面传递名字以及tag参数,但-t这部分其实是非必要的。myapp:镜像名,严格说常对应 repository/name(如果用了-t,那么这个名字参数就是必要的)1.0:镜像的tag(非必要参数)
.表示以当前目录作为构建上下文
如果创建时未给定名字:
1 | docker build . |
后续则只能通过镜像id来调用它。
运行容器
1 | docker run --name myapp-container -d -p 8080:80 myapp:1.0 |
该命令用于基于指定镜像创建并启动容器。
其中:
--name用于指定容器名称-d表示以后台模式运行-d表示detached mode,也就是让容器在后台运行。
不写-d的话,容器会在当前终端前台运行,你会直接看到程序输出。-p 8080:80表示将宿主机端口映射到容器端口它的作用是把宿主机端口映射到容器端口。
只有当你的容器里运行的是 Web 服务、API 服务之类,需要从宿主机或外部访问时,这个参数才通常需要。Docker 网络文档把这种能力称为端口发布。myapp:1.0表示运行的目标镜像:1.0这部分可以省略;省略时默认使用latest标签。
最简洁的运行命令:
1 | docker run myapp |
其他的都是非必需的参数。
但建议加上名字,方便后续调用:
1 | docker run --name myapp-container myapp |
查看正在运行的容器
1 | docker ps |
用于查看当前处于运行状态的容器。
如果需要查看所有容器,包括已停止的容器,可以使用:
1 | docker ps -a |
查看本地镜像
1 | docker images |
用于查看当前本地已经构建完成或已存在的镜像列表。
查看容器日志
1 | docker logs myapp-container |
用于查看容器的标准输出和标准错误输出,通常用于排查应用启动失败或运行异常等问题。
如果希望持续跟踪日志输出,可以使用:
1 | docker logs -f myapp-container |
进入容器内部执行命令
1 | docker exec -it myapp-container /bin/sh |
该命令用于进入正在运行的容器内部,便于查看文件、检查配置或手动执行命令。
其中:
exec表示在运行中的容器内执行命令-it表示以交互方式进入容器终端/bin/sh表示在容器内启动一个 Shell
如果容器中安装了 Bash,也可以使用:
1 | docker exec -it myapp-container /bin/bash |
停止容器
1 | docker stop myapp-container |
用于停止正在运行的容器。
启动已经停止的容器
1 | docker start myapp-container |
用于重新启动一个已经存在但当前处于停止状态的容器。
重启容器
1 | docker restart myapp-container |
用于重启容器,常用于配置更新后重新加载应用。
删除容器
1 | docker rm myapp-container |
用于删除已经停止的容器。
如果容器仍在运行,通常需要先停止后再删除。
删除镜像
1 | docker rmi myapp:1.0 |
用于删除本地镜像。
如果仍有容器依赖该镜像,通常需要先删除相关容器,再删除镜像。
挂载数据卷运行容器
1 | docker run --name myapp-container -d -p 8080:80 -v mydata:/app/data myapp:1.0 |
用于在启动容器时挂载数据卷,以实现数据持久化存储。
其中:
-v mydata:/app/data表示将名为mydata的数据卷挂载到容器内的/app/data目录
查看容器详细信息
1 | docker inspect myapp-container |
用于查看容器的详细配置信息,例如网络配置、挂载信息、环境变量和启动参数等。
查看镜像构建历史
1 | docker history myapp:1.0 |
用于查看镜像各层的构建历史,便于分析镜像组成和优化镜像体积。