docker 2 section

本文详细介绍了如何从DockerHub获取镜像,包括使用docker pull命令的正确格式及选项,以及镜像名称的构成。同时,文章还演示了如何使用dockerrun命令启动并运行基于centos镜像的容器,进行交互式操作。

获取镜像

Docker Hub 上有大量的高质量的镜像可以用,如何获取这些镜像?

从 Docker 镜像仓库获取镜像的命令是 docker pull 。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是 Docker Hub。
仓库名:这里的仓库名是两段式名称,即 <用户名>/<软件名> 。对于 DockerHub,如果不给出用户名,则默认为 library ,也就是官方镜像。

比如:

[root@work ~]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
8ba884070f61: Pull complete 
Digest: sha256:a81ea5364ff9199b53c7de2eda6dffbff0739116a0908c39e83d7d74b2702a71
Status: Downloaded newer image for docker.io/centos:latest

从下载过程中可以看到 docker 的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。
在使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 sha256 的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug,或者版本更新,都会进行修复再以原来的标签发布,这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。

运行:

有了镜像后,就能够以这个镜像为基础启动并运行一个容器。以上面的 centos 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令:

[root@work ~]# docker run -it --rm centos:latest /bin/bash
[root@4714b0042e2b /]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

docker run 就是运行容器的命令,这里简要的说明一下上面用到的参数:

  • -it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • --rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,只看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • centos :这是指用 centos 镜像为基础来启动容器。
  • bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release ,这是 Linux 常用的查看当前系统版本的命令。

最后我们通过 exit 退出了这个容器

转载于:https://blog.51cto.com/13581826/2363715

