ubuntu 20.04 安装 docker 以及打包容器,环境迁移
参考:https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
首先,docker Engine 和 docker Desktop 是两个不同的东西,在 linux 上面,我们选择直接安装 docker Engine,当然下文也写了怎么在 linux 上安装 docker Desktop。
1. 安装 docker Engine
# Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
# 这一步需要使用代理才能成功 sudo curl -x http://127.0.0.1:7890 -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
失败:
Err:7 https://download.docker.com/linux/ubuntu focal InRelease
Could not connect to download.docker.com:443 (2a03:2880:f129:83:face:b00c:0:25de), connection timed out Could not connect to download.docker.com:443 (179.60.193.16), connection timed out
Fetched 2,910 B in 36s (81 B/s)
Reading package lists... Done
W: Failed to fetch https://download.docker.com/linux/ubuntu/dists/focal/InRelease Could not connect to download.docker.com:443 (2a03:2880:f129:83:face:b00c:0:25de), connection timed out Could not connect to download.docker.com:443 (179.60.193.16), connection timed out
W: Some index files failed to download. They have been ignored, or old ones used instead.
我已经开启了代理,还是失败。
测试 能不能连接上 Docker 的服务器:
curl -x http://127.0.0.1:7890 -I https://download.docker.com
HTTP/1.1 200 Connection established
HTTP/2 200
content-type: text/html
content-length: 223
date: Fri, 21 Jun 2024 11:21:25 GMT
last-modified: Fri, 21 Jun 2024 11:11:17 GMT
etag: "5a2449544577bdf952c47cdc248220b4"
server: AmazonS3
x-cache: Hit from cloudfront
via: 1.1 7110543e95ede37ef1cea5dbc0cc94a4.cloudfront.net (CloudFront)
x-amz-cf-pop: HKG54-C1
x-amz-cf-id: ZNtewk2gzVHfFsAibNf2Y-8N0_y2OWHQ5tIKHvmLuFX5hj5KbsDwwg==
age: 83765
从 curl 的输出可以看出,通过代理成功连接到了 Docker 的服务器,说明代理配置是正确的。
接下来我们需要确保 APT 也能使用代理并成功连接到服务器。
配置 APT 使用代理:
确保 APT 使用了正确的代理设置。编辑或创建 /etc/apt/apt.conf 文件:
sudo vim /etc/apt/apt.conf
添加以下内容:
Acquire::http::Proxy "http://127.0.0.1:7890"; Acquire::https::Proxy "http://127.0.0.1:7890";
保存并退出。
再次尝试更新和安装 Docker
现在尝试更新 APT 并安装 Docker:
sudo apt update # 成功 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Verify that the Docker Engine installation is successful by running the hello-world image.
sudo docker run hello-world
如果失败:https://www.cnblogs.com/odesey/p/18235889
使用魔法:
sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<-'EOF' [Service] Environment="HTTP_PROXY=http://127.0.0.1:7890/" Environment="HTTPS_PROXY=http://127.0.0.1:7890/" Environment="NO_PROXY=localhost,127.0.0.1" EOF
我草!这里大坑。如果是这么写,你发现有的还是不行。你得再生成一个才行。
sudo tee /etc/systemd/system/docker.service.d/https-proxy.conf <<-'EOF' [Service] Environment="HTTP_PROXY=http://127.0.0.1:7890/" Environment="HTTPS_PROXY=http://127.0.0.1:7890/" Environment="NO_PROXY=localhost,127.0.0.1" EOF
重新加载并重启 Docker 服务和测试:
sudo systemctl daemon-reload sudo systemctl restart docker sudo docker run hello-world # 再次运行成功
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:94323f3e5e09a8b9515d74337010375a456c909543e1ff1538f5116d38ab3989
Status: Downloaded newer image for hello-world:latest
我们成功了!
2. docker 容器打包为镜像、以及迁移到另外一台电脑
参考:https://developer.aliyun.com/article/945941
2.1 docker commit
从容器创建镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
[OPTIONS]: -a :提交的镜像作者; -c :使用Dockerfile指令来创建镜像; -m :提交时的说明文字; -p :在commit时,将容器暂停
实例:
docker ps # 停止容器: docker stop d38b0bf9da51 docker commit -a "h" -m "vins-mono-melodic" d38b0bf9da51 vins-mono-melodic:v1 # 稍作等待
2.2 镜像迁移
docker save -o vins-mono-melodic.tar vins-mono-melodic:v1
然后我们需要把该镜像 copy 到另外一台机器上面。我们为了传输的更快,使用 网络直接连接两台电脑。
参考:https://www.cnblogs.com/odesey/p/18306819
在另外一台电脑上面:
docker load -i vins-mono-melodic.tar docker run -it --privileged --network host --gpus all \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY -e NVIDIA_VISIBLE_DEVICES=all \ -e NVIDIA_DRIVER_CAPABILITIES=all \ -e FASTRTPS_DEFAULT_PROFILES_FILE=/usr/local/share/middleware_profiles/rtps_udp_profile.xml \ --device-cgroup-rule='c 189:* rmw' \ --device=/dev/bus/usb \ -v /dev/\*:/dev/\* \ -v /etc/localtime:/etc/localtime:ro \ -v ~/.Xauthority:/root/.Xauthority:rw \ -v ~/docker_workspace:/workspace \ --name vins-mono-melodic \ vins-mono-melodic:v1 /bin/bash
我们把用到的代码和数据在宿主机中放到:~/docker_workspace
, 那么在容器内的 /workspace
就可以找到这些代码。
宿主机:
xhost +local:docker
如果你只希望 xhost +local:docker
在开机时执行,而不是每次打开终端时执行,可以通过以下方法将命令配置为开机启动。
方法 1: 使用 ~/.xprofile 或 ~/.xinitrc 文件
这是一个常见的方法,可以在 X11 会话启动时自动执行命令。
编辑 ~/.xprofile 或 ~/.xinitrc 文件: (我用的后者)
如果这些文件不存在,你可以创建它们。然后在文件中添加以下内容:
xhost +local:docker
保存并关闭文件。
这样,每次你登录到图形界面(X11 会话)时,xhost +local:docker 就会自动执行。
在容器中:
cp -r /root/vins_ws /workspace/ rm -r build devel catkin_make
vins-mono:
source ./devel/setup.bash roslaunch vins_estimator custom_bj.launch source ./devel/setup.bash roslaunch vins_estimator vins_rviz.launch rosbag play xx.bag -s 550 # 从 550 秒后开始播放 rqt
vins-mono + let-net:
source ./devel/setup.bash roslaunch vins_estimator custom_bj.launch source ./devel/setup.bash roslaunch vins_estimator vins_rviz.launch ./devel/lib/feature_tracker/my_feature_tracker_illustration rosbag play xx.bag -s 550 # 从 550 秒后开始播放 rqt
docker exec -it 90a /bin/bash
2.3 使用 docker export 和 docker import 压缩容器
可以通过 docker export 将容器的文件系统导出成 tar 压缩文件,然后通过 docker import 将其重新导入为镜像。这个方法会去掉所有历史和中间层,进一步减少镜像大小。
导出容器:
将正在运行的容器导出为压缩文件:
docker export my_container | gzip > container.tar.gz
这会生成一个压缩的 container.tar.gz 文件,包含容器的文件系统。
导入为新的镜像:
使用 docker import 将压缩的 tar 文件重新导入为一个新的镜像:
cat container.tar.gz | docker import - new_image_name:tag
这会生成一个新的镜像,它不包含构建历史和多余的中间层,大小将显著减少
----------------------------------------------------------------分割线----------------------------------------------------------
3. ubuntu 20.04 安装 Docker Desktop
看介绍好像要 22.04 及以上,因此我不太确定可不可以
sudo dpkg -i docker-desktop-amd64.deb [sudo] password for h: Selecting previously unselected package docker-desktop. (Reading database ... 212549 files and directories currently installed.) Preparing to unpack docker-desktop-amd64.deb ... Unpacking docker-desktop (4.32.0-157355) ... dpkg: dependency problems prevent configuration of docker-desktop: docker-desktop depends on qemu-system-x86 (>= 5.2.0); however: Package qemu-system-x86 is not installed. docker-desktop depends on pass; however: Package pass is not installed. docker-desktop depends on uidmap; however: Package uidmap is not installed.
(base) ➜ Downloads sudo apt install gnome-terminal Reading package lists... Done Building dependency tree Reading state information... Done gnome-terminal is already the newest version (3.36.2-1ubuntu1~20.04). gnome-terminal set to manually installed. You might want to run 'apt --fix-broken install' to correct these. The following packages have unmet dependencies: docker-desktop : Depends: qemu-system-x86 (>= 5.2.0) but it is not going to be installed Depends: pass but it is not going to be installed Depends: uidmap E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution). (base) ➜ Downloads sudo apt --fix-broken install
sudo dpkg -i docker-desktop-amd64.deb
然后我们成功了。
BUT!
启动时候遇到:
Virtualization support
KVM is not enabled on host, see https://docs.docker.com/desktop/install/linux-install/#kvm-virtualization-support on how to configure it
要在 Ubuntu 20.04 上安装 Docker Desktop 并启用 KVM 虚拟化支持,您可以按照以下步骤进行操作:
1. 安装 Docker Desktop
首先,您需要安装 Docker Desktop。可以参考 Docker 官方文档中的安装步骤:Docker Desktop on Linux.
2. 启用 KVM 虚拟化支持
为了使 Docker Desktop 能够正常运行,您需要启用 KVM 虚拟化支持。请按照以下步骤操作:
检查硬件虚拟化支持
确保您的 CPU 支持硬件虚拟化(Intel VT-x 或 AMD-V),并且已经在 BIOS 中启用。
egrep -c '(vmx|svm)' /proc/cpuinfo
输出的数字大于 0 表示您的 CPU 支持虚拟化。
安装 KVM 和相关工具
-
安装 KVM 和相关的包:
sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils -
安装 virt-manager:
sudo apt install -y virt-manager -
将当前用户添加到 libvirt 和 kvm 组:
sudo usermod -aG libvirt $(whoami) sudo usermod -aG kvm $(whoami) -
重启系统以应用更改:
sudo reboot
验证 KVM 是否正常工作
-
确认 KVM 模块已加载:
lsmod | grep kvm -
检查 libvirtd 服务状态:
sudo systemctl status libvirtd 如果服务未运行,可以启动并启用它:
sudo systemctl start libvirtd sudo systemctl enable libvirtd
3. 配置 Docker Desktop 使用 KVM
按照 Docker 官方文档中配置 KVM 虚拟化支持的步骤进行操作:KVM Virtualization Support.
通常,Docker Desktop 在检测到 KVM 支持后会自动配置,无需额外操作。如果您遇到任何问题,可以查阅 Docker 文档中的故障排除部分,或者查看系统日志以获取更多信息。
完成以上步骤后,您应该能够在 Ubuntu 20.04 上成功运行 Docker Desktop,并启用 KVM 虚拟化支持。
BUT!
egrep -c '(vmx|svm)' /proc/cpuinfo
0
英特尔® 虚拟化技术 (VT-x) ‡ 是
如果 egrep -c '(vmx|svm)' /proc/cpuinfo
返回 0,表示您的 CPU 不支持硬件虚拟化,或者硬件虚拟化在 BIOS 中被禁用。
https://h30471.www3.hp.com/t5/you-xi-ben/ru-he-geng-gaibios-li-mian-de-intel-vt-x/td-p/808962
HP Z840 按 ESC 进入 BIOS 后,在 Advanced 选项卡中,找到 Intel Virtualization Technology (VT-x) 选项,并将其设置为 Enabled。
重启计算机后,再次运行 egrep -c '(vmx|svm)' /proc/cpuinfo
命令,如果返回大于 0 的数字,则表示硬件虚拟化已启用。
(base) ➜ Cnblogs egrep -c '(vmx|svm)' /proc/cpuinfo 112
通过上述步骤,我成功在 Ubuntu 20.04 上启动了 docker desktop,并启用了 KVM 虚拟化支持。
但是,我还是遇到了以下问题:
Unable to log in
You must initialize pass before logging in to Docker Desktop
解决方法:
中间让输一次密码,我没有输。
登录失败问题:网络 需要加 代理
然后我们就登录成功了。
确认硬件支持和启用虚拟化
-
检查硬件支持:
- 确认您的 CPU 支持硬件虚拟化。可以在 CPU 制造商的官网上查找您的 CPU 型号,并确认是否支持 Intel VT-x 或 AMD-V。
-
启用 BIOS 中的虚拟化:
- 重启计算机并进入 BIOS 设置。
- 查找名为 “Intel VT-x”, “Intel Virtualization Technology”, “VT-x”, “Vanderpool” 或 “AMD-V” 的选项,并确保它们被启用。
- 启用后保存设置并退出 BIOS。然后重新启动计算机。
再次检查虚拟化支持
启用虚拟化后,重新运行以下命令检查虚拟化支持:
egrep -c '(vmx|svm)' /proc/cpuinfo
如果 CPU 不支持虚拟化
如果您的 CPU 不支持虚拟化,您将无法在本地使用 Docker Desktop 的 KVM 虚拟化支持。作为替代方案,您可以使用 Docker 的原生安装方式,即安装 Docker Engine 而不是 Docker Desktop。以下是安装 Docker Engine 的步骤:
安装 Docker Engine
-
更新包索引并安装依赖项:
sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common -
添加 Docker 的 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg -
设置 Docker 稳定版的 APT 源:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null -
更新包索引并安装 Docker Engine:
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io -
启动 Docker 并将其设置为开机自启动:
sudo systemctl start docker sudo systemctl enable docker -
将当前用户添加到 Docker 组(避免使用 sudo 运行 Docker 命令):
sudo usermod -aG docker $(whoami) 然后重新登录以应用更改。
验证安装
运行以下命令,验证 Docker 是否安装成功:
docker --version
运行一个测试容器以确认一切正常:
docker run hello-world
通过以上步骤,您可以在不依赖硬件虚拟化的情况下在 Ubuntu 20.04 上使用 Docker。
验证 docker desktop:
https://github.com/Stirling-Tools/Stirling-PDF
https://www.cnblogs.com/didispace/p/18311013
然后启动,填入端口 9000,点击启动。
http://localhost:9000/ 就可以看到效果了。
我尝试了从 PDF 中提取图像:
得到的结果不错。
问题: docker desktop 和 docker cli 的共存时候怎么办?
现在我们默认的是 docker desktop,但是我们需要用到 docker cli,怎么办?
命令行切换:
```bash docker context ls # 查看当前的上下文 docker context use default ```
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!