Docker 的安装和常用命令
安装 Docker
安装依赖
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
添加 docker 的 GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
添加 docker 的 APT 源并更新
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
安装 docker
sudo apt install docker-ce docker-ce-cli containerd.io
- ce表示社区版(Community Edition)
- ee表示企业版(Enterprise Edition)
查看是否安装成功
$ sudo docker version Client: Docker Engine - Community Version: 20.10.23 API version: 1.41 Go version: go1.18.10 Git commit: 7155243 Built: Thu Jan 19 17:45:08 2023 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.23 API version: 1.41 (minimum version 1.12) Go version: go1.18.10 Git commit: 6051f14 Built: Thu Jan 19 17:42:57 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.16 GitCommit: 31aa4358a36870b21a992d3ad2bef29e1d693bec runc: Version: 1.1.4 GitCommit: v1.1.4-0-g5fd4c4d docker-init: Version: 0.19.0 GitCommit: de40ad0
代理配置
创建或编辑 /etc/systemd/system/docker.service.d/http-proxy.conf 文件,写入以下内容:
[Service]
Environment="ALL_PROXY=http://192.168.1.100:7890"
Environment="HTTP_PROXY=http://192.168.1.100:7890"
Environment="HTTPS_PROXY=http://192.168.1.100:7890"
然后重启:
sudo systemctl daemon-reload
sudo systemctl restart docker
常用命令
- 安装镜像: image pull [OPTIONS] NAME[:TAG|@DIGEST]
- 删除镜像: image rm [OPTIONS] IMAGE [IMAGE...]
- 运行容器: container run [OPTIONS] IMAGE [COMMAND] [ARG...]
- 终止容器: container stop [OPTIONS] CONTAINER [CONTAINER...]
运行容器时通常使用前台和后台两种模式:
- 前台模式通常使用
-it选项,其中:
-i, --interactive表示保持 STDIN 打开,
-t, --tty表示分配一个伪终端- 后台模式通常使用
-d -p <host-port>:<container-port>选项,其中:
-d, --detach表示后台运行
-p, --publish表示将容器端口公开到宿主机上
创建镜像
使用 commit 命令可以创建镜像,然后通过 save 命令可以将镜像保存到指定位置,通过 load 命令可以加载镜像文件。
- 创建镜像: container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- 保存镜像: image save,默认写到 stdout,可以通过-o指定文件
- 加载镜像: image load,默认读取 stdint,可以通过-i指定文件
自动补全的问题
使用 ubuntu 镜像时,会发现很多命令无法自动补全,需要安装
bash-completionapt install bash-completion source /etc/bash_completion
然后编辑 /etc/bash.bashrc  删除相关行的注释:
# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
使用 Docker 配置交叉编译环境
- 首先 安装 Docker
- 然后下载 ubuntu 作为基础镜像 sudo docker pull ubuntu:20.04
- 启动容器 sudo docker run -h aarch64 --name aarch64 -it ubuntu:20.04
最新版 ubuntu 22.04 的
libc6-dev-arm64-cross为 2.35,与目标平台上的版本 2.28 不兼容,因此使用 20.04 版本的镜像。
安装交叉工具链
apt update
apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
编译裸机(bare-metal)程序时需要使用 aarch64-none-elf 版本的工具链,可以从 ARM官网 下载。
编译 Qt
安装依赖:
apt install build-essential python3 python-is-python3 perl ruby wget xz-utils
从 Qt 官网的主页进入下载页面需要填写姓名、公司、邮箱、电话等信息,很麻烦。 可以直接从 download.qt.io 页面下载源码。
wget https://download.qt.io/official_releases/qt/5.15/5.15.8/single/qt-everywhere-opensource-src-5.15.8.tar.xz
tar xvf qt-everywhere-opensource-src-5.15.8.tar.xz
cd qt-everywhere-opensource-src-5.15.8
./configure -opensource -confirm-license -release -xplatform linux-aarch64-gnu-g++ -no-opengl
make
make install
配置交叉编译环境
如果该环境只用于进行交叉编译,为了方便使用,可以将 gcc 等符号链接到 aarch64-linux-gnu-gcc 上:
#! /usr/bin/bash
PREFIX="/usr/bin"
PLATFORM="aarch64-linux-gnu"
TOOLS=$(ls $PREFIX/$PLATFORM-*)
for TOOL in $TOOLS
do
        NAME=${TOOL##*$PLATFORM-}
        update-alternatives --install /usr/bin/$NAME $NAME $TOOL 100
done
# cc 和 cxx
update-alternatives --install $PREFIX/cc cc  $PREFIX/$PLATFORM-gcc 100
update-alternatives --install $PREFIX/cxx cxx $PREFIX/$PLATFORM-g++ 100
导出镜像
sudo docker commit 8cae637c3cc0 aarch64-cross-platform
sudo docker save -o aarch64-cross-platform.tar aarch64-cross-platform
遇到的问题
libc 版本不匹配
将编译生成的可执行文件拷贝到目标设备上运行,报错:
/usr/lib/libc.so.6: version GLIBC_2.34 not found (required by demo)
目标设备上的 libc 运行时版本为 2.28,而交叉编译环境上的版本为 2.35:
apt policy libc6-dev-arm64-cross
libc6-dev-arm64-cross:
  Installed: 2.35-0ubuntu1cross3
  Candidate: 2.35-0ubuntu1cross3
  Version table:
 *** 2.35-0ubuntu1cross3 500
        500 https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy/main amd64 Packages
        100 /var/lib/dpkg/status
从 Ubuntu Packages 或 Debian Packages 下载对应版本的 deb 包并安装:
由于 Ubuntu Packages 上没有 2.28 版本的包,因此从 Debian Packages 上下载。
libc6-arm64-cross_2.28-7cross1_all.deb是libc6-dev-arm64-cross_2.28-7cross1_all.deb的依赖项。
wget http://ftp.cn.debian.org/debian/pool/main/c/cross-toolchain-base/libc6-dev-arm64-cross_2.28-7cross1_all.deb
wget http://ftp.cn.debian.org/debian/pool/main/c/cross-toolchain-base/libc6-arm64-cross_2.28-7cross1_all.deb
dpkg -i libc6-arm64-cross_2.28-7cross1_all.deb libc6-dev-arm64-cross_2.28-7cross1_all.deb
- 这样降级后,可以正常编译 C 语言程序,但是 libstdc++依赖libc,无法编译 C++ 程序。因此建议使用低版本的操作系统镜像。
编译 Qt 时的一些问题
./configure -opensource -confirm-license -release 产生错误 qmake: cannot execute binary file: Exec format error
因为编译 Qt 时需要编译生成 qmake,如果将 gcc 等软链接到了 aarch64-linux-gnu- 上,那么遍出来的 qmake 是 aarch64 架构的,无法在宿主机上运行。
需要将软链接改回 x86_64 架构:
root@aarch64 # update-alternatives --config cxx
There are 4 choices for the alternative cxx (providing /usr/bin/cxx).
  Selection    Path                               Priority   Status
------------------------------------------------------------
  0            /usr/bin/aarch64-linux-gnu-g++      100       auto mode
* 1            /usr/bin/aarch64-linux-gnu-g++      100       manual mode
  2            /usr/bin/aarch64-linux-gnu-g++-11   100       manual mode
  3            /usr/bin/g++-11                     80        manual mode
  4            /usr/bin/x86_64-linux-gnu-g++       100       manual mode
Press <enter> to keep the current choice[*], or type selection number: 4
update-alternatives: using /usr/bin/x86_64-linux-gnu-g++ to provide /usr/bin/cxx (cxx) in manual mode
然后通过 -xplatform 选择交叉工具链进行编译:
./configure -opensource -confirm-license -release -xplatform linux-aarch64-gnu-g++ -no-opengl
make
-xplatform的可选项在qtbase/mkspecs目录里查看
- ERROR: The OpenGL functionality tests failed!的问题可以通过添加- -no-opengl解决,也可以安装对应架构的- libgl1-mesa-dev包。
- ERROR: Python is required to build QtQml.的问题,可以通过安装- python-is-python3解决。再次运行- ./configure需要添加- -recheck-all重新检查依赖。
- BEGIN failed--compilation aborted at ..../generate.pl line 35.的问题可以通过安装新版本的- perl解决。
- error: 'mimetype_database' was not declared in this scope的问题可以通过安装新版本- perl,- ruby和- python解决。