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

# 这一步需要使用代理才能成功
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 mkdir -p /etc/systemd/system/docker.service.d
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
# 稍作等待

image

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

----------------------------------------------------------------分割线----------------------------------------------------------


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 和相关工具

  1. 安装 KVM 和相关的包:

    sudo apt update
    sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
    
  2. 安装 virt-manager:

    sudo apt install -y virt-manager
    
  3. 将当前用户添加到 libvirt 和 kvm 组:

    sudo usermod -aG libvirt $(whoami)
    sudo usermod -aG kvm $(whoami)
    
  4. 重启系统以应用更改:

    sudo reboot
    

验证 KVM 是否正常工作

  1. 确认 KVM 模块已加载:

    lsmod | grep kvm
    
  2. 检查 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

我去查了下了我的 cpu: https://www.intel.cn/content/www/cn/zh/products/sku/81059/intel-xeon-processor-e52697-v3-35m-cache-2-60-ghz/specifications.html

英特尔® 虚拟化技术 (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

解决方法:

img

中间让输一次密码,我没有输。

登录失败问题:网络 需要加 代理

img

然后我们就登录成功了。

确认硬件支持和启用虚拟化

  1. 检查硬件支持

    • 确认您的 CPU 支持硬件虚拟化。可以在 CPU 制造商的官网上查找您的 CPU 型号,并确认是否支持 Intel VT-x 或 AMD-V。
  2. 启用 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

  1. 更新包索引并安装依赖项

    sudo apt update
    sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
    
  2. 添加 Docker 的 GPG 密钥

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
  3. 设置 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
    
  4. 更新包索引并安装 Docker Engine

    sudo apt update
    sudo apt install -y docker-ce docker-ce-cli containerd.io
    
  5. 启动 Docker 并将其设置为开机自启动

    sudo systemctl start docker
    sudo systemctl enable docker
    
  6. 将当前用户添加到 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

img

然后启动,填入端口 9000,点击启动。

http://localhost:9000/ 就可以看到效果了。

我尝试了从 PDF 中提取图像:

img

得到的结果不错。

问题: docker desktop 和 docker cli 的共存时候怎么办?

img

现在我们默认的是 docker desktop,但是我们需要用到 docker cli,怎么办?

命令行切换:

```bash
docker context ls   # 查看当前的上下文
docker context use default
```
posted @ 2024-06-22 18:54  cold_moon  阅读(874)  评论(4编辑  收藏  举报