# docker_setup **Repository Path**: taiyi-mpu/docker_setup ## Basic Information - **Project Name**: docker_setup - **Description**: 创建用于构建 FuxiOS 镜像的docker容器的说明和脚本 - **Primary Language**: Docker - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-03 - **Last Updated**: 2025-10-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 用于构建 Linux BSP for RZ/IMX 的 Docker 容器设置 ## 介绍 创建用于构建 FuxiOS 镜像的 docker 容器的说明和脚本 ## 支持平台 * i.MX6ULL * RZ/G2L ## 1. 关于 Docker Dockerfile描述Docker镜像的内容,Docker容器是镜像的一个实例。Docker容器共享主机的内核,但有自己的根文件系统,在Dockerfile中指定。这允许您在具有不同操作系统的主机上运行需要特定版本操作系统的应用程序。它确保您的环境不会被其它已安装的包污染,并允许您确保应用程序仅与Dockerfile中指定的包一起工作。 ### 1.1. 镜像与容器 在 Docker 中,您可以创建“容器”,这些容器正在运行“图像”实例。它们不会更改原始图像(就像克隆一样)。 但是,如果您想将该容器保存/传输到另一台机器,或者使用当前容器作为起点创建另一个容器,您必须首先将该容器“提交”回“图像”文件。 **请注意**,许多命令行选项/功能仅在您首次创建容器时可用。如果您错过了什么,您将不得不从头开始重新创建容器。 ### 1.2. 容器内部与外部的文件和目录 当您在 docker 容器内操作时,整个容器文件系统与主机系统的文件系统隔离(包含)。您可以想象从安全角度来看,这非常有帮助。但是,如果您的整个 BSP 构建环境位于此容器内,您将无法从正常的 Ubuntu 桌面环境访问它。这会让事情变得更加困难!
┌─────────────────────────────────────────────┐ │ Host System: Ubuntu 22.04 │ │ │ │ Docker Container │ │ ┌───────────────────┐ │ │ Host cannot access │ Ubuntu 20.04 │ │ │ files inside │ Mini OS system │ │ │ conatiner --------> │ │ │ │ │ <-- Cannot access │ │ │ │ files outside │ │ │ │ container │ │ │ └───────────────────┘ │ └─────────────────────────────────────────────┘因此,您应该在主机上选择一个可从 docker 容器内部和外部访问的位置。就像一个 **共享目录**。 我建议在内部和外部使用**相同路径**。例如,如果您从主目录中创建一个名为“yocto”的目录,那么该目录将可从 docker 容器内部访问。 > 主机环境:/home/fuxi/yocto > 容器内部:/home/fuxi/yocto 在这种情况下,您将传递以下命令行选项:`--volume=/home/chris/yocto:/home/chris/yocto`
┌────────────────────────────────────────────────┐ │ Host System: Ubuntu 22.04 │ │ │ │ Docker Container │ │ ┌───────────────────────┐ │ │ Host cannot access │ Ubuntu 20.04 │ │ │ files inside │ Mini OS system │ │ │ conatiner --------> │ │ │ │ │ <-- Cannot access │ │ │ │ files outside │ │ │ │ container │ │ │ ┴ │ │ │ /home/chris/yocto <-----> /home/chris/yocto │ │ │ (direct accesss) │ │ │ ┬ │ │ │ └───────────────────────┘ │ └────────────────────────────────────────────────┘然后您可以将您的 BSP 目录放在这个共享的“yocto”目录下: > ├── home > │ ├── chris > │ │ ├── yocto > │ │ │ ├── downloads > │ │ │ ├── rzg_vlp_v3.0.3 > │ │ │ ├── rzg_vlp_v3.0.5 > │ │ │ ├── xxx ### 1.3. 容器内部和外部的用户帐户 Docker容器内的用户与主机用户不同。我们通常希望能够访问容器外的文件,但如果您在 Docker 容器中创建文件,它们将属于不同的`UID`。 您可以使用`--user=$(id -u):$(id -g)`选项来设置 UID,但是,这会导致容器内的 root 访问权限出现问题。 [此处](https://jtreminio.com/blog/running-docker-containers-as-current-host-user/#ok-so-what-actually-works) 很好地概述了这些问题。 有一种方法可以使用与主机上相同的用户 ID 和权限来运行 Docker 容器。Docker 允许您在容器内“覆盖”来自主机的目录。对于涉及 ID 和权限的目录,这样做会使您的容器的行为与主机相同,请参阅此 ## 2. Docker 安装 ### 2.1. 按照 Docker 网站上的说明进行操作 Ubuntu 官方存储库中提供的 Docker 安装包可能不是最新版本。为确保获得最新版本,最好从 Docker 官方存储库安装 Docker。Docker 网站上的说明非常容易理解。只需复制/粘贴即可。我们建议使用 [使用 apt 存储库安装](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository) 方法。 *
fuxi$ sudo systemctl status docker --no-pager
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-03-20 17:06:04 EDT; 4min 53s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 1403652 (dockerd)
Tasks: 22
Memory: 28.5M
CPU: 732ms
CGroup: /system.slice/docker.service
└─1403652 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Mar 20 17:06:03 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:03.745478376-04:00" level=info msg="successfully migrated engine ID"
Mar 20 17:06:03 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:03.745999477-04:00" level=info msg="Loading containers: start."
Mar 20 17:06:04 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:04.501721035-04:00" level=info msg="Default bridge (docker0) is assigned with an …IP address"
Mar 20 17:06:04 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:04.619526298-04:00" level=info msg="Loading containers: done."
Mar 20 17:06:04 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:04.650188695-04:00" level=info msg="Docker daemon" commit=bc3805a graphdriver=ove…sion=23.0.1
Mar 20 17:06:04 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:04.650327945-04:00" level=info msg="Daemon has completed initialization"
Mar 20 17:06:04 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:04.677493145-04:00" level=info msg="[core] [Server #7] Server created" module=grpc
Mar 20 17:06:04 lenovo-p330 systemd[1]: Started Docker Application Container Engine.
Mar 20 17:06:04 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:06:04.681668958-04:00" level=info msg="API listen on /run/docker.sock"
Mar 20 17:07:07 lenovo-p330 dockerd[1403652]: time="2023-03-20T17:07:07.853245569-04:00" level=info msg="ignoring event" container=011f6b4af0addd88ac3…TaskDelete"
Hint: Some lines were ellipsized, use -l to show in full.
### 2.3 将自己添加到docker组
这样您就不必每次都“sudo docker”来运行docker。这不是技术要求,但强烈建议这样做。
> \$ sudo usermod -a -G docker ${USER}
然后,完全**退出**您的帐户并重新登录(或者您可以运行“$ su - ${USER}”以避免仅此一次注销/重新启动)
检查您现在是否属于 docker 组:
> \$ id -nG | grep docker
验证您是否可以在没有 sudo 的情况下运行 docker 命令。
> \$ docker run hello-world
Docker 安装已完成。您可以在这里找到其他配置: $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE rz_ubuntu-20.04 latest 960cf1be32b0 57 seconds ago 1.25GB### 3.3. 使用我们的镜像启动容器 现在我们已经创建了 docker 镜像,我们可以基于该镜像启动一个容器。以下是每个参数的解释。请特别注意`--volume`参数,因为您希望旧版 Ubuntu 操作系统在容器内运行,但希望将所有构建文件保留在容器外。
mkdir -p /home/$USER/yocto docker run -it \ --name=my_container_for_20.04 \ --volume="/home/$USER/yocto:/home/$USER/yocto" \ --workdir="/home/$USER" \ rz_ubuntu-20.04您现在将在容器内的命令行 shell 中运行。现在通过输入“exit”退出(停止)容器。
fuxi@(docker)$ exit接下来我们将进一步解释如何使用容器。 ## 4. 使用容器 容器必须处于运行状态,您才能进入并使用它们。 如果容器已停止,则运行“docker ps”命令时不会显示容器。 每次系统重启后,您都需要重新启动容器。如果您忘记了容器的名称或 ID,可以使用“docker ps -a”。 此命令将显示所有正在运行的容器:
$ docker ps此命令将显示所有容器(正在运行和已停止):
$ docker ps -a使用此命令启动容器。使用您在“docker run”命令中为其指定的名称。您可以使用“docker ps”命令确认容器已启动并正在运行。
$ docker start my_container_for_20.04 $ docker ps