用前端姿勢玩docker【三】基於nvm的前端環境構建技巧
阿新 • • 發佈:2020-07-14
### 前言
* 安裝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上