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

相关文章
相关标签/搜索