GithubHelp home page GithubHelp logo

openwrt-x86-64's Introduction

Build OpenWrt Docker x86-64 image

[toc]

OpenWrt Docker镜像构建

为了在Docker中运行OpenWrt系统,我们需要用到OpenWrt的docker镜像,网上有很多人分享已经制作好的镜像。但是,每个人都有自己不同的需求,自己学会制作镜像就显得特别重要了。

其实使用OpenWrt的固件, 可以很方便的构建Docker镜像,这里的固件不光是官方固件,也可以是经过自己定制编译生成的固件。

直接使用

如果你只想下载并使用,不关心构建流程,那么你可以直接用下面的命令,并参考后面镜像使用配置部分了解如何使用镜像

# 下载镜像
$ docker pull crazygit/openwrt-x86-64

# 查看镜像信息
$ docker run --rm crazygit/openwrt-x86-64 cat /etc/banner
  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 19.07.2, r10947-65030d81f3
 -----------------------------------------------------

如果觉得官网镜像功能太简单,也可以用我编译的Lean'S大神的OpenWrt固件

https://github.com/crazygit/Actions-OpenWrt

镜像使用配置

镜像的使用可以参考下面两篇文章的方式进行配置,两位都做了非常详细的描述。

同样,如果觉得手动配置比较麻烦,可以使用我整理好使用docker-compose的一键拉起服务文件

https://github.com/crazygit/family-media-center

这里主要描述下本人的手动配置方式

首先说说我的使用场景:

