需求
根據(jù)客戶需求,要在離線環(huán)境開發(fā)部署基于React的應(yīng)用。由于:
- 開發(fā)主環(huán)境為離線Windows
- 生產(chǎn)環(huán)境離線且尚不明確
- node.js應(yīng)用移植成本
決定采用Docker,在聯(lián)網(wǎng)環(huán)境下配置React后攜帶入開發(fā)環(huán)境。
過程
Docker
1. 安裝Docker
家里是Win10環(huán)境,半年前已經(jīng)安裝了Docker。
Docker在Win10上的安裝可以參考官網(wǎng)解決方案 Docker Desktop for Windows 。
(然而其實質(zhì)。。。就是裝了一個VirtualBox里安裝的Linux虛擬機(jī),在里面裝Docker。)
常規(guī)解決方案:
Docker官網(wǎng)
Docker Desktop for Mac
Docker Desktop for Windows
Win7/8可能需要更多操作:Windows Docker 安裝-菜鳥教程
這部分坑是最多的,可惜時間太久已經(jīng)忘記了。
2. Docker檢查和配置
檢查Docker版本:
docker -v
配置Docker鏡像:
由于眾所周知的原因,需要配置鏡像加速器。
系統(tǒng)右下角 Docker 圖標(biāo)內(nèi)右鍵菜單 Settings,窗口里Daemon標(biāo)簽頁內(nèi)配置json:

Docker+React
1. Node.js
使用Node官方鏡像為基礎(chǔ)搭建
查看node官方鏡像
或
docker search node
拉取最新版本的node鏡像:
docker pull node:latest
查看本地鏡像:
docker image
運行容器:
docker run -itd --name node-test node
進(jìn)入容器并查看node和npm版本
docker exec -it node-test /bin/bash
$ node -v
$ npm -v
另外,(由于眾所周知的原因,需要配置鏡像加速器)* 2
使用cnpm或給npm配置淘寶鏡像:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
$ npm config set registry https://registry.npm.taobao.org
2. 創(chuàng)建react應(yīng)用
來到了常見的create-react-app環(huán)節(jié)
$ cnpm install -g create-react-app
$ cd /usr/src
$ create-react-app my-app
$ cd my-app/
啟動應(yīng)用:
$ npm start
成功運行應(yīng)用,然而在瀏覽器里并不能看到。容器的端口并沒有和主機(jī)綁定。
查看運行中容器狀態(tài):
docker ps
查看容器端口綁定
docker port [容器id或容器name]
保存一下鏡像并創(chuàng)建容器綁定端口:
docker stop [舊容器]
docker commit [舊容器] [新鏡像名]:[tag名]
docker run --name [新容器] -p 3000:3000 [新鏡像名]:[tag名]
重新開啟應(yīng)用:
docker exec -it [容器] /bin/bash
$ cd /usr/src
$ cd my-app/
$ npm start

3. VSCode+Docker
VSCode是真的香。。。

我用的第一個。

能看到當(dāng)前鏡像和容器。容器上右鍵可以Attach Visual Studio Code。
然后容器就停了。。。。
docker容器運行必須有一個前臺進(jìn)程, 如果沒有前臺進(jìn)程執(zhí)行,容器認(rèn)為空閑,就會自行退出。Attach Visual Studio Code使用的是attach命令,就是使用現(xiàn)有終端,如果你要退出容器操作,那么bash結(jié)束,容器也就退出了。
docker run --name [新容器] -p 3000:3000 -d [新鏡像名]:[tag名] /bin/sh -c "while true; do echo hello world; sleep 1; done"
重新創(chuàng)建容器,加了持續(xù)運行進(jìn)程。

這樣就差不多完成了。
另:這樣實際上是把node_module安裝在了容器里,方便移植拷貝。實際上,為了提升容器運行速度,應(yīng)該將node放在主機(jī)上。參考How to create-react-app with Docker