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

牙疼哥哥發表於2020-07-13

前言

  • 安裝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 <image>:<tag>,但此模式需注意,可能會出現多個容器之間、或者容器與宿主機之間的埠衝突,臨時除錯使用一般沒啥問題。
  • 在國內直接向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
    dockerhub: https://hub.docker.com/r/pomelott/nvm-node
  • 在構建映象時若需要每次啟動容器時做一系列操作,則可通過dockerfile的COPY命令增加啟動指令碼。若只是需要定製在基礎映象中,則只需在RUN指令中新增即可。

例子

  • 基於alpine設定國內穩定源,並增加ssh功能:
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

如有幫助歡迎在github上給星

相關文章