前言

  • 安装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上给星

用前端姿势玩docker【三】基于nvm的前端环境构建技巧的更多相关文章

  1. 用前端姿势玩docker【四】基于docker快速构建webpack的开发与生产环境

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  2. 用前端姿势玩docker【五】快速构建中类Unix系统与Windows系统的差异化处理

    目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...

  3. 用前端姿势玩docker【一】Docker通俗理解常用功能汇总与操作埋坑

    前言 首先一句话表达个人对docker的理解:与传统虚拟技术基于硬件及物理资源的虚拟化相比,Docker更加轻量化,docker为基于操作系统或内核级别的虚拟化,并且提供了从各种机制与操作以满足从开发 ...

  4. 用前端姿势玩docker【二】dockerfile定制镜像初体验

    前言 书接上文,关于dockerfile指令的api在此处不做赘述,在此只是记录下注意事项: '示坑以埋之'. 配置指令 FROM dockerfile必须以此开头 一个dockerfile可执行添加 ...

  5. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  6. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  7. 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、Git/SVN)

    一. 各类概念和指令介绍 1. NVM (1).  全称:Node Version Manager,是一款针对Nodejs的版本管理工具,由于Node的版本很多,很多时候我要需要依赖多个版本,并且要求 ...

  8. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  9. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

随机推荐

  1. pip未找到

    命令终端运行 sudo easy_install pip 安装成功后最后会显示 Installed /Library/Python/2.7/site-packages/pip-9.0.1-py2.7. ...

  2. Java8新特性之流stream

    <Java 8 实战>学习笔记系列 定义 流是Java API的新成员,它允许你以声明性方式处理数据集合,可以把它看成遍历数据集的高级迭代器 示例 List<String> t ...

  3. GeckoDriver+Selenium+Python的安装和使用

    如果没有安装GeckoDriver会提示: selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executab ...

  4. docker镜像瘦身思路

    docker镜像瘦身思路 一.简介 docker镜像太大,带来了以下几个问题: 存储开销 这块影响其实不算很大,因为对服务器磁盘来说,15GB的存储空间并不算大,除非用户服务器的磁盘空间很紧张 部署时 ...

  5. 手把手教你学Numpy,搞定数据处理——收官篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分. 数组的持久化 在我们做机器学习模型的研究或者是学习的时候,在完成 ...

  6. 想学好Python,你必须了解Python中的35个关键词

    每种编程语言都会有一些特殊的单词,称为关键词.对待关键词的基本要求是,你在命名的时候要避免与之重复.本文将介绍一下Python中的关键词.关键词不是内置函数或者内置对象类型,虽然在命名的时候同样也最好 ...

  7. Scrapy框架简介及小项目应用

    今天来总结一下Scrapy框架的用法.scrapy的架构如下: Engine  :引擎,处理整个系统的数据流处理.触发事务,是整个框架的核心. Items :项目,它定义了爬取结果的数据结构,爬取的数 ...

  8. jquery入门(1)

    1.jQuery简介 jQuery是一个快速.简洁的JavaScript框架,倡导写更少的代码,做更多的事情 jquery官方网站 jquery中文文档 1.1.简单函数封装 根据id.类名称来获取元 ...

  9. javaScript的三种储存方式

    (一).SessionStorage     会话储存 (二).localStorage           本地储存 (三).Cookier                   现实中为:饼干    ...

  10. Java工具类——数学相关的类

    Java工具类--数学相关的类 在上一篇文章中,我们系统学习了 Java 里面的包装类,那么这篇文章,我们就来学习一下Java提供好的类--数学相关的类. 一.数学类介绍 在最早期学习 Java 基础 ...