├── .dockerignore ├── .github └── workflows │ └── build.yml ├── Dockerfile ├── README.md ├── build.sh └── screenshots ├── openwrt_login.png ├── step1.png ├── step2.png ├── step3.png ├── step4.png └── step5.png /.dockerignore: -------------------------------------------------------------------------------- 1 | screenshots 2 | build.sh 3 | README.md 4 | .github 5 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build OpenWrt Docker x86-64 image 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | paths: 8 | - ".github/workflows/build.yml" 9 | 10 | env: 11 | FIRMWARE_URL: "https://downloads.openwrt.org/releases/19.07.2/targets/x86/64/openwrt-19.07.2-x86-64-generic-rootfs.tar.gz" 12 | REPOSITORY: crazygit/openwrt-x86-64 13 | TAG: 19.07.2 14 | 15 | jobs: 16 | build: 17 | name: "Build OpenWrt docker image" 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@master 22 | 23 | - name: Download Firmware 24 | run: | 25 | wget $FIRMWARE_URL -O openwrt.tar.gz 26 | 27 | - name: Publish to Registry 28 | uses: elgohr/Publish-Docker-Github-Action@master 29 | env: 30 | FIRMWARE: openwrt.tar.gz 31 | with: 32 | name: ${{ env.REPOSITORY }} 33 | username: ${{ secrets.DOCKER_USERNAME }} 34 | password: ${{ secrets.DOCKER_TOKEN }} 35 | buildargs: FIRMWARE 36 | tags: "latest,${{ env.TAG }}" 37 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM scratch 2 | 3 | LABEL maintainer=Crazygit 4 | LABEL homepage="https://github.com/crazygit/openwrt-x86-64" 5 | 6 | ARG FIRMWARE 7 | # FIRMWARE 使用远程的URL地址的.tar.gz包时不会自动解压,因此只能添加本地文件 8 | ADD ${FIRMWARE} / 9 | 10 | EXPOSE 80 11 | USER root 12 | # using exec format so that /sbin/init is proc 1 (see procd docs) 13 | CMD ["/sbin/init"] 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Build OpenWrt Docker x86-64 image](https://github.com/crazygit/openwrt-x86-64/workflows/Build%20OpenWrt%20Docker%20x86-64%20image/badge.svg?branch=master) 2 | 3 | [toc] 4 | 5 | # OpenWrt Docker镜像构建 6 | 7 | 为了在Docker中运行OpenWrt系统,我们需要用到OpenWrt的docker镜像,网上有很多人分享已经制作好的镜像。但是,每个人都有自己不同的需求,自己学会制作镜像就显得特别重要了。 8 | 9 | 10 | 其实使用OpenWrt的固件, 可以很方便的构建Docker镜像,这里的固件不光是官方固件,也可以是经过自己定制编译生成的固件。 11 | 12 | ## 直接使用 13 | 14 | 如果你只想下载并使用,不关心构建流程,那么你可以直接用下面的命令,并参考后面镜像使用配置部分了解如何使用镜像 15 | 16 | ```bash 17 | # 下载镜像 18 | $ docker pull crazygit/openwrt-x86-64 19 | 20 | # 查看镜像信息 21 | $ docker run --rm crazygit/openwrt-x86-64 cat /etc/banner 22 | _______ ________ __ 23 | | |.-----.-----.-----.| | | |.----.| |_ 24 | | - || _ | -__| || | | || _|| _| 25 | |_______|| __|_____|__|__||________||__| |____| 26 | |__| W I R E L E S S F R E E D O M 27 | ----------------------------------------------------- 28 | OpenWrt 19.07.2, r10947-65030d81f3 29 | ----------------------------------------------------- 30 | ``` 31 | 32 | 如果觉得官网镜像功能太简单,也可以用我编译的Lean'S大神的OpenWrt固件 33 | 34 | 35 | 36 | ## 镜像使用配置 37 | 38 | 镜像的使用可以参考下面两篇文章的方式进行配置,两位都做了非常详细的描述。 39 | 40 | * [在Docker 中运行 OpenWrt 旁路网关](https://mlapp.cn/376.html) 41 | * [Docker上运行Lean大源码编译的OpenWRT](https://openwrt.club/93.html) 42 | 43 | 同样,如果觉得手动配置比较麻烦,可以使用我整理好使用`docker-compose`的一键拉起服务文件 44 | 45 | 46 | 47 | 这里主要描述下本人的手动配置方式 48 | 49 | 首先说说我的使用场景: 50 | 51 | 我是在宿主机上通过`Docker`运行`OpenWrt`系统,使用它作为旁路由 52 | 53 | * 宿主机操作系统: `Ubuntu 18.04.4 LTS` 54 | * 宿主机IP: `192.168.2.125` 55 | * 硬路由IP: `192.168.2.1` 56 | * 分配给OpenWrt系统的IP: `192.168.2.126` 57 | 58 | 1. 获取网卡名称, 我的网卡名称是`enp3s0` 59 | ```bash 60 | $ ifconfig 61 | br-df8369127cee: flags=4099 mtu 1500 62 | inet 172.21.0.1 netmask 255.255.0.0 broadcast 172.21.255.255 63 | ether 02:42:12:cd:c6:2c txqueuelen 0 (Ethernet) 64 | RX packets 0 bytes 0 (0.0 B) 65 | RX errors 0 dropped 0 overruns 0 frame 0 66 | TX packets 0 bytes 0 (0.0 B) 67 | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 68 | 69 | docker0: flags=4099 mtu 1500 70 | inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 71 | ether 02:42:18:57:96:e1 txqueuelen 0 (Ethernet) 72 | RX packets 0 bytes 0 (0.0 B) 73 | RX errors 0 dropped 0 overruns 0 frame 0 74 | TX packets 0 bytes 0 (0.0 B) 75 | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 76 | 77 | enp3s0: flags=4163 mtu 1500 78 | inet 192.168.2.125 netmask 255.255.255.0 broadcast 192.168.2.255 79 | inet6 fe80::2e56:dcff:fe3c:548a prefixlen 64 scopeid 0x20 80 | ether 2c:56:dc:3c:54:8a txqueuelen 1000 (Ethernet) 81 | RX packets 2099 bytes 2435262 (2.4 MB) 82 | RX errors 0 dropped 0 overruns 0 frame 0 83 | TX packets 1149 bytes 104504 (104.5 KB) 84 | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 85 | 86 | lo: flags=73 mtu 65536 87 | inet 127.0.0.1 netmask 255.0.0.0 88 | inet6 ::1 prefixlen 128 scopeid 0x10 89 | loop txqueuelen 1000 (Local Loopback) 90 | RX packets 110 bytes 9098 (9.0 KB) 91 | RX errors 0 dropped 0 overruns 0 frame 0 92 | TX packets 110 bytes 9098 (9.0 KB) 93 | TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 94 | ``` 95 | 96 | 2. 开启宿主机网卡混杂模式(可选) 97 | 98 | ```bash 99 | # 网卡名称enp3s0用你自己上一步获取到的 100 | $ sudo ip link set enp3s0 promisc on 101 | ``` 102 | 103 | 3. 为`docker`创建`macvlan`模式的虚拟网络 104 | 105 | 子网`--subnet`和网关`--gateway`,以及`parent=enp3s0`网卡名称根据实际情况做调整 106 | 107 | ```bash 108 | $ docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=enp3s0 openwrt-LAN 109 | 110 | # 查看创建的虚拟网络 111 | $ docker network ls |grep openwrt-LAN 112 | 21dcddacc389 openwrt-LAN macvlan local 113 | ``` 114 | 115 | 4. 启动容器 116 | 117 | ```bash 118 | # --network使用第4步创建的虚拟网络 119 | $ docker run --restart always --name openwrt -d --network openwrt-LAN --privileged crazygit/openwrt-x86-64 120 | 121 | # 查看启动的容器 122 | $ docker ps -a 123 | ``` 124 | 125 | 5. 进入容器,修改网络配置文件并重启网络 126 | 127 | 进入容器并修改`etc/config/network`文件 128 | 129 | ```bash 130 | $ docker exec -it openwrt /bin/sh 131 | $ vi /etc/config/network 132 | ``` 133 | 编辑`lan`口的配置如下,有些参数默认的文件里可能没有,按照下面的格式添加上即可 134 | ``` 135 | config interface 'lan' 136 | option type 'bridge' 137 | option ifname 'eth0' 138 | option proto 'static' 139 | option ipaddr '192.168.2.126' 140 | option netmask '255.255.255.0' 141 | option gateway '192.168.2.1' 142 | option dns '192.168.2.1' 143 | option broadcast '192.168.2.255' 144 | option ip6assign '60' 145 | ``` 146 | 上面的参数根据自身的情况调整 147 | * `proto`设置使用静态分配IP地址的方式`static` 148 | * `ipaddr`为OpenWrt系统分配的静态IP,这里我分配的是`192.168.2.126`(注意: 这个IP地址不要与你本地网络已有的IP地址冲突) 149 | * `netmask`为子网掩码`255.255.255.0` 150 | * `gateway`为路由器(硬路由)的网关,通常就是你访问路由器的IP地址,这里我是`192.168.2.1` 151 | * `dns`为`DNS`服务器的地址,可以是运营商的地址,比如`114.114.114.114`,这里我直接用的路由器的地址`192.168.2.1` 152 | * `broadcast`为广播地址`192.168.2.255` 153 | 154 | 重启网络 155 | 156 | ```bash 157 | $ /etc/init.d/network restart 158 | ``` 159 | 6. 宿主机网络修复(**目前不生效**) 160 | 161 | 如上配置后,通过宿主机没法直接访问OpenWrt系统的网络,参考 162 | [将OpenWRT作为宿主机的网关 163 | ](https://openwrt.club/93.html#scroll-6) 164 | 165 | 里的方法,使用如下脚本修复网络,**但是不生效**(希望知道的大神不吝赐教)。不过使用局域网的其他设备可以正常访问OpenWrt系统 166 | 167 | ```bash 168 | #根据实际情况修改下面两个变量 169 | # 网卡名称 170 | card="enp3s0" 171 | # OpenWrt系统的IP地址 172 | openwrt_gateway="192.168.2.126" 173 | 174 | sudo ip link add link $card vLAN type macvlan mode bridge 175 | sudo ip addr add 192.168.2.253/24 brd + dev vLAN 176 | sudo ip link set vLAN up 177 | sudo ip route del default 178 | sudo ip route add default via $openwrt_gateway dev vLAN 179 | 180 | #设置宿主机的dns服务器为OpenWRT 181 | echo "nameserver $openwrt_gateway" |sudo tee /etc/resolv.conf 182 | ``` 183 | 184 | 7. 验收成果 185 | 186 | 如第7步所介绍的,我们暂时没有办法直接从宿主机访问OpenWrt,只有借助局域网其他设备上的浏览器,打开OpenWrt系统 187 | 188 | 189 | 190 | 我使用的是官方固件,初始密码默认为空,其他固件的初始密码视具体的固件而定了 191 | 192 | ![openwet login](screenshots/openwrt_login.png) 193 | 194 | 剩下的就是openWrt系统的常规使用和配置,这里就不再详述了 195 | 196 | ## 手动构建 197 | 198 | 如果你对自己构建感兴趣,可以继续看下去 199 | 200 | ### 使用官方固件 201 | 202 | 这里以`x86-64`平台为例 203 | 204 | 首先获取获取固件的下载地址 205 | 206 | 1. 打开[官网](https://downloads.openwrt.org/),选择当前最新的稳定版本`19.07.2` 207 | ![step1](screenshots/step1.png) 208 | 2. 选择`x86`平台 209 | ![step2](screenshots/step2.png) 210 | 3. 选择`64`位 211 | ![step3](screenshots/step3.png) 212 | 4. 选择固件`generic-rootfs.tar.gz` 213 | ![step4](screenshots/step4.png) 214 | 5. 鼠标右键点击"复制链接地址"获取到固件的下载地址,第6步会用到 215 | ![step5](screenshots/step5.png) 216 | 6. 构建镜像 217 | 218 | ```bash 219 | $ git clone https://github.com/crazygit/openwrt-x86-64.git openwrt-x86-64 220 | $ cd openwrt-x86-64 221 | # 参数1: 第5步中获取的固件下载地址 222 | # 参数2: docker镜像的名字,可以随便指定: 如crazygit/openwrt-x86-64 223 | $ ./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 224 | ``` 225 | 226 | ### 构建自己的镜像 227 | 228 | 1. 编译自己的固件,可以参考: 229 | 230 | https://github.com/crazygit/Actions-OpenWrt 231 | 232 | 2. 下载本库 233 | 234 | ```bash 235 | $ git clone https://github.com/crazygit/openwrt-x86-64.git openwrt-x86-64 236 | ``` 237 | 3. 拷贝自己的固件到`Dockerfile`文件所在的目录,固件文件名后缀应该是`.tar.gz`的 238 | 239 | ```bash 240 | $ cd openwrt-x86-64 241 | $ cp /path/to/your/firmware.tar.gz openwrt.tar.gz 242 | ``` 243 | 244 | 4. 编译镜像 245 | 246 | ```bash 247 | # -t后面为镜像的名字,可以随便指定: 如: crazygit/openwrt-x86-64 248 | $ docker build . --build-arg FIRMWARE=openwrt.tar.gz -t crazygit/openwrt-x86-64 249 | ``` 250 | 251 | ## 使用Github Action自动构建 252 | 253 | 1. Fork当前仓库 254 | 2. 在项目`Settings->Secrets`里配置你的docker hub账户的用户名和密码`DOCKER_USERNAME`和`DOCKER_TOKEN` 255 | 3. 在docker hub上创建你在一个仓库来存放编译的镜像 256 | 4. 根据自己的情况修改`.github/workflows/build.yml`文件中的如下环境变量 257 | 258 | ```yaml 259 | env: 260 | FIRMWARE_URL: "https://downloads.openwrt.org/releases/19.07.2/targets/x86/64/openwrt-19.07.2-x86-64-generic-rootfs.tar.gz" 261 | REPOSITORY: crazygit/openwrt-x86-64 262 | TAG: 19.07.2 263 | ``` 264 | 5. 提交修改之后,github action会自动编译镜像并将镜像push到你的docker hub账户中指定的仓库里 265 | 266 | ### 验证镜像 267 | 268 | 下面的命令注意替换镜像名字`crazygit/openwrt-x86-64`为你自己编译时使用的名字 269 | 270 | 1. 查看编译的镜像 271 | 272 | ``` 273 | $ docker image ls |grep crazygit/openwrt-x86-64 274 | crazygit/openwrt-x86-64 latest 07f578cefd53 12 minutes ago 9.43MB 275 | ``` 276 | 277 | 2. 验证镜像是否正常 278 | 279 | ```bash 280 | $ docker run --rm crazygit/openwrt-x86-64 cat /etc/banner 281 | _______ ________ __ 282 | | |.-----.-----.-----.| | | |.----.| |_ 283 | | - || _ | -__| || | | || _|| _| 284 | |_______|| __|_____|__|__||________||__| |____| 285 | |__| W I R E L E S S F R E E D O M 286 | ----------------------------------------------------- 287 | OpenWrt 19.07.2, r10947-65030d81f3 288 | ----------------------------------------------------- 289 | ``` 290 | 291 | ## 参考 292 | 293 | 本文构建过程参考自: 294 | 295 | 296 | 297 | 备注: 官网中的`Dockerfile`示例有一处错误是 298 | 299 | ``` 300 | ADD https://downloads.openwrt.org/chaos_calmer/15.05/x86/generic/openwrt-15.05-x86-generic-Generic-rootfs.tar.gz / 301 | ``` 302 | 上面的语句是无效的,因为`ADD`指令只有在添加本地的`.tar.gz`文件时才会自动解压,添加`URL`时不会自动解压。建议使用本仓库的构建方式。 303 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | wget $1 -O openwrt.tar.gz 3 | docker build . --build-arg FIRMWARE=openwrt.tar.gz -t $2 4 | -------------------------------------------------------------------------------- /screenshots/openwrt_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazygit/openwrt-x86-64/d4ec20bd6e6eab0c1e2d36df69f24066eb974039/screenshots/openwrt_login.png -------------------------------------------------------------------------------- /screenshots/step1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazygit/openwrt-x86-64/d4ec20bd6e6eab0c1e2d36df69f24066eb974039/screenshots/step1.png -------------------------------------------------------------------------------- /screenshots/step2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazygit/openwrt-x86-64/d4ec20bd6e6eab0c1e2d36df69f24066eb974039/screenshots/step2.png -------------------------------------------------------------------------------- /screenshots/step3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazygit/openwrt-x86-64/d4ec20bd6e6eab0c1e2d36df69f24066eb974039/screenshots/step3.png -------------------------------------------------------------------------------- /screenshots/step4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazygit/openwrt-x86-64/d4ec20bd6e6eab0c1e2d36df69f24066eb974039/screenshots/step4.png -------------------------------------------------------------------------------- /screenshots/step5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazygit/openwrt-x86-64/d4ec20bd6e6eab0c1e2d36df69f24066eb974039/screenshots/step5.png --------------------------------------------------------------------------------