Docker学习笔记 #2 常用命令

本文最后更新于:2024年8月7日 晚上

软件开发最大的麻烦事之一就是环境配置、操作系统设置、各种库和组件的安装。目前最流行的 Linux 容器解决方案之一就是 Docker,它极大地缓解了上述问题。

本篇将介绍一些 Docker 的核心命令,用于高效管理 Docker 环境。此外,还补充了 Buildah 工具的简单用法。

Docker 服务认证

在个人电脑上,要想拉取私有镜像必须在镜像仓库上进行身份验证。 使用 docker 命令工具来登录到 Docker Hub。为了上传镜像,你需要登录 Docker Hub 帐户并且拥有适当的权限。上传的镜像会自动标记为私有,除非你手动将其设为公开。

1
2
# 登录命令,之后会被要求输入 Docker Hub 的用户名和密码。
docker login

如果是在特定的私人或公司仓库,则需要指定仓库地址登录:

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 Hub 上查找所需的镜像,会显示包含关键字的公共镜像列表
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
# 构建镜像,根据指定的 Dockerfile 文件创建一个新镜像,其中 -t 用于指定标识符
# . 表示 Dockerfile 和所有相关配置文件所在目录
docker build -t my-nginx-image:1.0 .

# 推送镜像到 Docker Hub (默认)
docker push username/my-nginx-image:1.0

# 推送镜像到私有仓库 registry.example.com
# 为了将镜像指定到目标仓库,需要重新打上标签。注意这里不会删除原来的标签,多个标签可以同时存在!
# 镜像名称的格式通常为:[仓库地址]/[用户名或组织名]/[镜像名]:[标签]
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
# 创建和运行容器,可以指定镜像名称、环境变量、端口映射等
# -d 表示以分离模式运行容器,即容器在后台运行。
# -p 80:80 表示将容器的 80 端口映射到主机的 80 端口,主机可以访问 80 端口来访问容器中的服务
# --name 表示为容器指定一个名称
# nginx 指定要运行的镜像名称,该镜像须在本地存储
docker run -d -p 80:80 --name myweb my-nginx-image:1.0

# 查看正在运行的容器,加上 -a 选项可以查看所有容器,包括已停止的容器
docker ps
docker ps -a

# 停止正在运行的容器
docker stop myweb

# 重新启动已停止的容器
docker start myweb

# 通过 bash 进入一个正在运行的容器,进行操作和调试,这里的 /bin/bash 被称为 Entrypoint
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
# 使用卷 (Volumes) 创建一个数据卷进行同步
# `myvolume` 存在于主机文件系统中,独立于容器生命周期。数据卷可以在容器之间共享和重用
docker volume create myvolume

# 运行一个容器并挂载数据卷 `myvolume` 到容器内的 `/path/in/container` 路径
docker run -d -v myvolume:/path/in/container --name mycontainer myimage

# 此外,也可以直接指定本地主机路径。/path/on/host 是本地路径,/path/in/container 是容器内的路径
# 本地目录和容器目录会实时同步所有变化
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 网络
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,其优点如下:

  1. 无守护进程模式:不像 Docker 需要一个长期运行的守护进程(Docker Daemon),Buildah 可以在没有守护进程的情况下操作。因此也可以低成本地地实现 Docker-in-Docker (DinD) 操作,在公司场景可能会用到,因为公司申请的跳板机资源本身可能就是 Docker。
  2. 安全性:由于 Buildah 可以在没有 root 权限的用户空间中运行,因此可以提供更高的安全性。
  3. 兼容性:支持与 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

# 从镜像创建容器,得到 vllm-openai-working-container
buildah from mirrors.xxx.com/hewei2001/vllm-openai:latest

# 查看容器和镜像信息
buildah inspect vllm-openai-working-container

# 打开容器内的 bash
buildah run vllm-openai-working-container -- bash

# 将本地文件复制到容器中,例如,要将本地的 example.txt 文件复制到容器的 /tmp 目录
buildah copy vllm-openai-working-container example.txt /vllm-workspace/tmp/example.txt

# 修改容器的配置,比如设置环境变量、工作目录等
buildah config --env MY_VAR=value vllm-openai-working-container

# 创建一个新的镜像并命名为 my-new-image
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

# 从容器拷贝内容到主机的步骤
# step1: 挂载容器的文件系统
mount_path=$(buildah mount vllm-openai-working-container)

# step2: 使用 `cp` 命令从挂载的文件系统复制文件到本地(该方法也支持本地到容器)
cp ${mount_path}/path/in/container/file.txt /local/path

# step3: 完成操作后,可以取消挂载
buildah umount vllm-openai-working-container

如果需要频繁地在本地和容器之间同步文件或目录,可以考虑使用脚本自动化 buildah copycp 操作。此外,对于更复杂的同步需求,可能需要考虑使用版本控制系统(如 Git),或者配置持续集成/持续部署(CI/CD)流程来自动化代码和资源的部署。


Docker学习笔记 #2 常用命令
https://hwcoder.top/Docker-Note-2
作者
Wei He
发布于
2023年7月7日
许可协议