Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CI/CD_持续集成部署
Docker
Dockerfile
Docker 的使用流程及 CI 构建
发布于 2021-04-12 11:37:33 浏览:1057
订阅该版
[tocm] # 什么是 Docker > [Docker](https://www.docker.com/) takes away repetitive, mundane configuration tasks and is used throughout the development lifecycle for fast, easy and portable application development - desktop and cloud. Docker’s comprehensive end to end platform includes UIs, CLIs, APIs and security that are engineered to work together across the entire application delivery lifecycle. Docker 是一个开源的应用容器引擎,基于 [Go 语言](https://www.runoob.com/go/go-tutorial.html) 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 # 为什么要使用 Docker Docker: 码头工人(来自有道翻译); Docker 的图标是一个 ![鲸鱼](https://oss-club.rt-thread.org/uploads/20210412/765597558ac3a704f953a16679777ff0.png),上面放了很多箱子。通过 Docker 的图标和中文,我们可以基本了解 Docker 的含义。 Docker 是一种引擎,基于这个引擎,开发者能让他们开发的应用处于一个有隔离性的、可移植性的容器中,以便于发布于各种机器中而无需考虑兼容性问题。开发者可以使用 Docker 搭建一个测试环境,在每次测试时,只要运行 Docker 镜像就可以有一个已经搭建完毕并且干净的测试环境,减少人力资本。 Docker 也可以用于自动化测试,在 RT-Thread-Studio 的 [sdk-index](https://github.com/RT-Thread-Studio/sdk-index) 仓库,就是基于 Docker 构建的自动化测试。 # 使用流程 这里介绍一下在 linux 环境下 docker 的使用流程。 ## 安装 Docker 打开 linux 终端,输入命令 `sudo apt install docker.io` 安装 docker。 安装成功后,输入命令 `docker --help` 验证安装成功: ```bash liukang@liukang-virtual-machine:~$ docker --help Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Options: --config string Location of client config files (default "/home/liukang/.docker") -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use") -D, --debug Enable debug mode -H, --host list Daemon socket(s) to connect to -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/home/liukang/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/home/liukang/.docker/cert.pem") --tlskey string Path to TLS key file (default "/home/liukang/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit ``` ## Docker 镜像的使用 ### 拉取镜像 使用命令 `sudo docker pull name:tag` 拉取 docker 镜像,没有输入 tag,默认拉取 latest 版本,如果你的 docker 镜像没有 latest 版本,就会报错哦: ```bash liukang@liukang-virtual-machine:~$ sudo docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world b8dfde127a29: Pull complete Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24 Status: Downloaded newer image for hello-world:latest docker.io/library/hello-world:latest ``` ### 查看镜像 使用命令 `docker images` 来列出本地主机上的镜像: ```bash liukang@liukang-virtual-machine:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 weeks ago 13.3kB ``` ### 容器与镜像 Docker 容器与镜像是什么关系? 简单来说,Docker 镜像是一个类,容器是镜像的实例化对象;通过镜像,可以创建无数个容器。Docker 的生命周期是由镜像(image),容器(container),仓库(repository)三部分组成。 ### 启动容器 输入命令 `docker run` 来启动容器,如果本地没有该镜像,docker 会自动去 dockerhub 拉取镜像仓库: ```bash liukang@liukang-virtual-machine:~$ sudo docker run -it hello-world:latest 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. (amd64) 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/get-started/ ``` ### 删除容器 删除所有容器 ```bash docker rm $(docker ps -a -q) ``` ### 删除镜像 该镜像没有启动的容器才可以被删除。 删除所有镜像 ```bash docker rmi $(docker images -q) ``` ## 制作镜像 ### 创建镜像仓库 1. 如同 Github 操作一样,我们需要先创建一个 docker 镜像仓库,才能向该仓库推送代码; 2. 打开 [dockerhub](https://hub.docker.com/) 网站,注册一个账号: ![1.png](https://oss-club.rt-thread.org/uploads/20210412/e3c7feec1914c3cd95177da96b609833.png) 3. 创建镜像仓库: ![2.png](https://oss-club.rt-thread.org/uploads/20210412/a6ef650c8be367cab79cc31aafcef460.png) ### 构建镜像 通过上面的步骤,我们创建了一个镜像仓库;这一步,我们要构建一个镜像,镜像中会有我们需要的环境。 #### [Dockerfile](https://docs.docker.com/engine/reference/builder/) 的使用 [Dockerfile](https://docs.docker.com/engine/reference/builder/) 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。示例: ```bash FROM python:3.6-slim-buster RUN apt-get update \ && apt-get upgrade \ # arm tool chain && root_path=`pwd`\ && wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/6-2016q4/gcc-arm-none-eabi-6_2-2016q4-20161216-linux.tar.bz2 \ && tar xf ./gcc-arm-none-eabi-6_2-2016q4-20161216-linux.tar.bz2 \ && mv gcc-arm-none-eabi-6_2-2016q4/ /opt/ \ && /opt/gcc-arm-none-eabi-6_2-2016q4/bin/arm-none-eabi-gcc --version \ && cd $root_path ``` 上面是一个安装好 arm-gcc 工具链的 docker 镜像。我们来了解一下 FROM 与 RUN 指令的含义。Dockerfile 还有其他很多的指令,请在 Docker 查看指令的用法。 ##### FROM FROM 指令初始化一个新的构建阶段,并为后续指令设置基本镜像。因此,一个有效的Dockerfile 必须以 FROM 指令开始。映像可以是任何有效的镜像—从公共存储库中提取镜像开始尤其容易。 在这里,我们以 python:3.6-slim-buster 为基础镜像。 ##### RUN RUN 指令将在当前图像之上的新层中执行任何命令。 在这里,我们使用 RUN 指令拉取了 arm-gcc 工具链。 ### 推送镜像 在本地推送镜像的方式不再介绍,在这里,我们使用 CI 的方式自动化完成 Docker 镜像的构建以及推送。 #### 搭建 CI Github actions 的基本使用方法,请查看[官方教程](https://docs.github.com/en/actions/learn-github-actions)。 1. 创建 github 仓库,拉取到本地; 2. 将刚才的 Dockerfile 文件放在 github 仓库; 3. 构建 CI 流程;Docker 的账号,密码以及 tags,都通过加密环境变量的方式保存在 github 仓库。Ci 示例: DOCKERHUB_USERNAME:dockerhub 的用户名 DOCKERHUB_PASSWORD:dockerhub 的密码 DOCKERHUB_REPO:仓库名和 tag;例如: DOCKERHUB_REPO :realthread/utest:v1.0 ```bash name: Docker-Build # Controls when the action will run. Triggers the workflow on push or pull request # events but only for the master branch on: push: branches: - master pull_request: branches: - master jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to DockerHub uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build and Push uses: docker/build-push-action@v2 with: context: . file: ./Dockerfile platforms: linux/amd64 push: true tags: ${{ secrets.DOCKERHUB_REPO }} ``` 4. 设置环境变量 ![4.png](https://oss-club.rt-thread.org/uploads/20210412/03e2067392723d80205496e02aa7125e.png) 5. 推送代码到 Github: ![5.png](https://oss-club.rt-thread.org/uploads/20210412/c74957afe89498f6ed7c12c56719257b.png) 6. 查看 Ci 日志;arm-gcc 的 版本号打印出来了,说明我们的 dockerfile 文件是没有问题的,等待镜像推送完成: ![6.png](https://oss-club.rt-thread.org/uploads/20210412/e2869d05f73a84575d78e352c6bbf447.png) 7. CI 构建完成后,打开我们的 dockerhub 仓库,发现一个新的 tag 已经被推送成功: ![7.png](https://oss-club.rt-thread.org/uploads/20210412/bf7edb9ec893170fc75db4023cb5f297.png) #### 验证镜像 ##### 登录 在本地 ubuntu 打开终端,输入命令 `docker login` 登录 docker: ```bash liukang@liukang-virtual-machine:~$ sudo docker login -u realthread Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded ``` ##### 拉取镜像 输入命令 `docker pull` 拉取我们刚才创建的镜像: ```bash liukang@liukang-virtual-machine:~$ sudo docker pull realthread/utest:v1.0 v1.0: Pulling from realthread/utest 75646c2fb410: Pull complete 62342603b9a2: Pull complete 3d96f1e1624f: Pull complete 9a5d898ced8e: Pull complete 020f99e219ab: Pull complete 9a2681329a75: Pull complete Digest: sha256:bf1872216b2ea462da0c700689a16d52424ef0b7269de41d3a483c105ea4f1a3 Status: Downloaded newer image for realthread/utest:v1.0 docker.io/realthread/utest:v1.0 ``` ##### 启动容器 输入命令 `docker run ` 启动容器; 查看 arm-gcc 版本: ```bash liukang@liukang-virtual-machine:~$ sudo docker run -it realthread/utest:v1.0 /bin/bash root@83ef37fb9775:/# root@83ef37fb9775:/# ls bin dev home lib32 libx32 mnt proc run srv tmp var boot etc lib lib64 media opt root sbin sys usr root@83ef37fb9775:/# root@83ef37fb9775:/# cd /opt/gcc-arm-none-eabi-6_2-2016q4/bin/ root@83ef37fb9775:/opt/gcc-arm-none-eabi-6_2-2016q4/bin# ./arm-none-eabi-gcc --version arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 6.2.1 20161205 (release) [ARM/embedded-6-branch revision 243739] Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. root@83ef37fb9775:/opt/gcc-arm-none-eabi-6_2-2016q4/bin# python --version Python 3.6.13 ``` 可以看到,我们已经成功的构建了一个 Docker 镜像,这个镜像里面有 python3.6 还有 arm-gcc 工具链。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Papalymo
请勿打扰
文章
25
回答
85
被采纳
17
关注TA
发私信
相关文章
1
生成目标文件的时候,有什么好方法能读取两个不同的链接文件,来生成两个链接地址不同的目标文件(.bin .hex)
2
想在CI/CD中加入 RTT studio项目构建, 如果启用命令行方式的构建
3
RT-Thread 系统可以安装docker吗?
4
RT-Thread上可以运行docker吗
5
请问在rt-smart上可以运行docker吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部