一、Docker 基础概念速览
深入学习 Docker 常用命令之前,我们先来快速认识一下 Docker 的几个核心概念,
镜像(Image)
Docker 镜像可以看作是一个精心制作的 “软件包”,它包含了运行应用程序所需的一切,包括代码、运行时环境、库、环境变量以及各种依赖项 。这个 “软件包” 是只读的,就像一个模板,为容器的创建提供了标准化的基础。比如我们想要运行一个基于 Python 的 Web 应用,那么对应的镜像里就会包含 Python 解释器、相关的 Python 库以及我们编写的 Web 应用代码等。
容器(Container)
容器是从镜像创建的运行实例,容器为应用程序提供了一个隔离的运行环境,它拥有自己独立的文件系统、网络空间和进程空间,各个容器之间相互隔离,互不干扰 。
仓库(Repository)
仓库是集中存放镜像的地方,仓库分为公开仓库和私有仓库 。公开仓库如 Docker Hub,是一个全球开发者都可以访问和使用的公共镜像库,里面包含了海量的官方和社区贡献的镜像,我们可以从中轻松获取到各种常用软件的镜像,比如 Nginx、MySQL 等。私有仓库则通常搭建在企业内部,用于存储和管理企业自己的镜像,保证了镜像的安全性和私密性 。每个仓库可以包含多个镜像,而每个镜像又可以通过标签(tag)来区分不同的版本,方便我们进行版本管理和控制。
二、常用命令大集合
镜像相关命令
查看本地镜像
使用docker images命令可以查看本地已经下载的所有镜像。它会列出镜像的存储库名称(REPOSITORY)、标签(TAG)、镜像 ID(IMAGE ID)、创建时间(CREATED)以及所占用的空间(SIZE) 。例如:
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 05a60462f8ba 5 days ago 181MBredis latest 5f515359c7f8 5 days ago 183MB
通过这个命令,我们可以清晰地了解本地都有哪些镜像。
拉取镜像
从镜像仓库中拉取镜像到本地,使用docker pull命令 。语法为docker pull [选项] [docker镜像地址:标签] 。如果不指定标签,默认会拉取latest标签的镜像。比如我们要拉取最新版的ubuntu镜像,可以这样操作:
$ docker pull ubuntu:latest
删除镜像
当我们不再需要某个镜像时,可以使用docker rmi命令来删除它 。命令格式为docker rmi 镜像id或镜像名称 。例如,要删除刚才拉取的ubuntu镜像(假设镜像 ID 为123456),可以执行:
$ docker rmi 123456
需要注意的是,如果该镜像正在被某个容器使用,是无法直接删除的,需要先停止并删除相关容器,才能删除镜像。
构建镜像
使用docker build命令可以根据Dockerfile文件构建自定义镜像 。Dockerfile是一个包含了一系列指令的文本文件,用于定义镜像的构建步骤 。假设我们有一个Dockerfile文件,位于当前目录下,要构建一个名为,可以使用以下命令,这会从当前目录读取 Dockerfile 并构建一个名为myapp:1.0的镜像
$ docker build -t myapp:1.0.
其中,-t参数用于指定镜像的名称和标签,最后的.表示Dockerfile所在的目录为当前目录。
容器操作命令
创建并运行容器
使用docker run命令可以基于镜像创建一个新的容器并运行它 。这个命令非常强大,有很多参数可以用来定制容器的运行方式 。例如,我们要基于nginx镜像创建一个容器,并将容器的 80 端口映射到主机的 8080 端口,以后台模式运行,可以这样写:
$ docker run -d -p 8080:80 nginx
这里的-d参数表示以后台模式运行容器,-p 8080:80表示将容器的 80 端口映射到主机的 8080 端口 。通过这种方式,我们就可以在浏览器中访问http://localhost:8080来查看nginx的默认页面了。
列出容器
docker ps命令用于列出当前正在运行的容器 。如果想要查看所有容器(包括已停止的),可以使用docker ps -a命令 。例如:
$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESabcdef123456 nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp my-nginx7890abcd1234 ubuntu:latest "/bin/bash" 2 hours ago Exited (0) 1 hour ago sleepy_shtern
输出结果中包含了容器 ID、镜像名称、启动命令、创建时间、状态、端口映射以及容器名称等信息,方便我们对容器进行管理和监控。
启动 / 停止 / 重启容器
启动容器
对于已经创建但处于停止状态的容器,可以使用docker start命令来启动它 。例如:docker start my-nginx 。
停止容器
使用docker stop命令可以停止正在运行的容器 。例如:docker stop my-nginx 。
重启容器
docker restart命令用于重启一个容器 。例如:docker restart my-nginx 。
进入容器
当我们需要在容器内部执行一些命令,对容器进行调试或管理时,可以使用docker exec命令进入正在运行的容器 。例如,要进入刚才创建的nginx容器,并打开一个交互式终端,可以执行:
$ docker exec -it my-nginx /bin/bash
这里的-it参数表示以交互式终端的方式进入容器,my-nginx是容器名称,/bin/bash是要在容器内执行的命令,即打开一个bash终端 。
删除容器
使用docker rm命令可以删除一个或多个容器 。例如,要删除刚才创建的sleepy_shtern容器,可以执行:
$ docker rm sleepy_shtern
同样需要注意的是,正在运行的容器是无法直接删除的,需要先停止容器,或者使用docker rm -f命令来强制删除(-f表示强制)。
网络管理命令
查看网络
使用docker network ls命令可以列出所有的 Docker 网络 。这些网络包括默认的bridge网络、host网络和none网络,以及用户自定义的网络 。例如:
$ docker network lsNETWORK ID NAME DRIVER SCOPE0123456789ab bridge bridge localabcdef123456 host host localfedcba987654 none null local
通过这个命令,我们可以了解当前系统中存在哪些网络,以及它们的驱动类型和作用范围。
创建网络
可以使用docker network create命令来创建自定义网络 。例如,创建一个名为my-network的桥接网络,可以执行:
$ docker network create --driver bridge my-network
这里的--driver bridge表示使用桥接驱动来创建网络,my-network是网络名称 。自定义网络可以帮助我们更好地管理容器之间的网络通信,实现更灵活的网络配置。
连接 / 断开容器与网络
连接容器到网络
使用docker network connect命令可以将容器连接到指定的网络 。例如,将my-nginx容器连接到刚才创建的my-network网络,可以执行:
$ docker network connect my-network my-nginx
断开容器与网络的连接
使用docker network disconnect命令可以断开容器与网络的连接 。例如:docker network disconnect my-network my-nginx 。
查看容器IP
$ docker inspect 容器名称或是ID
数据卷命令
创建数据卷
使用docker volume create命令可以创建一个新的数据卷 。数据卷是一个可供容器使用的特殊目录,它可以实现容器数据的持久化存储,并且可以在多个容器之间共享数据 。例如,创建一个名为my-volume的数据卷,可以执行:
$ docker volume create my-volume
列出数据卷
docker volume ls命令用于列出所有已创建的数据卷 。例如:
$ docker volume lsDRIVER VOLUME NAMElocal my-volume
查看数据卷信息
使用docker volume inspect命令可以查看指定数据卷的详细信息,包括数据卷的挂载点、驱动信息等 。例如:
$ docker volume inspect my-volume[ { "CreatedAt": "2024-01-01T12:00:00Z", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-volume/_data", "Name": "my-volume", "Options": {}, "Scope": "local" }]
删除数据卷
:当我们不再需要某个数据卷时,可以使用docker volume rm命令来删除它 。例如:docker volume rm my-volume 。需要注意的是,只有未被任何容器使用的数据卷才能被删除,如果数据卷正在被使用,需要先停止相关容器并断开数据卷的挂载,才能删除数据卷。
其他实用命令
查看 Docker 版本
使用docker version命令可以查看当前安装的 Docker 客户端和服务器的版本信息,包括版本号、构建信息、API 版本等 。例如:
$ docker versionClient:Version: 20.10.7API version: 1.41
获取系统信息
docker info命令用于获取 Docker 系统的详细信息,包括容器和镜像的数量、存储驱动、网络配置等 。例如:
$ docker info
清理资源
随着我们使用 Docker 的过程中,会产生一些临时镜像、停止的容器以及未被使用的数据卷等资源,这些资源会占用磁盘空间 。使用docker system prune命令可以清理这些无用的资源 。例如:
$ docker system prune
执行该命令时,会提示将要删除的资源,输入y确认后即可开始清理 。此外,还可以使用docker image prune命令来清理未被使用的镜像,docker container prune命令来清理停止的容器,docker volume prune命令来清理未被使用的数据卷 。
三、实战演练
接下来,我们通过一个具体的案例,来实际运用一下刚才学到的 Docker 命令,看看如何使用 Docker 部署一个简单的 Web 应用 。
假设我们有一个用 Flask 框架编写的 Python Web 应用,它的功能非常简单,就是在浏览器中访问时,返回 “Hello, Docker!” 这样一句话 。
准备工作
首先,确保你的机器上已经安装了 Docker。如果还没有安装,可以参考
准备好我们的 Flask 应用代码,保存为app.py文件,内容如下:
同时,我们还需要创建一个requirements.txt文件,用于指定应用所需的依赖包,内容为:
Flask
构建镜像
在应用代码所在的目录下,创建一个名为Dockerfile的文件,用于定义镜像的构建步骤 。Dockerfile的内容如下:
# 使用Python官方镜像作为基础镜像FROM python:3.9-slim# 设置工作目录WORKDIR /app# 将当前目录下的所有文件复制到容器的/app目录下COPY. /app# 安装应用所需的依赖包RUN pip install -r requirements.txt# 暴露5000端口,这是Flask应用默认运行的端口EXPOSE 5000# 定义容器启动时要执行的命令CMD ["python", "app.py"]
接下来,使用docker build命令来构建镜像 。在终端中进入到包含Dockerfile的目录,执行以下命令:
$ docker build -t my-flask-app:1.0.
这里的-t参数用于指定镜像的名称和标签,my-flask-app:1.0表示镜像名称为my-flask-app,标签为1.0 ,最后的.表示Dockerfile所在的目录为当前目录 。构建过程中,Docker 会根据Dockerfile中的指令逐步构建镜像,这个过程可能需要一些时间,取决于你的网络速度和机器性能 。构建完成后,我们可以使用docker images命令查看本地是否已经生成了我们的镜像 。
运行容器
镜像构建完成后,就可以使用docker run命令来创建并运行容器了 。执行以下命令:
$ docker run -d -p 8080:5000 my-flask-app:1.0
2.运行命令后,Docker 会基于我们的镜像创建一个新的容器,并在容器中启动 Flask 应用 。我们可以使用docker ps命令查看容器是否正在运行 。如果看到类似下面的输出,说明容器已经成功启动:
其他操作
进入容器
如果我们想要进入容器内部,查看应用的运行情况或者执行一些命令,可以使用docker exec命令 。例如,要进入刚才创建的my-flask-container容器,并打开一个交互式终端,可以执行:
这样就会进入到容器内部,我们可以在容器内执行各种命令,比如查看文件、运行脚本等 。
停止和删除容器:当我们不再需要运行这个容器时,可以使用docker stop命令停止容器,然后使用docker rm命令删除容器 。例如:
# 停止容器$ docker stop my-flask-container# 删除容器$ docker rm my-flask-container
领取专属 10元无门槛券
私享最新 技术干货