1. 程式人生 > >用前端姿勢玩docker【三】基於nvm的前端環境構建技巧

用前端姿勢玩docker【三】基於nvm的前端環境構建技巧

### 前言 * 安裝docker啥的就不說了,這裡重點強調一下,docker的環境問題。本人的環境: 虛擬機器centos => docker => NAT => container 因為需要不斷更換網路環境,如若使用橋接,需要不斷調整網絡卡的IP,使虛機與宿主機保持在同一網段,所以乾脆用了NAT,此處需要明確一下。因為每個人跑docker的環境不一樣,也就導致解決問題的方法不一定在每個環境下都靈驗。所以網上很多千篇一律的方法就要慎重選擇。 ### 製作映象時的注意事項,或坑點: * 為了更穩定的網速,建議重新配置一下DNS,在國內的話最好切一下docker的源,國內比較穩定的有阿里,網易,中科大等,docker通過設定`/etc/docker/daemon.json`,新增對應的源欄位即可。 ``` { "dns": ["8.8.8.8", "114.114.114.114"], "registry-mirrors": ["http://f42ebfb9.m.daocloud.io"] } ``` * 其次,基於不同的基礎映象,使用的包管理工具也不盡相同,debian、ubuntu系: apt-get(基於dpkg),redhat、centos系:yum(基於rpm),alpine系: apk。這點新手可能比較迷惑。可翻閱我之前的linux文章。 * 自己在本地嘗試使用 `docker build` 測試製作結果時,很容易出的問題就是網路不通。如果嘗試以上兩種方法仍不能解決則可使用宿主機網路模式進行:`docker build -t imageName:tag --network=host .` * 在本機嘗試執行容器時,容器網路無法訪問外網,可有以下兩種方法解決: 1. 為容器建立橋接網絡卡,並匹配至同一網段內。 2. 使用宿主機模式執行容器 `docker run -it --net=host :`,但此模式需注意,可能會出現多個容器之間、或者容器與宿主機之間的埠衝突,臨時除錯使用一般沒啥問題。 * 在國內直接向dockerhub上push自己的映象大概率會失敗,此處有一個技巧就是利用github與dockerhub相關聯,利用github的push自動在dockerhub遠端構建,當然,建立一個本地伺服器用於存放也很OK。 * 在使用 ubuntu類的基礎映象時,因其sh命令是基於dash,所以如果想使用bash執行sh命令,可通過以下兩種方式 1. 利用bash執行sh指令碼 `/bin/bash -c /home/start.sh` 2. 在指令碼中設定bash頭 `#!/bin/bash` * 若想基於alpine定製不同版本的node映象,則只能通過開啟不同版本的容器來達到目的,一個alpine容器中只能安裝最新版本的node(至少我目前無法解決,不過apk的包管理器個人感覺是真的好用!),alpine+busybox的架構設計與傳統linux不同,若想實現nvm管理多版本node的同時,還想滿足映象小巧的要求,則debian或ubuntu是比較好的選擇。以下有個自己的例子可以參考: github:[https://github.com/pomelott/docker-nvm-node](https://github.com/pomelott/docker-nvm-node) dockerhub: [https://hub.docker.com/r/pomelott/nvm-node](https://hub.docker.com/r/pomelott/nvm-node) * 在構建映象時若需要每次啟動容器時做一系列操作,則可通過dockerfile的COPY命令增加啟動指令碼。若只是需要定製在基礎映象中,則只需在RUN指令中新增即可。 ### 例子 * 基於alpine設定國內穩定源,並增加ssh功能: ```shell FROM alpine:3.12 RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories \ && echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories \ && echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf \ RUN apk update && apk upgrade && \ apk add --no-cache openssh tzdata && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config && \ ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key && \ ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key && \ ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key && \ ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key && \ echo "root:admin" | chpasswd EXPOSE 22 ``` * 在構建前端基礎映象時候,多需要nvm+node+yarn+nrm的基礎環境,此處給兩套基於不同基礎映象的node映象做參考: 基於ubuntu:20.04: github:[https://github.com/pomelott/docker-nvm-node](https://github.com/pomelott/docker-nvm-node) dockerhub: [https://hub.docker.com/r/pomelott/nvm-node](https://hub.docker.com/r/pomelott/nvm-node) 基於alpine:3.12: github: [https://github.com/pomelott/alpine-node-slim](https://github.com/pomelott/alpine-node-slim) dockerhub: [https://hub.docker.com/r/pomelott/alpine-node](https://hub.docker.com/r/pomelott/alpine-node) **如有幫助歡迎在github上