openwrt中的docker性能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openwrt中的docker性能相关的知识,希望对你有一定的参考价值。

1、宿主机、容器?
容器只是运行在宿主机上的一种特殊的进程
当我们所说的对象是 docker 容器时, 它所在的机器就是宿主机,
如果在虚拟机里装docker, 那么虚拟机就是容器的宿主机
如果在物理机里装docker, 那么物理机就是容器的宿主机
2、为什么用docker?
实现更轻量级的虚拟化,方便快速部署
对于部署来说可以极大的减少部署的时间成本和人力成本
1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;

2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;

3)方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;

4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

5)方便持续集成,通过与代码进行关联使持续集成非常方便;

3、docker上哪些环节会影响应用性能?
CPU、内存、网络、硬盘、进程

4、一个标准的应用框架可能涉及哪些中间件?
rabbitMQ、redis、数据库
参考技术A DOCKER。
不太理解各位大神的目的和初衷。
OPENWRT(X86)是一个软路由,个人认为,它的最大作用,就是发挥路由或网关的核心作用。
都是构建在虚拟机上,为何要把DOCKER内置在这里?再启一个linux环境专门做DOCKER不行么,OPENWRT更新频率那么高,在这种情况下,有谁会把DOCKER放在这个随时都要干掉更新的环境中?
别的功能说不得了,放在OPENWRT上面完全可以理解,但是这个DOCKER,非得放到OPENWRT上?更新一次就重建一次DOCKER

用 Docker 编译 Openwrt

前言

家里的 斐讯 K2P 路由器已经使用了3年了,一直用别人的固件,后来想自己编译固件。

我打算编译和使用 Lean's OpenWrt ,Lean 的这个固件非常完善,对 K2P 的无线支持的非常好(开源的 Openwrt K2P 的无线没办法 2.4G5G 同时使用)。

采用 Docker 进行编译有很多好处,避免在宿主机上安装杂七杂八的软件。网上有许多 lede-builder ,我尝试过使用 hanxi的lede-docker-builder ,用了几天,发现有一些问题:

  1. Docker 底包用的是 Ubuntu 18.04 ,里面的包都比较老了,尤其是 Openwrt 19.07 发布之后,有些需要 Python 3.5 以上版本的包都没办法编译;

  2. 镜像文件比较大,解压之后足足有 1.82G 下载下来非常慢。

折腾了一天,我终于把设置和流程弄好了。

建立 Docker 镜像

我在 github 上新建了一个仓库 lll9p/docker-lede-builder ,要点主要有:

  1. 使用 debian:buster-slim 容器,比较新,而且比完整的 debian:buster 有所精简;

  2. 预安装 proxychains4 和 sudo proxychains 当处于网络环境不好的时候使用代理进行文件下载或提高网速;sudo 可以进行一些 root 用户操作;

  3. 使用 apt-get --no-install-recommends 命令进行安装,大幅精简镜像体积;

  4. 新建 build 用户,免于直接使用 root 编译。

Dockerfile 如下:

FROM debian:buster-slim
MAINTAINER lll9p <lll9p.china@gmail.com>

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update \
&& apt-get install -y locales curl wget \
&& apt-get install -y --no-install-recommends build-essential \
asciidoc binutils bzip2 gawk gettext git libncurses5-dev \
libz-dev patch python3 unzip zlib1g-dev lib32gcc1 \
libc6-dev-i386 subversion flex uglifyjs git-core \
gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo \
libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf \
automake libtool autopoint device-tree-compiler \
proxychains4 sudo vim \
&& groupadd -r build && useradd -r -u 1000 -g build build \
&& passwd -d root \
&& passwd -d build \
&& echo '%build ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8

ENV LANG en_US.utf8

USER build
WORKDIR /home/build

ENV FORCE_UNSAFE_CONFIGURE=1

CMD ["/bin/bash"]

pushgithub 上之后,再在 Docker 上新建一个 repo : lll9p/docker-lede-builder@dockerhub ,在 Build configurations `` 那里设置好指向就自动进行 ``build 了,经过几次修改提交之后,最后一个 build 用了11min的样子。pull 镜像下来,大小也才 650MB ,精简的不错。

一些编译辅助脚本