我是在宿主机上通过Docker运行OpenWrt系统,使用它作为旁路由

  • 宿主机操作系统: Ubuntu 18.04.4 LTS
  • 宿主机IP: 192.168.2.125
  • 硬路由IP: 192.168.2.1
  • 分配给OpenWrt系统的IP: 192.168.2.126
  1. 获取网卡名称, 我的网卡名称是enp3s0

    $ ifconfig
    br-df8369127cee: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 172.21.0.1  netmask 255.255.0.0  broadcast 172.21.255.255
            ether 02:42:12:cd:c6:2c  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:18:57:96:e1  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.2.125  netmask 255.255.255.0  broadcast 192.168.2.255
            inet6 fe80::2e56:dcff:fe3c:548a  prefixlen 64  scopeid 0x20<link>
            ether 2c:56:dc:3c:54:8a  txqueuelen 1000  (Ethernet)
            RX packets 2099  bytes 2435262 (2.4 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1149  bytes 104504 (104.5 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 110  bytes 9098 (9.0 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 110  bytes 9098 (9.0 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  2. 开启宿主机网卡混杂模式(可选)

    # 网卡名称enp3s0用你自己上一步获取到的
    $ sudo ip link set enp3s0 promisc on
  3. docker创建macvlan模式的虚拟网络

    子网--subnet和网关--gateway,以及parent=enp3s0网卡名称根据实际情况做调整

    $ docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=enp3s0 openwrt-LAN
    
    # 查看创建的虚拟网络
    $ docker network ls |grep openwrt-LAN
    21dcddacc389        openwrt-LAN         macvlan             local
  4. 启动容器

    # --network使用第4步创建的虚拟网络
    $ docker run --restart always --name openwrt -d --network openwrt-LAN --privileged crazygit/openwrt-x86-64
    
    # 查看启动的容器
    $ docker ps -a
  5. 进入容器,修改网络配置文件并重启网络

    进入容器并修改etc/config/network文件

    $ docker exec -it openwrt /bin/sh
    $ vi /etc/config/network

    编辑lan口的配置如下,有些参数默认的文件里可能没有,按照下面的格式添加上即可

    config interface 'lan'
            option type 'bridge'
            option ifname 'eth0'
            option proto 'static'
            option ipaddr '192.168.2.126'
            option netmask '255.255.255.0'
            option gateway '192.168.2.1'
            option dns '192.168.2.1'
            option broadcast '192.168.2.255'
            option ip6assign '60'
    

    上面的参数根据自身的情况调整

    • proto设置使用静态分配IP地址的方式static
    • ipaddr为OpenWrt系统分配的静态IP,这里我分配的是192.168.2.126(注意: 这个IP地址不要与你本地网络已有的IP地址冲突)
    • netmask为子网掩码255.255.255.0
    • gateway为路由器(硬路由)的网关,通常就是你访问路由器的IP地址,这里我是192.168.2.1
    • dnsDNS服务器的地址,可以是运营商的地址,比如114.114.114.114,这里我直接用的路由器的地址192.168.2.1
    • broadcast为广播地址192.168.2.255

    重启网络

    $ /etc/init.d/network restart
  6. 宿主机网络修复(目前不生效)

    如上配置后,通过宿主机没法直接访问OpenWrt系统的网络,参考 将OpenWRT作为宿主机的网关

    里的方法,使用如下脚本修复网络,但是不生效(希望知道的大神不吝赐教)。不过使用局域网的其他设备可以正常访问OpenWrt系统

    #根据实际情况修改下面两个变量
    # 网卡名称
    card="enp3s0"
    # OpenWrt系统的IP地址
    openwrt_gateway="192.168.2.126"
    
    sudo ip link add link $card vLAN type macvlan mode bridge
    sudo ip addr add 192.168.2.253/24 brd + dev vLAN
    sudo ip link set vLAN up
    sudo ip route del default
    sudo ip route add default via $openwrt_gateway dev vLAN
    
    #设置宿主机的dns服务器为OpenWRT
    echo "nameserver $openwrt_gateway" |sudo tee /etc/resolv.conf
  7. 验收成果

    如第7步所介绍的,我们暂时没有办法直接从宿主机访问OpenWrt,只有借助局域网其他设备上的浏览器,打开OpenWrt系统

    http://192.168.2.126

    我使用的是官方固件,初始密码默认为空,其他固件的初始密码视具体的固件而定了

    openwet login

    剩下的就是openWrt系统的常规使用和配置,这里就不再详述了

手动构建

如果你对自己构建感兴趣,可以继续看下去

使用官方固件

这里以x86-64平台为例

首先获取获取固件的下载地址

  1. 打开官网,选择当前最新的稳定版本19.07.2 step1

  2. 选择x86平台 step2

  3. 选择64step3

  4. 选择固件generic-rootfs.tar.gz step4

  5. 鼠标右键点击"复制链接地址"获取到固件的下载地址,第6步会用到 step5

  6. 构建镜像

    $ git clone https://github.com/crazygit/openwrt-x86-64.git openwrt-x86-64
    $ cd openwrt-x86-64
    # 参数1: 第5步中获取的固件下载地址
    # 参数2: docker镜像的名字,可以随便指定: 如crazygit/openwrt-x86-64
    $ ./build.sh "https://downloads.openwrt.org/releases/19.07.2/targets/x86/64/openwrt-19.07.2-x86-64-generic-rootfs.tar.gz" crazygit/openwrt-x86-64

构建自己的镜像

  1. 编译自己的固件,可以参考:

    https://github.com/crazygit/Actions-OpenWrt

  2. 下载本库

    $ git clone https://github.com/crazygit/openwrt-x86-64.git openwrt-x86-64
  3. 拷贝自己的固件到Dockerfile文件所在的目录,固件文件名后缀应该是.tar.gz

    $ cd openwrt-x86-64
    $ cp /path/to/your/firmware.tar.gz openwrt.tar.gz
  4. 编译镜像

    # -t后面为镜像的名字,可以随便指定: 如: crazygit/openwrt-x86-64
    $ docker build . --build-arg FIRMWARE=openwrt.tar.gz -t crazygit/openwrt-x86-64

使用Github Action自动构建

  1. Fork当前仓库

  2. 在项目Settings->Secrets里配置你的docker hub账户的用户名和密码DOCKER_USERNAMEDOCKER_TOKEN

  3. 在docker hub上创建你在一个仓库来存放编译的镜像

  4. 根据自己的情况修改.github/workflows/build.yml文件中的如下环境变量

    env:
      FIRMWARE_URL: "https://downloads.openwrt.org/releases/19.07.2/targets/x86/64/openwrt-19.07.2-x86-64-generic-rootfs.tar.gz"
      REPOSITORY: crazygit/openwrt-x86-64
      TAG: 19.07.2
  5. 提交修改之后,github action会自动编译镜像并将镜像push到你的docker hub账户中指定的仓库里

验证镜像

下面的命令注意替换镜像名字crazygit/openwrt-x86-64为你自己编译时使用的名字

  1. 查看编译的镜像

    $ docker image ls |grep crazygit/openwrt-x86-64
    crazygit/openwrt-x86-64                                                          latest              07f578cefd53        12 minutes ago      9.43MB
    
  2. 验证镜像是否正常

    $ docker run --rm crazygit/openwrt-x86-64 cat /etc/banner
    _______                     ________        __
    |       |.-----.-----.-----.|  |  |  |.----.|  |_
    |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
    |_______||   __|_____|__|__||________||__|  |____|
            |__| W I R E L E S S   F R E E D O M
    -----------------------------------------------------
    OpenWrt 19.07.2, r10947-65030d81f3
    -----------------------------------------------------

参考

本文构建过程参考自:

https://openwrt.org/docs/guide-user/virtualization/docker_openwrt_image

备注: 官网中的Dockerfile示例有一处错误是

ADD https://downloads.openwrt.org/chaos_calmer/15.05/x86/generic/openwrt-15.05-x86-generic-Generic-rootfs.tar.gz /

上面的语句是无效的,因为ADD指令只有在添加本地的.tar.gz文件时才会自动解压,添加URL时不会自动解压。建议使用本仓库的构建方式。

openwrt-x86-64's People

Contributors

crazygit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openwrt-x86-64's Issues

宿主机网络修复

Ubuntu/Debian系统:
编辑/etc/network/interfaces增加以下内容

# Primary interface
auto eth0
iface eth0 inet dhcp
    up ip link set dev eth0 promisc on

# Macvlan interfaces
auto vir1
iface vir1 inet dhcp
    pre-up ip link add link eth0 address 02:cd:ab:00:10:01 vir1 type macvlan mode bridge
    post-down ip link delete vir1

重启后新建的Macvlan会自动获取多一个IP地址,可与Docker中的Openwrt互通。
但此时宿主机会有两个IP地址,eth0不知道如何禁用DHCP。

不能PING 域名 (只可以IP)

你好, 我是用QNAP 的DOCKER. 使用的網段為 10.10.1.0/24 (gateway : 10.10.1.1)

已跟大佬指引創建了macnet (網卡是eth0)

docker network create -d macvlan --subnet=10.10.1.0/24 --gateway=10.10.1.1 -o parent=eth0 macnet

及成功啟動Docker Openwrt 和 設定了IP 及DNS等

config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option _orig_ifname 'eth0'
option _orig_bridge 'true'
option proto 'static'
option ipaddr '10.10.1.66'
option netmask '255.255.255.0'
option gateway '10.10.1.1'
option broadcast '10.10.1.255'
option dns '1.1.1.1 8.8.8.8'

可以正常PING所有IP 但域名不能, 試用DNS 223.5.5.5 114.114.114.114都不能.
可以煩請大神協助了解一下嗎?

手动构建的镜像运行错误

采用以下版本openwrt
https://downloads.openwrt.org/releases/19.07.2/targets/x86/64/openwrt-19.07.2-x86-64-combined-squashfs.img.gz

将openwrt的下载后的.img.gz文件解压后得到.img文件作为构建镜像的文件基础

根据作者的build.sh内的命令手动构建的镜像

docker build -f Dockerfile文件 . -t abc/edf:v1

Dockerfile只去掉了对应的ARG FIRMWARE,
将下面的手动更改为 ADD img文件

如此创建后得到的镜像
docker run abc/def:v1
之后报错

docker: Error response from daemon: unable to find user root: no matching enteries in passwd file
ERRO[0000] error waiting for container: context canceled

请问是我使用docker的环境中root用户的问题吗?

ipv6

大神,我直接下载你编译的固件使用,发现没有dhcpV6客户端啊

luci 页面上啥都是加载中

#Dockerfile
FROM crazygit/openwrt-x86-64

EXPOSE 80

USER root

CMD /sbin/init

#docker-compose.yml
version: "2"
services:
  lede:
    build: ./build
    ports:
      - "8080:80"
    restart: unless-stopped
docker-compose logs
Attaching to lede_lede_1
lede_1  | ip: RTNETLINK answers: Operation not permitted
lede_1  | Press the [f] key and hit [enter] to enter failsafe mode
lede_1  | Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level
lede_1  | ip: can't send flush request: Operation not permitted
lede_1  | ip: SIOCSIFFLAGS: Operation not permitted

访问IP:8080 可以进入luci页面,但是无论是首页的状态页面,还是网络-接口页面,都是无限加载中“Loading view…”,在一分钟左右变成“Error
XHR request timed out”

个别页面可以打开,例如“系统-管理权”,而且交互也正常,可以成功修改密码

关于宿主机不能连接openwrt

您好,我的部署环境和您的非常接近,我是在寻找一个全插件镜像时搜到的您的仓库..

宿主机不能连接openwrt是docker的限制,官方文档中提到,由于安全限制,macvlan的container不能和host进行communicate.

不过我最终搜到了解决方案:创建一个新的虚拟网卡,做中转.
参考链接

这个结局方案是基于ifupdown(ubuntu20的默认网络管理工具升级为netplan),所以在我的环境,还需要修改ubuntu20的网络管理工具为ifupdown.

参考链接

希望能给您提供帮助

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.