Application Note 基于 M6708-T 的 Ubuntu16.04 系统 AN01010101 V0.00 Date: 2018/06/13 类别 内容 关键词 Docker Ubuntu 摘 要 介绍 Ubuntu 系统下的 Docker 基本使用方法
修订历史 版本日期原因 V1.00 2018/06/13 创建文档 i
目录 1. 适用范围... 1 2. 开发环境... 2 3. Ubuntu16.04 系统烧写... 3 3.1 制作 TF/SD 卡... 3 3.2 烧写 Ubuntu16.04 系统... 4 4. Docker 简介... 5 4.1 Docker 的优势... 5 4.2 Docker 应用场景... 5 4.3 Docker 系统架构... 5 5.... 7 5.1 Docker 版本更换... 7 5.2 Docker 基本操作... 7 5.2.1 Docker 守护进程... 7 5.2.2 运行 hello-world 容器... 8 5.2.3 运行 ubuntu 容器... 9 5.2.4 查询容器... 11 5.2.5 重新启动容器... 12 5.2.6 删除容器... 12 6. 免责声明... 13 1
1. 适用范围 本文档是下的, 适用于广州致远电子 有限公司基于 NXP i.mx6dl/ i.mx6q 开发的 M6708-T 系列核心板以及 IoT9000A-LI 工控 板, 且仅适用于 Ubuntu 系统 1
2. 开发环境 1. 硬件环境 M6708-T 系列核心板结合 EVB-6708T-L( 评估底板 ), 或者 IoT9000A-LI 工控板 2. 软件环境需要烧写 M6708-T 系列核心板或 IoT9000A-LI 配套 Ubuntu16.04 系统, 烧写工具可从官网下载, 并按用户手册中烧写指导进行烧写 此系统版本信息如下 : 内核版本 :Linux4.1.15; Ubuntu 版本 :Ubuntu16.04 LTS(Armhf 版本 ); Docker 版本 :17.03.1-ce 2
3. Ubuntu16.04 系统烧写 3.1 制作 TF/SD 卡 mk_burnsd-m6708-t-ubuntu1604.zip 是 M6708-T 系列核心板以及工控板的 Ubuntu1604 系统恢复和更新工具 解压 mk_burnsd-m6708-t-ubuntu1604.zip 后, 其中 burn.bat 文件是用来制作 TF/SD 卡的脚本, 双击运行此脚本即可完成 TF/SD 卡的制作, 界面如图 3.1 所示 图 3.1 输入 SD/TF 卡盘符 此时需要输入要制作的 TF/SD 卡的盘符, 请输入 TF/SD 卡在 PC 机上的实际盘符 图 3.2 选择核心板型号 输入盘符后, 请根据核心板型号输入相应的数字编号, 如图 3.2 所示 图 3.3 制作烧写卡完成 3
当卡制作完成时, 会显示 烧写完成, 按键退出 要求输入任意键来退出烧写, 如图 3.3 所示 至此, 用于恢复出厂固件的 TF/SD 卡已经制作完成 3.2 烧写 Ubuntu16.04 系统烧写卡制作完成后, 将卡插入 TF/SD 卡座, 短接板上 CFG 跳线中的 SD0 SD1 启动跳线, 重新上电后, 系统将自动进行烧写, 串口最后会输出如下信息 : rootfs/var/lib/systemd/coredump/ rootfs/var/lib/systemd/catalog/ rootfs/var/lib/systemd/catalog/database rootfs/var/lib/systemd/random-seed rootfs/var/mail/ rootfs/var/local/ rootfs/var/run rootfs/var/backups/ rootfs/var/lock rootfs/proc/ OK! OK! OK! OK! OK! OK! burn OK! 完成烧写后系统蜂鸣器会短鸣一声 断电后, 断开 SD0 SD1 跳线, 重新上电 即可启动烧写好的系统 4
4. Docker 简介 Docker 是一个能够把应用程序自动部署到容器的开源引擎 该引擎提供一个能够运行应用程序的轻量 快速的环境, 并方便高效地将程序从开发环境部署到测试环境, 再部署到工作环境 4.1 Docker 的优势 1. 提供一个简单 轻量的建模方式 Docker 用户可以很快速地将自己的程序 Docker 化,Docker 采用 写时复制 模型, 使得应用程序修改变得非常快速便捷 通过创建容器来运行应用程序, 容器拥有很高的性能, 一台主机可运行多个容器, 使用户尽可能充分利用系统资源 2. 职责分离使用 Docker 后, 开发人员只需要关心容器中运行的应用程序, 而运维人员只需要关心如何管理容器 3. 快速高效的开发生命周期使用 Docker 能够缩短代码开发 测试 部署 上线运行的周期, 让应用程序具备可移植性, 解决由开发环境和运行环境差异所导致的各种问题, 使程序易于构建, 易于协作 4. 使用面向服务的架构 Docker 支持面向服务的架构和微服务架构 Docker 推荐单个容器只运行一个应用程序, 形成一个分布式的应用程序模型, 在这种模型下, 应用程序可以表示为一系列内部互联的容器, 从而使得扩展或调试应用程序变得简单化, 同时也提高了程序的内省性 4.2 Docker 应用场景 Docker 的常用应用场景如下 : 应用程序开发人员可构建 运行并分享 Docker 容器, 然后轻松地提交到测试环境中, 并最终进入生产环境 ; 用 Docker 创建隔离的环境来进行测试, 让开发者先在本机上构建一个复杂的程序或架构来进行测试, 而不需要开始就在生产环境下部署 测试 ; 为开发 测试提供一个轻量级的独立沙盒环境, 或者将独立的沙盒环境用于教学工作, 如 Linux shell 的使用 编程语言教学 ; Docker 为软件开发和云计算平台建立了桥梁, 通过 Docker 可以让自己的程序运行在云端 ; 高性能 超大规模的宿主机部署 4.3 Docker 系统架构 Docker 是一个客户端 / 服务器 (C/S) 架构系统, 其系统架构如图 4.1 所示 5
图 4.1 Docker 系统架构图 Docker 守护进程 : 即 Docker 服务进程, 负责容器的创建 运行和监控, 此外负责镜像的构建和储存 ; Docker 客户端 : 负责向 Docker 守护进程发出请求, 守护进程根据请求完成相应的工作, 客户端可以和 Docker 守护进程运行在同一台主机上, 也可以远程连接到另一台运行 Docker 守护进程的主机 ; Registry: 负责储存和发布镜像, 默认的 Registry 为 Docker Hub Registry, 其地址为 http://registry.hub.docker.com, 可通过 Docker 的 search 命令或网页搜索上面已有的镜像 ; Docker 镜像 : 可以看作是一个特殊的文件系统, 用于提供容器运行所需要的程序 库 资源 配置 ; 容器 : 是镜像运行的实例, 用户可以在容器中运行自己应用程序和启动服务 镜像与容器区别 : 镜像是 Docker 生命周期中的构建或打包阶段, 而容器是启动或执行阶段 6
5. M6708-T 系列核心板或 IoT9000A-LI 工控板配套的 Ubuntu16.04 系统, 默认已安装 Docker 软件, 其版本为 :Docker17.03.1-ce 5.1 Docker 版本更换如果需要更换 Docker 版本, 可按以下方法进行操作 首先, 使用 apt-cache madison docker-ce 命令列出系统当前可用的 Docker 版本, 执行示例如下 : root@localhost:~# apt-cache madison docker-ce docker-ce 18.03.1~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 18.03.0~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.12.1~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.12.0~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.09.1~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.09.0~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.06.2~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.06.1~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.06.0~ce-0~ubuntu https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.03.2~ce-0~ubuntu-xenial https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.03.1~ce-0~ubuntu-xenial https://download.docker.com/linux/ubuntu xenial/stable armhf Packages docker-ce 17.03.0~ce-0~ubuntu-xenial https://download.docker.com/linux/ubuntu xenial/stable armhf Packages 然后, 使用 apt-get install docker-ce=<version> 命令指定安装相应的版本, 以 18.03.1~ce-0~ubuntu 为例, 安装命令为 : root@localhost:~# apt-get install docker-ce=18.03.1~ce-0~ubuntu 5.2 Docker 基本操作 5.2.1 Docker 守护进程已安装 Docker 软件的系统, 启动时默认会启动 Docker 守护进程, 守护进程会监听 /var/run/docker.sock 这个 Unix 套接字文件, 来获取来自客户端的 Docker 请求 如果 Docker 守护进程没有启动, 运行 Docker 客户端时, 会报如下提示信息 : docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. See 'docker run --help'. 关于 Docker 守护进程开机自启动的查询 设置, 以及手动启动 / 关闭的命令如下所示 (1) 查询 Docker 守护进程是否开机自启动 root@localhost:~# systemctl is-enabled docker.service (2) 使能 Docker 守护进程开机自启动 root@localhost:~# systemctl enable docker.service (3) 禁止 Docker 守护进程开机自启动 root@localhost:~# systemctl disable docker.service (4) 手动启动 Docker 守护进程 root@localhost:~# systemctl start docker.service (5) 手动关闭 Docker 守护进程 root@localhost:~# systemctl stop docker.service 7
(6) 手动重启 Docker 守护进程 root@localhost:~# systemctl restart docker.service 使用 docker version 命令可查看 Docker 版本, 如下所示, 正常情况下, 会输出系统当前 Docker 客户端和守护进程的版本信息 root@localhost:~# docker version Client: Version: 17.03.1-ce API version: 1.27 Go version: Git commit: go1.7.5 c6d412e Built: Mon Mar 27 17:18:59 2017 OS/Arch: linux/arm Server: Version: 17.03.1-ce API version: 1.27 (minimum version 1.12) Go version: Git commit: go1.7.5 c6d412e Built: Mon Mar 27 17:18:59 2017 OS/Arch: linux/arm Experimental: false 5.2.2 运行 hello-world 容器 hello-world 镜像是 Docker Hub Registry 上一个简单的测试镜像, 可用于快速检测 Docker 是否安装成功, 本节以运行 hello-world 镜像为例, 演示一下运行一个 Docker 镜像的过程, 其执行命令和结果如下所示 : root@localhost:~# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world <- 本地没有 hello-world:latest 镜像 <- 从 Docker Hub Registry 上 pull hello-world 镜像 61ddb93a5f93: Pull complete Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77 Status: Downloaded newer image for hello-world:latest Hello from Docker! <- hello-world 容器运行时所输出的信息 This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (arm32v5) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. 8
To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/ 如上所示, 其中 docker run 命令用于创建和启动一个容器, hello-world 是要使用的镜像, 执行结果中的第一行 : Unable to find image 'hello-world:latest' locally 说明本地没有 hello-world:latest 镜像, 于是 Docker 会在 Docker Hub Registry 上进行在线搜索, 并下载最新版本的镜像 hello-world:latest 镜像下载后,Docker 会将它转成容器并运行, 此容器运行的结果是打印 Hello from Docker! 等信息, 打印结束后退出容器 如果以后再运行 hello-world 镜像,Docker 检测本地已经存在 hello-world 镜像时, 会直接尝试将其转成容器并运行, 执行结果如下所示 root@localhost:~# docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (arm32v5) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/ 5.2.3 运行 ubuntu 容器为了进一步了解 Docker, 可以启动一个 ubuntu 容器, 并在容器中尝试 ubuntu 相关操作 在 Docker Hub Registry 上,Docker 公司提供了一个 ubuntu 基础镜像 ( 类似的还有 fedora debian centos 等镜像 ), 我们可以选择在此基础镜像上, 增加自己创建的模块单元, 来构建自己所需的镜像 1. 下载并启动 ubuntu 容器 9
如下所示, 使用 docker run 创建和启动一个 ubuntu 容器 其中 -h 参数用来设定容器的主机名 (hostname), 以 M6708-T 为例, 当容器启动完成后, 其命令行提示符中包含 M6708-T -i 参数使得容器中的 STDIN 是开启的,-t 参数使得容器分配一个伪 tty 终端, 这样新创建的容器才能提供一个交互式 shell 如果想创建一个运行后台服务的容器, 则不需要 -i 和 -t 参数 执行此命令后,Docker 检测到本地没有 ubuntu:lates 镜像时, 会在 Docker Hub Registry 上搜索并下载镜像, 然后将它转成容器并运行 该容器运行后会拥有自己的网络 IP 地址, 以及一个用来和宿主机进行通信的桥接网络接口, 命令中的 /bin/bash 是告诉 Docker 在此容器中要运行的命令, 本例以 /bin/bash 为例, 在容器中启动了一个 Bash shell, 如下所示 root@localhost:~# docker run -h M6708-T -i -t ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu <- 从 Docker Hub Registry 上 pull ubuntu 镜像 253c7c36e8ff: Pull complete fe7c768a65c7: Pull complete ba8d0d2ce80e: Pull complete 28492cd57e46: Pull complete bdfd257d89dc: Pull complete Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d Status: Downloaded newer image for ubuntu:latest root@m6708-t:/# <- 容器运行后, 启动 Bash shell 接下来, 可以尝试在此容器中执行 ubuntu 的 Bash shell 相关操作, 比如 : root@m6708-t:/# hostname M6708-T root@m6708-t:/# ls / bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var root@m6708-t:/# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 2960 2220? Ss 02:06 0:00 /bin/bash root 16 0.0 0.1 4488 1820? R+ 02:51 0:00 ps -aux 2. 在容器中安装软件包由于此容器是由 ubuntu 基础镜像启动的, 很多工具是缺少的, 需要根据自己需求进行安装, 比如, 尝试使用 ifconfig 查看系统网络时, 提示无法找到此命令 : root@m6708-t:/# ifconfig bash: ifconfig: command not found 很多工具可以使用 apt 命令来安装, 由于容器需要通过桥接宿主机网卡来联网下载软件包, 所以需确保容器宿主机是联网状态 先使用 apt-get update 更新软件包列表 : root@m6708-t:/# apt-get update Get:1 http://ports.ubuntu.com/ubuntu-ports bionic InRelease [242 kb] <- 省略若干行 Get:17 http://ports.ubuntu.com/ubuntu-ports bionic-security/main armhf Packages [76.9 kb] Fetched 24.8 MB in 4min 36s (89.9 kb/s) Reading package lists... Done 安装 busybox 工具 : root@m6708-t:/# apt-get install busybox 10
Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: busybox 0 upgraded, 1 newly installed, 0 to remove and 6 not upgraded. Need to get 376 kb of archives. After this operation, 596 kb of additional disk space will be used. Get:1 http://ports.ubuntu.com/ubuntu-ports bionic/universe armhf busybox armhf 1:1.27.2-2ubuntu3 [376 kb] Fetched 376 kb in 5s (79.3 kb/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package busybox. (Reading database... 4029 files and directories currently installed.) Preparing to unpack.../busybox_1%3a1.27.2-2ubuntu3_armhf.deb... Unpacking busybox (1:1.27.2-2ubuntu3)... Setting up busybox (1:1.27.2-2ubuntu3)... 安装完成后, 就可以使用 busybox 中的任意工具了, 比如 ifconfig: root@m6708-t:/# busybox ifconfig eth0 Link encap:ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:17904 errors:0 dropped:0 overruns:0 frame:0 TX packets:11424 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:26333897 (25.1 MiB) TX bytes:800453 (781.6 KiB) lo Link encap:local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 3. 结束运行容器当容器相关操作完成时, 可执行 exit 命令结束并退出容器, 执行后, 系统会返回到宿主机的命令终端, 如下所示 : root@m6708-t:/# exit exit root@localhost:~# 5.2.4 查询容器使用 docker ps -a 命令可列出当前系统中的所有容器, 包括运行的和停止的 : 11
root@localhost:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7fc2b0e52f2c ubuntu "/bin/bash" 3 hours ago Exited (0) 2 minutes ago vibrant_mcclintock 4c5e8600a6ae hello-world "/hello" 3 hours ago Exited (0) 3 hours ago elastic_hypatia 由以上输出信息, 可以看到当前系统中有两个已经停止 (STATUS 为 Exited) 的容器 : ubuntu 和 hello-world 其中 NAMES 字段是 Docker 为每个容器所命的名称, 用于标识各个容器, 比如 vibrant_mcclintock 用于标识 ubuntu 容器, 在 docker 一些指令中可用 NAMES 中的名称作为参数来指定所标识的容器, 比如查询 ubuntu 容器操作日志 : root@localhost:~# docker logs vibrant_mcclintock root@m6708-t:/# hostname M6708-T root@m6708-t:/# ls bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var <- 省略若干行此外,CONTAINER ID 字段也可以用于标识各个容器, 用法与 NAMES 相同 5.2.5 重新启动容器对于已经停止的容器, 可使用 docker restart 命令来重新启动, 比如重启 ubuntu 容器 : root@localhost:~# docker restart vibrant_mcclintock vibrant_mcclintock 5.2.6 删除容器如果容器已经不再使用, 可使用 docker rm 命令来删除, 比如删除 hello-world 容器 : root@localhost:~# docker rm elastic_hypatia elastic_hypatia 12
6. 免责声明 本文档提供有关产品的信息 本文档并未授予任何知识产权的许可, 并未以明示或暗示, 或以禁止发言或其它方式授予任何知识产权许可 除在其产品的销售条款和条件中声明的责任之外, 概不承担任何其它责任 并且, 对产品的销售和 / 或使用, 不作任何明示或暗示的担保, 包括对产品的特定用途适用性 适销性或对任何专利权 版权或其它知识产权的侵权责任等, 均不作担保 产品并非设计用于医疗 救生或维生等用途 可能随时对产品规格及产品描述做出修改, 恕不另行通知 工控主板可能包含某些设计缺陷或错误, 一经发现将收入勘误表, 并因此可能导致产品与已出版的规格有所差异 如客户索取, 可提供最新的勘误表 在订购产品之前, 请您与当地的销售处或分销商联系, 以获取最新的规格说明 本文档中提及的含有订购号的文档以及其它文献, 可通过访问的万维网站点获得, 网址是 : http://www.zlg.cn 或致电 +86-20-22644254 查询 Copyright 2018, ZHIYUAN Electronics Co., Ltd. 保留所有权利 13
销售与服务网络 地址 : 广州市天河区车陂路黄洲工业区 7 栋 2 楼 邮编 :510660 网址 :www.zlg.cn 全国销售与服务电话 :400-888-4005 全国服务电话 :400-888-4005 销售与服务网络 : 广州总公司 广州市天河区车陂路黄洲工业区 7 栋 2 楼 电话 :020-28267893 上海分公司 上海市北京东路 668 号科技京城东楼 12E 室 电话 :021-53865720-801 北京分公司 北京市丰台区马家堡路 180 号蓝光云鼎 208 室 电话 :010-62536178 深圳分公司 深圳市福田区深南中路 2072 号电子大厦 12 楼 1203 室 电话 :0755-82941683 0755-82907445 武汉分公司 武汉市洪山区民族大道江南家园 1 栋 3 单元 602 电话 :027-62436478 13006324181 南京分公司 南京市秦淮区汉中路 27 号友谊广场 17 层 F G 区 电话 :025-68123919 杭州分公司 杭州市西湖区紫荆花路 2 号杭州联合大厦 A 座 4 单 元 508 成都分公司 成都市一环路南 2 段 1 号数码科技大厦 319 室 电话 :028-85439836-805 电话 :0571-86483297 郑州分公司河南省郑州市中原区建设西路与百花路东南角锦绣华庭 A 座 1502 电话 :400-888-4005 (0371)66868897 重庆分公司重庆市九龙坡区石桥铺科园一路二号大西洋国际大厦 ( 百脑会 )2705 室电话 :023-68797619 西安办事处 西安市长安北路 54 号太平洋大厦 1201 室 电话 :029-87881295 天津办事处 天津市河东区津塘路与十一经路交口鼎泰大厦 1004 电话 :022-24216606 青岛办事处山东省青岛市李沧区青山路 689 号宝龙公寓 3 号楼 701 室电话 :0532-58879795 17660216799 请您用以上方式联系我们, 我们会为您安排样机现场演示, 感谢您对我公司产品的关注! 14