前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker安装与镜像打包

docker安装与镜像打包

作者头像
读书猿
发布2024-10-22 16:00:50
2440
发布2024-10-22 16:00:50
举报
文章被收录于专栏:无人驾驶感知

前言

  1. 想必大家都遇到过类似的困扰,拿到git上的一套代码,想在本机上运行,又缺少环境。配制环境,不是遇到缺少库,就是版本不兼容各种问题。
  2. 大家共同开发一套代码,如果有共同的服务器,配置一次环境大家都可以用,如果没有,就需要每个人都需要配置环境,又费时又费力。
  3. 这时候就需要我们的docker。docker是什么,Docker 是一个开源的容器化平台,用于开发、运输和运行应用程序。它将应用程序及其依赖项打包到一个可移植的容器中,确保在任何环境中都能一致地运行。简单来说,就是只要一个人把运行环境配置好,把环境打包分享出来,其他人直接用docker加载这个文件,分分钟就可以运行代码。当然,你也可以把你的环境打包分享给其他人。

一、docker安装

1.1、下载docker安装包

代码语言:javascript
复制
wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz

1.2、解压

代码语言:javascript
复制
tar -zxvf docker-24.0.6.tgz

1.3、移动

移动到/usr/bin目录

代码语言:javascript
复制
sudo cp docker/* /usr/bin/

1.4、docker注册成系统服务

代码语言:javascript
复制
gedit /etc/systemd/system/docker.service

没有gedit的,下面命令安装 sudo apt update sudo apt install gedit

复制下面内容写入docker.service文件

代码语言:javascript
复制
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

1.5、添加文件权限

代码语言:javascript
复制
sudo chmod +x /etc/systemd/system/docker.service
sudo systemctl daemon-reload 

1.6、设置开机启动

代码语言:javascript
复制
sudo systemctl enable docker.service

1.7、启动docker

代码语言:javascript
复制
sudo systemctl start docker

1.8、测试是否启动

代码语言:javascript
复制
sudo docker run hello-world

到这里就算完成了,显示 unable to find image 先不用管

二、镜像加载

2.1、镜像准备

如果没有docker,按照上文一安装,如果有了 docker,需要一个已经打包完成的镜像

假设打包的镜像命名为 ros.tar。

2.2、加载镜像

代码语言:javascript
复制
docker load -i ros.tar	# ros.tar 修改为自己名字

如果镜像较大,需要等待数分钟

2.3、查看已加载镜像

代码语言:javascript
复制
docker images

这时候会显示镜像对应的属性表格

REPOSITORY TAG IMAGE ID CREATED SIZE

2.4、进入镜像

代码语言:javascript
复制
docker run -it  REPOSITORY:TAG   

假设 REPOSITORY 为 ros,TAG 为 latest,则

代码语言:javascript
复制
docker run -it  ros:latest 

三、打包镜像

同样的,我们也可以把自己的镜像打包分享给他人使用

下面以打包 ros2_humble ubuntu22.04 基础环境为例

3.1、创建 Dockerfile

基础环境最好通过 Dockerfile 创建,创建名为 Dockerfile 的文件

代码语言:javascript
复制
touch Dockerfile

复制以下内容

代码语言:javascript
复制
# 使用Ubuntu 22.04作为基础镜像
FROM ubuntu:22.04

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 更新包管理器并安装ROS 2依赖
RUN apt-get update && apt-get install -y \
    locales \
    curl \
    gnupg2 \
    lsb-release \
    && locale-gen en_US.UTF-8 \
    && apt-get install -y software-properties-common \
    && add-apt-repository ppa:osrfoundation/osrf-ros2 \
    && apt-get update && apt-get install -y \
    ros-humble-desktop \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /workspace

# 启动bash
CMD ["/bin/bash"]

3.2、构建镜像

保存了上述 Dockerfile 文件,在同一目录下运行下面命令

代码语言:javascript
复制
docker build -t ros2-ubuntu .

如果这一步显示网络失败,需要梯子进行,我试过国内许多源,现在都被禁止了。如果有梯子,需进行如下设置。亲测有效,具体是参考一位博主的操作。

创建或编辑 Docker 的系统代理配置文件

创建目录并编辑代理配置文件:

代码语言:javascript
复制
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

添加以下内容

代码语言:javascript
复制
[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"

注意:将 http://127.0.0.1:7890 替换为 Clash 监听的实际代理地址和端口。如果 Clash 使用其他端口,请相应调整。

保存并退出编辑器

重新加载 systemd 配置并重启 Docker

代码语言:javascript
复制
sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置

尝试拉取一个小的 Docker 镜像,验证配置是否正确。例如:

代码语言:javascript
复制
docker pull hello-world

3.3、运行容器

假设镜像名是ros2-ubuntu

代码语言:javascript
复制
docker run -it ros2-ubuntu

如果想在容器内部访问、编译本地代码。可以运行容器时使用-v选项将本地代码目录挂载到容器中。

代码语言:javascript
复制
docker run -it -v /home/jeff:/home ros2-ubuntu  

例如我把本地 /home/jeff 目录挂载到镜像 /home 目录下。如此在镜像home目录就可以访问 本机 /home/jeff 目录下的代码了

3.4、导出镜像

如果编译代码的时候发现镜像里缺少了一些库,想自己在镜像里安装,然后再打包出去,可以如此操作。

代码语言:javascript
复制
以安装 yaml-cpp 安装包为例。进入镜像安装 yaml-cpp 库
代码语言:javascript
复制
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

** 注:过程中不要 exit 退出镜像 ** 退出再进入,需要重新安装 yaml-cpp 库。为了不用反复安装,我们可以重新打包一份镜像,下次直接加载新镜像。

代码语言:javascript
复制
docker save -o ros2.tar my-id  # ros2.tar可以换成自定义名称;my-image镜像名或ID。 docker images可以查看
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、docker安装
    • 1.1、下载docker安装包
      • 1.2、解压
        • 1.3、移动
          • 1.4、docker注册成系统服务
            • 1.5、添加文件权限
              • 1.6、设置开机启动
                • 1.7、启动docker
                  • 1.8、测试是否启动
                  • 二、镜像加载
                    • 2.1、镜像准备
                      • 2.2、加载镜像
                        • 2.3、查看已加载镜像
                          • 2.4、进入镜像
                          • 三、打包镜像
                            • 3.1、创建 Dockerfile
                              • 3.2、构建镜像
                                • 3.3、运行容器
                                  • 3.4、导出镜像
                                  相关产品与服务
                                  容器服务
                                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档