前言

  • 安装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. TensorFlow从0到1之常量、变量和占位符详解(6)

    最基本的 TensorFlow 提供了一个库来定义和执行对张量的各种数学运算.张量,可理解为一个 n 维矩阵,所有类型的数据,包括标量.矢量和矩阵等都是特殊类型的张量.   TensorFlow 支持 ...

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

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

  3. Java基础:变量、常量、作用域

    JAVA基础:变量.常量.作用域 变量:可以变化的量.Java是强类型语言,每个变量都必须声明类型. Java变量是程序中最基本的存储单元,要素包括变量名,类型和作用域. //类变量 static s ...

  4. 【neo4j】文件管理路径、数据备份、创建新数据库、导入数据等操作记录

    neo4j一般的配置路径如下 一.备份数据 使用neo4j-admin命令. 首先,先找到数据的存储路径,然后关闭数据库. 关闭数据库的语句如下: #切换到/bin目录下 ./neo4j stop 然 ...

  5. python计算图像信息熵

    import cv2 import numpy as np import math import time def get_entropy(img_): x, y = img_.shape[0:2] ...

  6. 进度条的使用 Progress控件

    MFC编程实例二:进度条的使用 2011-03-22 09:09:09|  分类: C++(C语言) |  标签:进度  nlower  nupper  添加  mfc  |字号 订阅    本人用的 ...

  7. 线程的创建方式以及synchronize的使用

    线程的两种创建方式 继承 Thread class Thr extends Thread {    @Override    public void run() {        Thread.cur ...

  8. Using mlock ulimits for SHM_HUGETLB is deprecated

    Using mlock ulimits for SHM_HUGETLB is deprecated 前言 刚检查一个集群数据库的系统日志,发现如下信息: /var/log/message, [root ...

  9. 【秒懂Java】【02_搭建开发环境】01_Java开发必备

    这篇文章主要讲解:要想使用Java来开发软件,需要做哪些准备工作? 配置电脑 作为一名开发人员,对文件的类型.大小等信息是比较敏感的,所以建议你的电脑做2个配置: 显示文件扩展名 文件扩展名(File ...

  10. css div如何隐藏?

    在我们平时布局网站的时候,想要把div进行隐藏,但是很多人不知道css控制div显示隐藏?下面我们来讲解一下css如何让div隐藏. 1.使用display:none来隐藏div 我们可以使用disp ...