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
```