四、容器操作命令
4.1 运行容器
使用docker run命令可以创建并运行一个容器,它就像是一个神奇的 “启动器”,让镜像中的应用程序在容器中运行起来。其基本语法为:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
其中,OPTIONS是可选参数,IMAGE是要使用的镜像名称,COMMAND是在容器启动时要执行的命令,ARG...是命令的参数。常见的参数有:
- -d:以守护进程(后台)模式运行容器,容器启动后会在后台运行,不会占用当前终端。就像你启动了一个后台服务,它在后台默默地运行,不会干扰你在终端进行其他操作。
- -it:以交互模式运行容器,通常与-t一起使用。-i表示保持标准输入流打开,-t表示为容器分配一个伪终端,这样我们就可以在容器内进行交互式操作,就像直接在容器内部的终端中操作一样。
- -p:指定端口映射,格式为宿主机端口:容器端口。例如,-p 8080:80表示将容器的 80 端口映射到宿主机的 8080 端口,这样我们就可以通过访问宿主机的 8080 端口来访问容器内的应用程序。这就好比你在一个大房子里(宿主机),为一个小房间(容器)开了一扇特殊的门(端口映射),通过这扇门可以直接进入小房间。
- -v:指定卷挂载,格式为宿主机路径:容器路径。通过卷挂载,我们可以将宿主机的目录或文件挂载到容器内,实现数据的共享和持久化。比如,-v /data:/app/data表示将宿主机的/data目录挂载到容器的/app/data目录,这样在容器内对/app/data目录的操作就会同步到宿主机的/data目录。这就像是在两个房间之间打通了一条通道,两边的物品可以互相流通。
- --name:为容器指定一个名称,方便我们识别和管理容器。如果不指定名称,Docker 会自动生成一个随机的名称。指定一个有意义的名称就像给一个人取了一个容易记住的名字,方便我们在众多容器中找到它。
例如,要以交互模式运行一个基于 ubuntu 镜像的容器,并在容器内执行bash命令,进入容器的交互式终端,可以执行:
docker run -it ubuntu bash
如果要以后台模式运行一个 nginx 容器,并将容器的 80 端口映射到宿主机的 8080 端口,可以执行:
docker run -d -p 8080:80 nginx
4.2 列出容器
查看正在运行的容器,我们使用docker ps命令,它就像是一个 “容器清单查看器”,将正在运行的容器信息展示出来。其基本语法为:
docker ps [OPTIONS]
其中,OPTIONS是可选参数。常见的参数有:
- -a:显示所有容器,包括未运行的容器。默认情况下,docker ps只显示正在运行的容器,使用-a参数可以查看所有容器的历史记录,就像查看一个班级所有学生的出勤记录,包括请假(未运行)的学生。
- -q:仅显示容器的 ID,简洁明了,适合在需要快速获取容器 ID 的场景中使用,比如在批量操作容器时。
- -n=INTEGER:显示最近创建的INTEGER个容器,例如docker ps -n 5会显示最近创建的 5 个容器,方便我们查看最新创建的容器情况。
- -f:根据指定条件过滤结果。例如,docker ps -f "status=exited"可以筛选出状态为已退出的容器,就像在一个大仓库里筛选出特定状态的货物。
执行docker ps命令后,会看到一个类似如下的表格:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d9e6c8d8d8c nginx:latest "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp mynginx
表格中的各列含义如下:
- CONTAINER ID:容器的唯一标识,类似于人的身份证号码,通过它可以准确地识别和操作容器。
- IMAGE:容器使用的镜像名称,表明这个容器是基于哪个镜像创建的。
- COMMAND:容器启动时运行的命令,让我们了解容器启动后执行的具体操作。
- CREATED:容器的创建时间,记录了容器是什么时候被创建的。
- STATUS:容器的状态,常见的状态有running(运行中)、exited(已退出)、paused(暂停)等。
- PORTS:容器的端口映射信息,显示了容器内部端口与宿主机端口的映射关系。
- NAMES:容器的名称,如果在创建容器时指定了名称,这里就会显示指定的名称;否则,会显示一个自动生成的名称。
4.3 启动、停止与重启容器
- 启动容器:对于已经停止的容器,我们可以使用docker start命令来启动它,就像重新启动一台暂停的机器。其基本语法为:
docker start [OPTIONS] CONTAINER [CONTAINER...]
其中,OPTIONS是可选参数,CONTAINER是要启动的容器的 ID 或名称,可以同时指定多个容器。例如,要启动名为mynginx的容器,可以执行:
docker start mynginx
- 停止容器:使用docker stop命令可以停止正在运行的容器,它会向容器发送一个SIGTERM信号,允许容器优雅地停止。如果容器在一段时间内没有停止,它会接收到一个SIGKILL信号强制停止。其基本语法为:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
同样,OPTIONS是可选参数,CONTAINER是要停止的容器的 ID 或名称。例如,要停止 ID 为7d9e6c8d8d8c的容器,可以执行:
docker stop 7d9e6c8d8d8c
我们还可以在停止时指定一个等待时间,单位是秒,默认是 10 秒。例如,docker stop -t 20 7d9e6c8d8d8c表示等待 20 秒让容器停止,如果 20 秒后容器仍未停止,才会发送SIGKILL信号强制停止。
- 重启容器:docker restart命令会先停止容器,然后立即重新启动它,就像给一台电脑进行重启操作。其基本语法为:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS是可选参数,CONTAINER是要重启的容器的 ID 或名称。例如,要重启名为mynginx的容器,可以执行:
docker restart mynginx
也可以指定重启的等待时间,使用-t选项来指定停止容器时的超时时间。例如,docker restart -t 20 mynginx表示在重启mynginx容器时,先停止容器并等待 20 秒,如果 20 秒内容器停止了,就立即重新启动;如果 20 秒后容器仍未停止,才会强制停止并重新启动。
4.4 进入容器
当我们需要在容器内部执行一些操作,如查看文件、调试程序等,就需要进入正在运行的容器。常用的有docker exec和docker attach命令。
- 使用docker exec命令:这是最常用的进入容器并执行命令的方式,它允许我们在运行中的容器内执行一个新的命令,就像在一个正在运行的房间里(容器)执行新的任务。其基本语法为:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
其中,OPTIONS是可选参数,CONTAINER是容器的 ID 或名称,COMMAND是要在容器内执行的命令,ARG...是命令的参数。常见的参数有:
- -it:以交互模式运行命令,为容器重新分配一个伪输入终端,这样我们就可以在容器内进行交互式操作,就像直接在容器内部的终端中操作一样。例如,要进入名为mynginx的容器的交互式Bash shell,可以执行:
docker exec -it mynginx /bin/bash
如果容器中没有Bash,可以尝试/bin/sh。我们还可以在容器内直接执行命令(不进入shell)。例如,查看容器内的/var/log目录内容,可以执行:
docker exec mynginx ls /var/log
- 使用docker attach命令:这个命令用于连接到一个正在运行的容器的主进程(通常是容器启动时运行的进程),就像直接连接到一个正在运行的机器的核心部分。但要注意,这种方式并不像docker exec那样启动一个新的shell,而是附加到容器的主进程,通常用于查看容器的输出日志。其示例如下:
docker attach mynginx
如果你使用docker attach并尝试退出,可能会终止容器的主进程。因此,如果只是想查看输出而不关闭容器,请谨慎使用。例如,当你使用docker attach进入容器后,按下Ctrl + C可能会直接停止容器的主进程,导致容器停止运行。
4.5 删除容器
当我们不再需要某个容器时,可以使用docker rm命令将其删除,它就像是一个 “容器清理器”,帮助我们释放资源,保持系统整洁。其基本语法为:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
其中,OPTIONS是可选参数,CONTAINER是要删除的容器的 ID 或名称,可以同时指定多个容器。常见的参数有:
- -f:强制删除容器,即使该容器正在运行。当容器正在运行时,如果直接使用docker rm命令删除会报错,因为容器正在使用中。使用-f参数可以强制删除,但要注意,强制删除可能会导致数据丢失或其他未预期的问题,就像在一个人正在使用某个工具时强行夺走这个工具,可能会影响工作进度或造成工具损坏。例如,要强制删除名为mynginx的正在运行的容器,可以执行:
docker rm -f mynginx
- -l:移除容器间的网络连接,而非容器本身。有时候我们只是想断开容器之间的网络连接,而不是删除容器,这时就可以使用这个参数。
- -v:删除与容器关联的卷。如果容器在运行时挂载了卷,使用这个参数可以在删除容器时同时删除这些卷,避免残留无用的卷占用空间。
要删除一个已经停止的容器,例如名为mycontainer的容器,可以执行:
docker rm mycontainer
如果要删除所有停止的容器,可以使用以下命令:
docker container prune
这个命令会清理所有已停止的容器,并且在执行前会要求用户确认。若要自动确认,可以添加-f或--force参数:
docker container prune -f
如果想要一次性删除所有容器(无论是否运行),可以使用以下命令:
docker rm -f $(docker ps -aq)
这条命令首先通过docker ps -aq获取所有容器(包括运行中的)的 ID 列表,然后传递给docker rm -f命令进行强制删除。在执行删除所有容器的命令时要特别小心,确保确实不再需要这些容器,以免误删重要的容器和数据。
4.6 查看容器日志
使用docker logs命令可以查看容器的运行日志,这些日志就像是容器运行的 “日记”,记录了容器运行过程中的各种信息,对于调试和排查问题非常有帮助。其基本语法为:
docker logs [OPTIONS] CONTAINER
其中,OPTIONS是可选参数,CONTAINER是要查看日志的容器的 ID 或名称。常见的参数有:
- -f:实时跟踪日志输出,就像实时观看一场比赛的直播,随时了解最新的动态。使用这个参数后,命令会持续输出容器的最新日志,方便我们实时监控容器的运行状态。例如,要实时跟踪名为mynginx的容器的日志输出,可以执行:
docker logs -f mynginx
- --tail:指定输出日志的行数,例如--tail 10表示只输出最后 10 行日志,让我们可以快速查看最近的日志信息。这就像在一本厚厚的日记中,只查看最后几页的内容。
- --since:指定开始查看日志的时间,格式为YYYY - MM - DD HH:MM:SS,例如--since "2024-11-20 10:00:00"表示从 2024 年 11 月 20 日 10 点开始查看日志,帮助我们精准定位某个时间段内的日志。
- --until:指定结束查看日志的时间,格式与--since相同,例如--until "2024-11-20 12:00:00"表示查看日志到 2024 年 11 月 20 日 12 点结束。
例如,要查看名为mynginx的容器的最后 50 行日志,可以执行:
docker logs --tail 50 mynginx
如果要查看从 2024 年 11 月 20 日 10 点到 12 点之间的日志,可以执行:
docker logs --since "2024-11-20 10:00:00" --until "2024-11-20 12:00:00" mynginx
五、数据卷与网络命令
5.1 数据卷管理
在 Docker 的世界里,数据卷就像是一个坚固的 “数据保险箱”,为容器的数据提供了持久化存储和共享的能力。它打破了容器生命周期的限制,即使容器被删除,数据卷中的数据依然得以保留。这就好比你有一个特别的文件柜,无论你的办公室(容器)如何变化,文件柜里的文件(数据)都安全无损。
创建数据卷
使用docker volume create命令可以创建一个新的数据卷,其基本语法为:
docker volume create [OPTIONS] VOLUME
其中,OPTIONS是可选参数,VOLUME是数据卷的名称。例如,要创建一个名为myvolume的数据卷,可以执行:
docker volume create myvolume
创建成功后,Docker 会在宿主机的默认数据卷存储目录(通常是/var/lib/docker/volumes/)下创建一个以数据卷名称命名的目录,用于存储数据卷的数据。
查看数据卷
查看所有数据卷,我们使用docker volume ls命令,它会列出所有已创建的数据卷及其相关信息,就像一个 “数据卷清单”。执行该命令后,会看到类似如下的输出:
DRIVER VOLUME NAME
local myvolume
如果想查看某个具体数据卷的详细信息,比如myvolume的数据卷,可以使用docker volume inspect命令,其语法为:
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
执行docker volume inspect myvolume后,会得到一个详细的 JSON 格式的输出,包含数据卷的名称、驱动、挂载点等信息。例如:
[
{
"CreatedAt": "2024-11-20T10:00:00Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
从输出中可以看到,Mountpoint字段显示了数据卷在宿主机上的实际挂载路径,通过这个路径,我们可以直接在宿主机上访问和管理数据卷中的数据。
删除数据卷
当我们不再需要某个数据卷时,可以使用docker volume rm命令将其删除,其基本语法为:
docker volume rm [OPTIONS] VOLUME [VOLUME...]
例如,要删除名为myvolume的数据卷,可以执行:
docker volume rm myvolume
需要注意的是,在删除数据卷之前,必须确保该数据卷没有被任何容器挂载使用,否则删除操作会失败。如果数据卷正在被容器使用,你需要先停止相关容器,或者使用docker run --rm命令启动一个临时容器,将数据卷从临时容器中卸载后再进行删除。此外,还可以使用docker volume prune命令删除所有未使用的数据卷,以释放磁盘空间。执行该命令时,会提示确认是否删除,输入y即可确认删除。这就像是清理仓库里长期不用的货物,释放宝贵的空间。
5.2 网络管理
在 Docker 的网络世界中,容器之间的通信以及与外部世界的交互都依赖于精心构建的网络架构。通过一系列强大的网络管理命令,我们可以像搭建一座复杂的通信桥梁一样,灵活地创建、配置和管理 Docker 网络,让容器之间能够顺畅地 “交流”。
创建网络
使用docker network create命令可以创建一个自定义的 Docker 网络,其基本语法为:
docker network create [OPTIONS] NETWORK
其中,OPTIONS是可选参数,NETWORK是网络的名称。常见的参数有:
- --driver:指定网络驱动类型,常用的驱动有bridge(桥接网络,适用于单个主机上的容器通信)、overlay(覆盖网络,适用于跨多个 Docker 主机的容器通信,常用于 Swarm 集群)等。
- --subnet:指定自定义子网,用于为容器分配 IP 地址。
- --gateway:为网络指定网关。
例如,要创建一个名为mybridge的桥接网络,可以执行:
docker network create --driver bridge mybridge
如果要创建一个自定义子网和网关的桥接网络,可以执行:
docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 mybridge
创建好网络后,就可以将容器连接到这个网络中,实现容器之间的通信。
查看网络
查看所有 Docker 网络,我们使用docker network ls命令,它会列出所有已创建的网络及其相关信息,就像一个 “网络清单查看器”。执行该命令后,会看到类似如下的输出:
NETWORK ID NAME DRIVER SCOPE
1234567890ab mybridge bridge local
abcdef012345 bridge bridge local
从输出中可以看到每个网络的 ID、名称、驱动类型和作用范围。如果想查看某个具体网络的详细信息,比如mybridge网络,可以使用docker network inspect命令,其语法为:
docker network inspect [OPTIONS] NETWORK [NETWORK...]
执行docker network inspect mybridge后,会得到一个详细的 JSON 格式的输出,包含网络的 ID、名称、驱动、子网配置、连接的容器等信息。例如:
[
{
"Name": "mybridge",
"Id": "1234567890ab",
"Created": "2024-11-20T10:00:00Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
通过查看这些详细信息,我们可以了解网络的配置情况,以及哪些容器连接到了这个网络。
连接与断开网络
将容器连接到指定网络,我们使用docker network connect命令,其基本语法为:
docker network connect [OPTIONS] NETWORK CONTAINER
其中,NETWORK是网络的名称或 ID,CONTAINER是容器的名称或 ID。例如,要将名为mycontainer的容器连接到mybridge网络,可以执行:
docker network connect mybridge mycontainer
连接成功后,容器就可以与该网络中的其他容器进行通信了。
如果要将容器从网络中断开,使用docker network disconnect命令,其基本语法为:
docker network disconnect [OPTIONS] NETWORK CONTAINER
例如,要将mycontainer容器从mybridge网络中断开,可以执行:
docker network disconnect mybridge mycontainer
断开连接后,容器将无法再与该网络中的其他容器进行通信。需要注意的是,对于一些特殊的网络类型(如host网络),容器一旦连接到该网络,就不能断开连接。
六、综合实战与总结
6.1 实战案例
为了更直观地展示 Docker 常用命令的实际应用,我们以部署一个基于 Flask 框架的简单 Web 应用为例。假设我们已经开发好了一个 Flask 应用,代码如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
将上述代码保存为app.py,并在同一目录下创建一个requirements.txt文件,用于记录项目的依赖:
Flask
接下来,我们使用 Docker 来部署这个 Web 应用。
步骤一:创建 Dockerfile
在项目目录下创建一个名为Dockerfile的文件,内容如下:
# 使用Python官方镜像作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 将项目依赖文件复制到容器内
COPY requirements.txt.
# 安装项目依赖
RUN pip install -r requirements.txt
# 将项目代码复制到容器内
COPY.
# 暴露容器的5000端口
EXPOSE 5000
# 定义容器启动时执行的命令
CMD ["python", "app.py"]
步骤二:构建镜像
在项目目录下打开终端,执行以下命令构建 Docker 镜像:
docker build -t flask - app.
这里的-t参数用于指定镜像的标签,flask - app是我们给镜像取的名字,最后的.表示当前目录,即 Dockerfile 所在的目录。构建过程中,Docker 会根据 Dockerfile 中的指令逐步构建镜像,你会看到一系列的输出信息,显示构建的进度和状态。
步骤三:运行容器
镜像构建完成后,我们可以使用以下命令运行容器:
docker run -d -p 8080:5000 flask - app
-d参数表示在后台运行容器,-p参数用于端口映射,将宿主机的 8080 端口映射到容器的 5000 端口,这样我们就可以通过访问宿主机的 8080 端口来访问容器内运行的 Flask 应用。flask - app是我们刚刚构建的镜像名称。
步骤四:访问应用
打开浏览器,输入http://localhost:8080,你应该能够看到Hello, Docker!的页面,这表明我们的 Web 应用已经成功部署并运行在 Docker 容器中。
步骤五:查看容器日志
如果应用出现问题,我们可以使用docker logs命令查看容器的日志,以排查问题:
docker logs <容器ID或容器名>
将<容器ID或容器名>替换为实际的容器 ID 或你在运行容器时指定的名称,就可以查看容器的运行日志,从中找到可能存在的错误信息。
步骤六:停止和删除容器
当我们不再需要这个容器时,可以使用以下命令停止和删除它:
# 停止容器
docker stop <容器ID或容器名>
# 删除容器
docker rm <容器ID或容器名>
6.2 总结与展望
通过以上对 Docker 常用命令的详细介绍和实战案例,我们可以看到 Docker 在简化应用部署、提高开发效率和保障环境一致性方面具有巨大的优势。掌握这些常用命令,如镜像操作命令、容器操作命令、数据卷与网络命令等,是熟练使用 Docker 的基础。
希望大家能够深入学习和实践 Docker 技术,不断探索其更多的功能和应用场景。在未来,随着云计算、边缘计算等技术的不断发展,Docker 作为容器化技术的代表,将在软件开发、部署和运维领域发挥更加重要的作用。它将助力企业实现更加高效、灵活和可扩展的应用架构,推动数字化转型的进程。让我们一起拥抱 Docker,开启更加精彩的技术之旅!