用前端姿势玩docker【三】基于nvm的前端环境构建技巧
2020-07-13 21:39
621 查看
前言
- 安装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 .
- 在本机尝试运行容器时,容器网络无法访问外网,可有以下两种方法解决:
-
为容器创建桥接网卡,并匹配至同一网段内。
- 使用宿主机模式运行容器
docker run -it --net=host <image>:<tag>
,但此模式需注意,可能会出现多个容器之间、或者容器与宿主机之间的端口冲突,临时调试使用一般没啥问题。 - 在国内直接向dockerhub上push自己的镜像大概率会失败,此处有一个技巧就是利用github与dockerhub相关联,利用github的push自动在dockerhub远程构建,当然,创建一个本地服务器用于存放也很OK。
- 在使用 ubuntu类的基础镜像时,因其sh命令是基于dash,所以如果想使用bash执行sh命令,可通过以下两种方式
-
利用bash执行sh脚本
/bin/bash -c /home/start.sh
- 在脚本中设置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
- 在构建前端基础镜像时候,多需要nvm+node+yarn+nrm的基础环境,此处给两套基于不同基础镜像的node镜像做参考:
基于ubuntu:20.04:
github:https://github.com/pomelott/docker-nvm-node
dockerhub: https://hub.docker.com/r/pomelott/nvm-node
基于alpine:3.12:
github: https://github.com/pomelott/alpine-node-slim
dockerhub: https://hub.docker.com/r/pomelott/alpine-node
如有帮助欢迎在github上给星
相关文章推荐
- 基于Docker构建PHP开发环境
- Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
- 【转】基于 Docker/Qemu 快速构建 Linux 内核实验环境
- [置顶] 基于Dockerfile构建LNMP环境(php7+mysql+nginx) --原创
- [授权发表]基于 Docker 快速构建 Linux 0.11 实验环境
- 基于openvswitch+Docker构建SDN网络测试环境 (使用ovs-docker进行构建)
- 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
- 在Windows中构建基于Docker的一致性开发环境
- 构建基于 Docker + Jenkins + Sahi 的 Web UI 自动化测试环境
- 二、基于kubernetes构建Docker集群环境实战
- 基于gitlab和docker构建持续集成环境(一)
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
- 用dockerfile构建基于ubuntu的lnmp环境的镜像
- 基于gitlab和docker构建持续集成环境(三)
- Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
- 基于Docker搭建Mycat环境实现Mysql数据库的读写分离
- 基于 CentOS 的 Docker LNMP 集成开发环境
- Docker环境搭建Jenkins在构建任务时控制台日志出现中文乱码的问题
- 使用 WebSphere Portlet Factory 构建基于 Web2.0 的灵活 SOA 前端