利用脚本可以方便地编译或实现自动化:

  1. 目录结构初始化 - 将 /home/\`whoami\`/data/docker 挂载到 docker 的启动目录 /home/build

    • data/docker 目录下 git clone Lean's OpenWrt 。

    • 由于我使用了 server酱 ,顺便也 git 一份到 docker 下。

  2. 脚本:

    该脚本作用是

    #!/bin/bash
    BUILD_PATH="/home/build"
    PROXYCHAINS="proxychains4 -q "
    echo 'Start build script.'
    echo ''
    echo '--- Modify proxychains configs. ---'
    sudo sed -i '$ d' /etc/proxychains4.conf
    sudo sed -i '$ d' /etc/proxychains4.conf
    echo 'socks5 172.17.0.1 1081' | sudo tee -a /etc/proxychains4.conf
    echo '' | sudo tee -a /etc/proxychains4.conf

    echo '--- Pull from git server. ---'
    echo ''
    echo '--- Pull from lede. ---'
    cd ${BUILD_PATH}/lede
    ${PROXYCHAINS} git pull
    echo '--- Pull from luci-app-serverchan. ---'
    cd ${BUILD_PATH}/luci-app-serverchan
    ${PROXYCHAINS} git pull
    echo ''
    echo '--- Add luci-app-serverchan to package. ---'
    echo ''
    cd ${BUILD_PATH}/lede
    rm ${BUILD_PATH}/lede/package/feeds/luci/luci-app-serverchan
    ln -s ${BUILD_PATH}/luci-app-serverchan ${BUILD_PATH}/lede/package/feeds/luci/luci-app-serverchan
    ${PROXYCHAINS} ${BUILD_PATH}/lede/scripts/feeds update -a && ${BUILD_PATH}/lede/scripts/feeds install -a

    echo '--- Remove tmp files. ---'
    rm -rf ${BUILD_PATH}/lede/tmp

    echo '--- Remove tmp old config. ---'
    rm -rf ${BUILD_PATH}/lede/.config

    echo '--- Using diff config file. ---'
    cp ${BUILD_PATH}/diffconfig ${BUILD_PATH}/lede/.config

    echo '--- Expand to full config file. ---'
    make defconfig

    echo '--- Download needed files. ---'
    ${PROXYCHAINS} make download

    echo '--- Start build. ---'
    make -j5 V=s

    用于自动更新编译好的固件,具体目录和 Openwrt 的密码请自行更换,依赖 sshpass

    #! /bin/bash
    sshpass -p 我的密码 ssh root@192.168.1.1 'rm /tmp/update.bin'
    sshpass -p 我的密码 scp /home/u/data/docker/lede/bin/targets/ramips/mt7621/openwrt-ramips-mt7621-phicomm_k2p-squashfs-sysupgrade.bin root@192.168.1.1:/tmp/update.bin
    sshpass -p 我的密码 ssh root@192.168.1.1 'sysupgrade -v /tmp/update.bin'
    • flash.sh

    • comple.sh

    1. 进行 proxychans 设置(需要提前在宿主机上开启代理)

    2. 更新 lede 和 server酱

    3. 更新 feeds

    4. 由于在之前使用 data/docker/lede/scripts/diffconfig.sh > data/diffconfig 所以可以用它来更新 .config ,不必每次都 make menuconfig

    5. 最后是 downloadmake 编译,采用 5 个进程

    6. 如果不希望使用代理进行下载,可以将 PROXYCHAINS 注释掉

使用方法

启动 docker

  1. 先使用 sudo systemctl start docker 启动 docker daemon ,然后将 lede 克隆到 data/docker 目录下;

  2. 再执行 sudo docker pull lll9p/docker-lede-builder 安装所需镜像;

  3. 执行 sudo docker run --rm -it -v /home/u/data/docker:/home/build lll9p/docker-lede-builder 即可进入编译环境,可以进行手动编译或者使用之前提供的 compile.sh 脚本进行自动编译;

  4. 可以使用 sudo docker run --rm=true -v /home/lao/data/docker:/home/build lll9p/docker-lede-builder /bin/bash /home/build/compile.sh 进行自动编译。


以上是关于openwrt中的docker性能的主要内容,如果未能解决你的问题,请参考以下文章

openwrt软件源没有docker

N1 docker 中运行openwrt

小钢炮 docker 搭建openwrt详细过程

云原生之Docker实战使用Docker部署openwrt软路由系统

openwrt配置组播代理

openwrtdocker可以关闭吗