开发平台要从stm32切换到rk3568,对linux驱动及应用开发了解基本为零。准备在linux服务器上实现交叉编译等,笔记本远程vscode码代码。先从开发环境搭建开始吧,使用Docker搭建Linux开发环境,第一步得先了解Docker。
实战记录Docker安装、构建镜像。参考了Tronlong提供的文档。
1、Docker安装
直接上鱼香的一键安装工具,太香了。命令如下,记得把镜像源一起换掉。
鱼香工具:
wget http://fishros.com/install -O fishros && . fishros
换镜像源后重启守护进程:
sudo systemctl daemon-reload
重启服务:
sudo systemctl restart docker
安装后,通过运行Docker 自带的hello-world 镜像来验证是否已安装成功。程序运行后,输出如下内容则表示Docker 安装成功。
sudo docker run hello-world
2、搭建本地镜像仓库
Docker 用Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营的公共Registry 叫做Docker Hub,用户可在Docker Hub 注册账号,分享并保存自己的镜像。Docker 公司的公共镜像仓库(https://hub.docker.com)提供了庞大的镜像集合供用户使用。
一个Docker Registry 中可包含多个仓库,每个仓库可包含多个标签(Tag),每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签对应该软件的各个版本。
用户可通过 “[<仓库名>:<标签>]” 的格式来指定具体是某个软件某个版本的镜像。如未给出标签,将以[latest]作为默认标签。
本次使用的镜像是registry:2,请执行如下命令自动下载并启动。
Host# mkdir -p /home/yan/docker/myregistry
Host# sudo docker run -d -p 5000:5000 -v /home/yan/docker/myregistry:/var/lib/registry registry:2
参数说明:
-d:后台启动容器。
-p:将容器的5000 端口映射至Ubuntu 的5000 端口(5000 是registry 服务端口)。
-v:将容器"/var/lib/registry"目录映射至Ubuntu 的"/home/yan/docker/myregistry",
用于存放镜像数据。
请执行如下命令,查看容器是否已启动,出现如下内容说明容器已正常启动。
sudo docker ps
请通过浏览器访问"http://192.168.121.129:5000/v2/_catalog",如返回如下内容则说明registry 已经成功启动,192.168.13.27 为Ubuntu 的IP。
由于刚建立运行,故里面无任何镜像内容。至此,Docker 环境安装完成。
3、构建镜像
新建工作目录"/home/tronlong/docker/dockerfile/",用FileZilla传入Tronlong软件资料中的文件系统压缩包和可执行文件。
mkdir /home/tronlong/docker/dockerfile
继续创建Dockfile文件,并写入以下内容:
#基于空的基础镜像构建新的镜像
FROM scratch
# Set work directory
#为CMD、COPY 和AND 设置工作目录
WORKDIR /root
# Decompress the file system
#解压文件系统
ADD rootfs-v1.0-4f56feee.tar /
# Copy file to image
#拷贝可执行文件至镜像的"/home/root/"目录下
COPY led_flash .
# Shell command executed when the container is started
# CMD ["executable","param1","param2"]
#容器启动时执行的shell 命令,此处为执行LED 闪烁程序的命令
CMD ["./led_flash", "-n 2"]
在Dockerfile 文件所在的目录下执行如下命令,进行构建镜像。
sudo docker build -t 192.168.121.129:5000/led_flash:v1.0 . //注意命令最后含有"."
Host# sudo docker images //查看已构建的镜像
参数说明:
192.168.13.27:Ubuntu 的IP 地址;
-t:指定镜像的名字及标签(name:tag)。
执行如下命令,将镜像推送至本地仓库Registry。
sudo docker push 192.168.121.129:5000/led_flash:v1.0
这里本地上传私有镜像的时候遇到报错,Docker 版本从1.3.X 之后,与Docker Registry 交互默认使用https。由于前面搭建的私有仓库仅提供http 服务,因此当与私有仓库交互时将出现上面的错误提示。解决方法是,在docker server启动的时候,增加启动参数,默认使用HTTP访问:
gedit /usr/lib/systemd/system/docker.service
在12行后面增加 --insecure-registry ip:5000 ,可以把原来的#注释掉。
修改好后重启docker 服务,见1。
先查询到container id号,重启容器。再次推送镜像。
sudo docker ps -a
sudo docker start 7ddee8c3895d //以查询得到的CONTAINER ID 号为准
sudo docker push 192.168.121.129:5000/led_flash:v1.0
CONTAINER ID:容器的唯一标识符;
IMAGE:容器所使用的镜像;
COMMAND:容器启动时执行的命令;
CREATED:容器的创建时间;
STATUS:容器的状态;
PORTS:容器所使用的端口;
NAMES:容器的名称。
Up:表示容器正在运行中。当容器启动后,Docker会自动将其状态设置为Up。此时可以使用docker ps命令查看容器的状态。
Created:表示容器已经被创建,但还未启动。当我们使用docker run命令创建一个新的容器时,Docker会将其状态设置为Created,此时容器的文件系统和元数据已经存在,但容器内部的进程还未启动。
Exit:表示容器已经停止运行。当容器中的进程停止或者容器被手动停止时,Docker会将其状态设置为Exit。此时可以使用docker ps -a命令查看容器的状态,其中Exited字段表示容器的状态为Exit。
通过浏览器访问"http://192.168.121.129:5000/v2/_catalog",即可看到当前仓库里已有的镜像。