1、安装docker
执行以下命令在Ubuntu虚拟机中安装Docker:
sudo apt update
sudo apt install docker.io
安装完成后docker服务默认是直接启动的:
可以查看当前的镜像和安装的容器均为空:
2、虚拟机平台的docker镜像制作
虚拟机最好用64位的,用32位的编写完Dockerfile拉取镜像失败了。。。
2.1 编写Dockerfile
新建一个目录,在目录下创建Dockerfile文件,文件内容如下:
# 指定平台
FROM ubuntu:latest
# 安装vim工具
RUN apt-get update && apt-get install -y vim
# 设置工作目录
WORKDIR /app
# 将程序文件复制到镜像中
COPY . /app
# 设置镜像的入口命令
CMD ["/bin/bash"]
2.2 制作image
Dockerfile文件表示创建一个和虚拟机同平台的ubuntu docker镜像,同时预装vim命令,执行以下命令创建镜像:
docker build -t pc_image .
制作完成后执行docker images查看镜像:
root@Katarina:/home/aka_li/linux/docker/MyDocker# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pc_image latest 0163c835ddc5 8 seconds ago 183MB
2.3 安装查看
执行docker run --name my-pc-container -it pc_image命令安装镜像,安装成功后自动进入容器,我们预装了vim也是可以使用的,使用exit可以退出:
root@Katarina:/home/aka_li/linux/docker/MyDocker# docker run --name my-pc-container -it pc_image
root@743325ef6a9f:/app#
root@743325ef6a9f:/app# vim a.c
另起一个终端使用docker ps可以查看当前容器状态:
3、开发板平台的docker镜像制作
arm开发版和虚拟机是不同平台的,镜像制作需要指定平台。
3.1 编写Dockerfile
新建一个目录,在目录下创建Dockerfile文件,文件内容如下:
# 指定平台
FROM arm32v7/ubuntu:latest
# 设置工作目录
WORKDIR /app
# 将程序文件复制到镜像中
COPY . /app
# 设置镜像的入口命令
CMD ["/bin/bash"]
3.2 制作image
将之前给开发板使用的picocom也拷贝到当前目录,该串口工具在虚拟机系统下是无法运行的:
使用以下命令制作镜像:
docker build --platform linux/arm/v7 -t board-image .
使用以下命令安装镜像:
docker run --platform linux/arm/v7 -it board_image
很不幸,安装不上,在虚拟机上运行的话需要qemu-user-static提供不同架构之间的转换功能,同时还要装一个qemu-user-static的docker镜像,顺序执行以下命令:
sudo apt install -y qemu-user-static
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
然后重新使用安装命令安装,安装成功后进入容器,此时可以picocom串口工具是可以使用的:
3.3 导出镜像至开发板
使用以下命令将镜像打包为tar包,将tar包拷贝至开发板即可:
docker save -o board-image.tar board-image
3.4 镜像使用
开发板上也要和虚拟机一样提前安装docker服务,安装命令不再赘述,在开发板上使用以下命令加载镜像:
docker load -i board-image.tar
在开发板上使用以下命令安装镜像:
docker run --device=/dev/ttySZ4:/dev/ttySZ4 --name myboard1 -it board-image
其中--device=/dev/ttySZ4:/dev/ttySZ4是映射宿主机下的一个串口驱动文件给容器内的程序使用,另起一个终端可以查看容器安装成功:
此时预装在容器中的串口调试工具也可以正常使用:
3.5 删除命令
前面主要是打包和安装的命令,补充几个删除命令:
# 查看当前容器(包括未启动)
docker ps -a
# 删除容器
docker rm 容器名
# 删除镜像
docker rmi 镜像名