基本 Docker 命令
如果您发现这篇文章有帮助,请转到我的博客并查看我的其他一些文章!
我最近开始利用业余时间尝试 Docker。我听说过很多关于容器化应用程序的好处,但作为一名“痛苦驱动开发”的狂热实践者,我目前还没有发现在我的任何应用程序中实现它的必要性。然而,好奇心驱使着我,我决定列出一份 Docker CLI 中常用命令的快速参考指南。这些命令的完整列表可以在 Docker 的文档网站上找到,但您也可以在下载 Docker Desktop后,在终端中继续操作。
入门
从命令行开始的最简单方法,通常也是我刚开始使用新 CLI 时运行的第一个命令之一,就是help命令。该docker help
命令将为您提供 Docker CLI 中可用的命令列表。
图片
在 Docker 中,镜像是用于创建容器的一组指令或命令(稍后会详细介绍容器)。镜像本质上是不可变的,因此一旦构建完成,就必须使用一组新的指令重新创建或删除它。用于构建 Docker 镜像的指令称为Dockerfile。
为了构建图像,可以从终端运行一个简单的命令:
docker build -f {DOCKER_FILE_NAME} -t {IMAGE_TAG} .
docker build
使用几个参数执行该命令来构建 Docker镜像。第一个参数指定要引用哪个 Dockerfile 来构建镜像,第二个参数指定要构建镜像的标签(或别名)。因此,上述命令可能如下所示:
docker build -f node.dockerfile -t thefrugaldev/node .
创建一些图像后,可以使用以下命令列出它们:
docker images
这将列出所有顶层镜像,包括它们的属性,例如标签、创建日期、大小以及镜像 ID。执行后,终端中的输出应该类似于以下内容。
如果您发现您有太多图像或决定不再需要特定图像,您可以随时通过将图像 ID 作为以下命令的参数来删除图像。
docker rmi {IMAGE ID}
容器
容器很可能就是你最初接触 Docker 的原因。提到 Docker 时,“容器”这个词经常被提起,但容器究竟是什么呢?从高层次来看,容器类似于镜像,但它的状态可以更改,并且是在运行时构建的。与镜像不同,容器拥有一个可写的持久层,可以添加或修改。当容器被删除时,这个持久层也会被删除。因此,从这个意义上讲,多个容器可以共享一个镜像,同时仍然拥有一个独立的持久层。
要运行容器,只需指定要运行的镜像即可。终端将返回新创建容器的容器 ID。
docker run -d thefrugaldev/node
您可以将相当多的选项传递给上一个命令:
docker run -d --net {NETWORK} --name {CONTAINER_ALIAS} -p {LOCAL_PORT:HOST_PORT} {IMAGE_TO_RUN}
通过指定,-d
您可以指示 Docker 以分离模式(即后台模式)运行。在 Docker 中,您可以使用该--net
参数设置一个隔离网络,该网络中的容器可以相互通信。该参数--name
允许您为容器指定名称,使其在启动和运行后更易于维护。该-p
标志允许您将本地计算机上的外部端口绑定到运行容器的主机上的内部端口。最后,您可以提供要运行的镜像。此命令的示例可能如下所示。
docker run -d --net isolated_network --name my_funky_new_container -p 8080:5000 thefrugaldev/aspnetcore
有时,您可能需要在应用程序启动并运行后执行外部命令。为此,Docker 允许exec
在特定容器的上下文中运行该命令。
docker exec {CONTAINER_NAME} {CMD}
一旦您启动并运行了几个容器,请随意运行以下任何命令来可视化和删除机器上运行的任何容器。
docker ps # list any running containers
docker ps -a # list all containers (running or otherwise)
docker rm {CONTAINER_ID} # remove a specific container by id
docker rm -f $(docker ps -a -q)
最后那个命令很有意思。它强制 Docker 删除带有该-f
标志的容器。该命令的最后一部分$()
告诉 Docker 计算括号内的表达式。在这里,我们告诉 Docker 以静默-q
模式(仅显示数字 ID)查找所有容器(无论是否正在运行),并返回找到的结果。整个命令本质上就是告诉 Docker 删除所有容器(无论是否正在运行)。
卷
对于较大的写入操作,容器也可以关联卷。您可以将卷视为指向 Docker 管理的虚拟目录的符号链接。当您停止甚至删除容器时,除非您明确删除它,否则卷将保持不变。这使得卷可以安全地由多个容器共享。
为了删除容器以及任何相关卷,您需要使用以下命令(您之前见过)和指定的-v
选项。
docker rm -v {CONTAINER_ID}
如果您碰巧删除了一个容器并且忘记删除其关联的卷(这从来没有发生在我身上😉),有一个快速简便的命令可以删除可能卡在炼狱中的任何未使用的卷。
docker volume prune
Docker Compose
熟悉 Docker 之后,你可能会发现从单个镜像创建多个容器会变得繁琐乏味,而且可扩展性较差。如果遇到这种情况,不妨了解一下Docker Compose。根据他们的文档,Compose 是一个“用于定义和运行多容器 Docker 应用程序的工具”。要使用docker-compose,你需要创建一个yaml文件,该文件会告知 Docker 创建容器所需的指令,包括要使用的 docker 文件、要创建的网络、要使用的端口等等。
我不会过多地介绍docker-compose cli,但我提供了一份我认为对您的旅程有益的常用命令列表。
docker-compose build
# build the images specified in the docker-compose.yml file
docker-compose up -d
# builds, (re)creates, starts, and attaches to containers for a service
# the -d flag tells docker-compose to run in detach mode
docker-compose down --rmi all --volumes
# stops and removes containers
# also removes any networks, volumes and images created by the up command
docker-compose logs
# displays log outputs.
# very useful if you run the up command in detach mode
docker-compose ps
# list all currently running containers
docker-compose start
# starts existing containers
docker-compose stop
# stop running containers without removing them
docker-compose rm -v
# removes any stopped containers
# the -v flag also removes any attached volumes
扩展
我希望上述命令能为其他人提供参考,因为我相信当我不可避免地忘记它们时,它们也会对我有所帮助。另外,我想在本文的最后推荐一个非常有用的 Visual Studio Code 扩展。如果您还没有下载,我建议您下载微软提供的Docker 扩展。这个扩展提供了一个 GUI,可以帮助您直观地查看本地计算机上当前启用的容器、卷、镜像和注册表。
文章来源:https://dev.to/thefrugaldev/essential-docker-commands-26dl