<think>首先,用户的问题是关于Docker服务启动失败的错误:"docker.service unknown section UNIT error"。从引用中,我看到用户提到了类似的问题,比如在引用[3]中:"docker.service启动失败:Unit not found的原因及解决办法。删除/usr/lib/systemd/system/docker.service的[UNIT]里包含的docker.socket,然后systemctl daemon-reload,最后systemctl start docker.service,发现启动成功了。" 用户的问题具体是"docker.service unknown section UNIT error",这似乎是系统d配置文件中未知的[UNIT]部分导致的错误。 回顾引用: - 引用[1]和[2]提到启动docker服务失败,错误信息是"Job for docker.service failed because the control process exited with error code.",并建议检查systemctl status和journalctl。 - 引用[3]直接解决了类似问题:删除docker.service文件中的docker.socket引用,然后重新加载和启动。 - 引用[4]是关于证书问题,不相关。 - 引用[5]是关于Docker配置的示例,不直接相关。 所以,核心问题是systemd配置文件中的错误。用户提到了"unknown section UNIT",这可能是docker.service文件中有一个无效的[Unit]部分或错误配置。 在systemd中,服务文件是INI格式,有[Unit]、[Service]、[Install]等部分。如果文件中有一个名为[UNIT]的部分(全大写),它应该是[Unit],因为systemd区分大小写。可能用户或某个配置错误地写了[UNIT]而不是[Unit]。 从引用[3]:"删除/usr/lib/systemd/system/docker.service的[UNIT]里包含的docker.socket",这里写的是[UNIT],但应该是[Unit]。可能是个笔误,或者用户遇到了大小写问题。 在Linux中,systemd是大小写敏感的,所以[UNIT]无效,应该用[Unit]。 因此,解决方案是: 1. 编辑docker.service文件,通常位于/etc/systemd/system/或/usr/lib/systemd/system/。 2. 确保所有部分使用正确的拼写和大小写:[Unit]、[Service]、[Install]。 3. 特别是,检查[Unit]部分是否有拼写错误,如写成[UNIT]。 4. 如果引用了其他单元如docker.socket,确保它正确。 5. 然后运行systemctl daemon-reload来重新加载配置。 6. 最后,尝试启动服务:systemctl start docker.service。 基于引用[3],删除docker.socket的引用也可能有帮助,如果它导致了问题。 现在,构建回答: - 使用中文,因为指令要求中文回答。 - 结构清晰:先解释问题,然后给出步骤。 - 引用相关部分:引用[3]直接相关。 - 生成相关问题:在最后添加相关问题部分。 回答结构: 1. 问题诊断:解释错误原因。 2. 解决方案:逐步给出修复步骤。 3. 引用:自然地添加引用标识。 4. 相关问题:生成相关问题。 生成的相关问题: 1. 如何检查systemd服务的日志? 2. Docker服务启动失败的其他常见原因? 3. 如何验证systemd配置文件的正确性? 确保所有数学表达式使用$...$或$$...$$格式。但在这个上下文中,可能没有太多数学内容。如果有命令行或路径,用代码块或正常文本。</think>### Docker.service "unknown section UNIT" 错误分析与解决 用户遇到的 `docker.service unknown section UNIT error` 错误通常是由于 Docker 的 systemd 服务配置文件(`docker.service`)中存在无效或错误的配置项引起的。在 systemd 配置中,`[Unit]` 部分必须使用正确的拼写和大小写(即 `[Unit]`),如果误写为 `[UNIT]`(全大写)或其他变体,systemd 会将其识别为未知部分(unknown section),导致服务启动失败。以下是系统的逐步解决方案,基于常见案例和引用内容。 #### 问题诊断 - **错误原因**:`docker.service` 文件中的 `[Unit]` 部分被错误配置(例如拼写错误、大小写错误或包含无效依赖项),导致 systemd 无法解析该文件。 - **典型表现**:运行 `systemctl start docker.service` 时,报错提示 "Job for docker.service failed" 并附带 "unknown section" 相关错误,可通过以下命令查看详情: ```bash systemctl status docker.service # 查看服务状态 journalctl -xe # 检查详细日志 ``` - **引用依据**:类似问题在引用[3]中被记录,删除无效的 `docker.socket` 依赖项后成功解决[^3]。 #### 解决步骤 请按顺序执行以下操作(需要 root 权限): 1. **备份配置文件**(避免误操作): ```bash sudo cp /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service.bak ``` 2. **编辑 `docker.service` 文件**: - 使用文本编辑器打开文件: ```bash sudo nano /usr/lib/systemd/system/docker.service # 或使用 vim ``` - **检查 `[Unit]` 部分**: - 确保标题正确拼写为 `[Unit]`(首字母大写,其余小写)。如果误写为 `[UNIT]` 或其他形式,请修正。 - 删除无效的依赖项:如引用[3]所述,移除 `[Unit]` 部分中对 `docker.socket` 的引用(例如删除包含 `docker.socket` 的行)[^3]。 - 示例正确配置: ```ini [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket Requires=docker.socket ``` 3. **重新加载 systemd 配置并重启服务**: ```bash sudo systemctl daemon-reload # 重新加载配置 sudo systemctl start docker # 启动 Docker 服务 sudo systemctl status docker # 验证是否成功 ``` 4. **验证修复**: - 如果服务启动成功,输出应显示 `active (running)`。 - 如果失败,检查日志: ```bash journalctl -u docker.service --since "5 minutes ago" # 查看近期日志 ``` #### 其他可能原因及处理 - **文件权限问题**:确保 `/usr/lib/systemd/system/docker.service` 文件权限为 `644`(运行 `sudo chmod 644 /usr/lib/systemd/system/docker.service`)。 - **证书或网络问题**:如引用[4]所示,如果涉及证书错误(如 `x509: certificate signed by unknown authority`),需调整 Docker 的启动选项[^4]。 - **系统残留冲突**:如果上述步骤无效,尝试完全卸载 Docker 后重新安装。 #### 引用说明 本解决方案参考了站内类似案例,特别是配置文件修正的成功经验[^3]。如果问题持续,建议结合 `journalctl` 日志进一步排查[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值