用前端姿式玩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 <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上給星前端

相關文章
相關標籤/搜索