软件开发最大的麻烦事之一就是环境配置、操作系统设置、各种库和组件的安装。目前最流行的 Linux 容器解决方案之一就是 Docker,它极大地缓解了上述问题。
本篇将介绍一些 Docker 的核心命令,用于高效管理 Docker 环境。此外,还补充了 Buildah 工具的简单用法。
Docker 服务认证
在个人电脑上,要想拉取私有镜像必须在镜像仓库上进行身份验证。 使用 docker 命令工具来登录到 Docker Hub。为了上传镜像,你需要登录 Docker Hub 帐户并且拥有适当的权限。上传的镜像会自动标记为私有,除非你手动将其设为公开。
如果是在特定的私人或公司仓库,则需要指定仓库地址登录:
1 2 3 4 5
| docker login registry.example.com
docker login --username <USERNAME> --password <PASSWORD> registry.example.com
|
某些公司仓库可能需要使用证书进行认证。这时需要将证书文件放在 Docker 的配置目录中。
管理镜像与容器
Docker 镜像相关命令
在 Docker 中,一个镜像的标识符包含名称和标签两部分,例如在 docker pull ubuntu:latest
命令中,ubuntu
是镜像的名称,latest
表示标签(tag),通常用于指定镜像的版本。默认情况下,latest
表示最新版本的镜像。
拉取已有镜像:
1 2 3 4 5 6 7 8 9 10 11
| docker search ubuntu
docker pull ubuntu:latest
docker images
docker rmi ubuntu:latest
|
构建与上传镜像:
1 2 3 4 5 6 7 8 9 10 11 12
|
docker build -t my-nginx-image:1.0 .
docker push username/my-nginx-image:1.0
docker tag my-nginx-image:1.0 registry.example.com/hewei2001/my-nginx-image:1.0 docker push registry.example.com/hewei2001/my-nginx-image:1.0
|
Docker 容器相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
docker run -d -p 80:80 --name myweb my-nginx-image:1.0
docker ps docker ps -a
docker stop myweb
docker start myweb
docker exec -it myweb /bin/bash
docker rm myweb
|
管理数据与网络
数据的转移与同步
Docker 提供多种方式管理容器中的数据,确保数据持久化和跨容器共享。
一次性文件/目录传输:
1 2 3 4 5
| docker cp myweb:/path/to/file/in/container /path/to/local/destination
docker cp /path/to/local/file myweb:/path/to/destination/in/container
|
持续同步目录:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
docker volume create myvolume
docker run -d -v myvolume:/path/in/container --name mycontainer myimage
docker run -d -v /path/on/host:/path/in/container --name mycontainer myimage
docker run --mount type=bind,source=/path/on/host,target=/path/in/container --name mycontainer myimage
|
自动同步:
如果你经常需要处理复杂的容器配置,docker-compose
是一个很好的工具。你可以在 docker-compose.yml
文件中配置卷和绑定挂载,这样就不需要每次运行容器时都手动设置它们。
1 2 3 4 5 6
| version: '3' services: myservice: image: image_name volumes: - /path/on/host:/path/in/container
|
这样配置后,每次使用 docker-compose up
启动服务时,都会自动应用这些挂载设置。
网络连接
Docker 容器的网络管理可以通过 Docker 提供的网络功能实现,包括桥接网络、主机网络和自定义网络等。
1 2 3 4 5 6 7 8 9 10 11
| docker network ls
docker network create mynetwork
docker network connect mynetwork mycontainer
docker network disconnect mynetwork mycontainer
|
Buildah 工具
Buildah 是一个开源工具,用于构建和管理 OCI(Open Container Initiative)容器镜像。它是由 Red Hat 开发的,并且可以独立于 Docker 使用。Buildah 提供了一种更加灵活和轻量级的方式来构建容器镜像,尤其在没有 Docker Daemon 的环境中。相比 Docker,其优点如下:
- 无守护进程模式:不像 Docker 需要一个长期运行的守护进程(Docker Daemon),Buildah 可以在没有守护进程的情况下操作。因此也可以低成本地地实现 Docker-in-Docker (DinD) 操作,在公司场景可能会用到,因为公司申请的跳板机资源本身可能就是 Docker。
- 安全性:由于 Buildah 可以在没有 root 权限的用户空间中运行,因此可以提供更高的安全性。
- 兼容性:支持与 Docker 和 Podman 兼容的镜像和容器格式。
常用命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| buildah images
buildah pull mirrors.xxx.com/hewei2001/vllm-openai:latest
buildah from mirrors.xxx.com/hewei2001/vllm-openai:latest
buildah inspect vllm-openai-working-container
buildah run vllm-openai-working-container -- bash
buildah copy vllm-openai-working-container example.txt /vllm-workspace/tmp/example.txt
buildah config --env MY_VAR=value vllm-openai-working-container
buildah commit vllm-openai-working-container my-new-image
buildah tag my-new-image mirrors.xxx.com/hewei2001/vllm_dev:latest
buildah push mirrors.xxx.com/hewei2001/vllm_dev:latest
|
数据的转移和同步:和 Docker 类似,但 Buildah 不支持直接从容器拷贝内容到主机!可以先通过 buildah mount
命令挂载容器的文件系统,然后使用普通的文件操作命令(如 cp
)来复制文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| buildah copy vllm-openai-working-container example.txt /tmp/example.txt
buildah copy vllm-openai-working-container /path/to/local/dir /path/in/container
mount_path=$(buildah mount vllm-openai-working-container)
cp ${mount_path}/path/in/container/file.txt /local/path
buildah umount vllm-openai-working-container
|
如果需要频繁地在本地和容器之间同步文件或目录,可以考虑使用脚本自动化 buildah copy
和 cp
操作。此外,对于更复杂的同步需求,可能需要考虑使用版本控制系统(如 Git),或者配置持续集成/持续部署(CI/CD)流程来自动化代码和资源的部署。