Docker 的使用流程及 CI 构建

发布于 2021-04-12 11:37:33

什么是 Docker

Docker 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 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

为什么要使用 Docker

Docker: 码头工人(来自有道翻译); Docker 的图标是一个 鲸鱼,上面放了很多箱子。通过 Docker 的图标和中文,我们可以基本了解 Docker 的含义。
Docker 是一种引擎,基于这个引擎,开发者能让他们开发的应用处于一个有隔离性的、可移植性的容器中,以便于发布于各种机器中而无需考虑兼容性问题。开发者可以使用 Docker 搭建一个测试环境,在每次测试时,只要运行 Docker 镜像就可以有一个已经搭建完毕并且干净的测试环境,减少人力资本。
Docker 也可以用于自动化测试,在 RT-Thread-Studio 的 sdk-index 仓库,就是基于 Docker 构建的自动化测试。

使用流程

这里介绍一下在 linux 环境下 docker 的使用流程。

安装 Docker

打开 linux 终端,输入命令 sudo apt install docker.io 安装 docker。

安装成功后,输入命令 docker --help 验证安装成功:

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 版本,就会报错哦:

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 来列出本地主机上的镜像:

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 拉取镜像仓库:

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/

删除容器

删除所有容器

docker rm $(docker ps -a -q)

删除镜像

该镜像没有启动的容器才可以被删除。

删除所有镜像

docker rmi $(docker images -q)

制作镜像

创建镜像仓库

  1. 如同 Github 操作一样,我们需要先创建一个 docker 镜像仓库,才能向该仓库推送代码;
  2. 打开 dockerhub 网站,注册一个账号:

1.png

  1. 创建镜像仓库:

2.png

构建镜像

通过上面的步骤,我们创建了一个镜像仓库;这一步,我们要构建一个镜像,镜像中会有我们需要的环境。

Dockerfile 的使用

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。示例:

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 的基本使用方法,请查看官方教程

  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

   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 }}
  1. 设置环境变量

4.png

  1. 推送代码到 Github:

5.png

  1. 查看 Ci 日志;arm-gcc 的 版本号打印出来了,说明我们的 dockerfile 文件是没有问题的,等待镜像推送完成:

6.png

  1. CI 构建完成后,打开我们的 dockerhub 仓库,发现一个新的 tag 已经被推送成功:

7.png

验证镜像

登录

在本地 ubuntu 打开终端,输入命令 docker login 登录 docker:

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 拉取我们刚才创建的镜像:

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 版本:

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 条评论

发布
问题