最近在学习Node.js相关知识,在环境搭建上耗费了不少功夫,故此把这个过程写下来同大家分享一下,今天我先来介绍一下Docker,有很多人都写过相关知识,还有一些教程,在此我只想写一下,我的学习过程中用到的一些知识和注意点。

  玩过虚拟机的同学可能对Docker学习和理解就会快一点,至于Docker是什么,我就引用其官网的一句话吧:Docker is an open platform for building, shipping and running distributed applications. It gives programmers, development teams and operations engineers the common toolbox they need to take advantage of the distributed and networked nature of modern applications.

  毕竟刚开始学习,对其理解可能并不完整,或者比较片面,在此我也不做过多解释,想进一步了解的可以到其官网维基此处去深入了解,下面我就开始介绍具体的使用方法:

  我的开发环境是Centos 7、64位,当然,用其他Linux发行版都是可以的,当然Windows也是可以的,但要注意,不管是什么操作系统,64位是必须的

  第一部分:安装Docker

  在其官方文档有详细的介绍,包括各种环境下的安装在这里我们采用简单办法:

 sudo yum install docker

  注意:在启动Docker之后启动firewalld,需要重启Docker。

  第二步部分:使用Docker(镜像和容器)

  至于Docker相关的其他概念(包括镜像、容器等)在此不做过多介绍,读者可到其官方文档去了解,我们现在直接使用镜像来新建一个测试容器:

sudo docker run -it --name ubuntu-test --rm ubuntu:latest /bin/bash

  此时我们就进入了一个终端(其中-i表示可对容器内的stdin交互,-t表示在新容器内制定一个终端,--rm表示结束使用后删除容器,--name为容器取名字),使用ls命令查看则发现此时正处于ubuntu环境下的根目录:

root@9ae27b8ba1aa:/# ls -al
total
drwxr-xr-x. root root Jul : .
drwxr-xr-x. root root Jul : ..
-rwxr-xr-x. root root Jul : .dockerenv
-rwxr-xr-x. root root Jul : .dockerinit
drwxr-xr-x. root root Jun : bin
drwxr-xr-x. root root Apr boot
drwxr-xr-x. root root Jul : dev
drwxr-xr-x. root root Jul : etc
drwxr-xr-x. root root Apr home
drwxr-xr-x. root root Jun : lib
drwxr-xr-x. root root Jun : lib64
drwxr-xr-x. root root Jun : media
drwxr-xr-x. root root Apr mnt
drwxr-xr-x. root root Jun : opt
dr-xr-xr-x. root root Jul : proc
drwx------. root root Jun : root
drwxr-xr-x. root root Jul : run
drwxr-xr-x. root root Jul : sbin
drwxr-xr-x. root root Jun : srv
dr-xr-xr-x. root root Jul : sys
drwxrwxrwt. root root Jun : tmp
drwxr-xr-x. root root Jul : usr
drwxr-xr-x. root root Jul : var

  我们可以查看此基础镜像的Dockerfile来了解此镜像的基础环境(Dockerfile相关知识可到此处学习)。

  我们同样可通过编写Dockerfile来定制镜像通过:

sudo docker build -t you/image_name .

  来生成镜像(-t参数表示为镜像打上标签tag即取名字,结尾的"."不可忽略,表示默认build当前目录下的Dockerfile),通过:

sudo docker images -a

  查看当前系统中所有镜像,通过:

sudo docker ps -a

  查看当前系统中的所有容器(包括使用中的或已停止的容器)。

  第三部分:容器连接

  新建容器ubuntu-test-1:

sudo docker run -it --rm --name ubuntu-test- ubuntu:latest /bin/bash

  进入容器后不要退出,新建命令行窗口输入以下命令建立容器ubuntu-test-2并连接ubuntu-test-1:

sudo docker run -it --rm --name ubuntu-test- --link ubuntu-test-:ubuntu-test-link ubuntu:latest /bin/bash

  此时可在容器ubuntu-test-2终端查看hosts文件配置:

root@0d94c356592b:/# cat /etc/hosts
172.17.0.122 0d94c356592b
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.121 ubuntu-test-link 56fc1ce507f1 ubuntu-test-

  注意看最后一行,两容器已建立连接(此时2可以访问1,建立父/子容器关系,容器间的连接不需要向外部暴露任何端口)。

  第四部分:容器数据管理

  很明显,当我们使用这么一个工具时不免去思考一些数据存储上的问题,比如容器中的数据存储在哪?容器中的数据是否是持久存储?容器中的数据与本机数据的关系?容器是否能与宿主机或者其他容器共享数据?······

容器的数据管理我们要用到数据卷的概念, 我们还要了解Docker的联合文件系统,在使用docker run命令的时候可以使用-v参数来关在数据卷到容器中(在Dockerfile中可使用VOLUME属性实现同样功能),也可挂在本地目录到容器中,如命令:

sudo docker run -it --rm  -v /opt/myproject:/opt/yourproject --name ubuntu-test- --link ubuntu-test-:ubuntu-test-link ubuntu:latest /bin/bash

表示将本机/opt/myproject目录挂载到容器的/opt/yourproject(Dockerfile中无法实现此功能,很明显每个主机的/opt/myproject这个目录不是所有主机上都有的,而Dockerfile是分享给所有人用的)。

  挂载本地目录后的权限问题,如果不指定用户容器中默认使用root用户,其用用户ID和用户组号都是0,本地如果使用其他用户,那么宿主机和容器内访问同一目录的用户必须拥有相同的ID号和组号;另外还有就是SELinux的权限问题(可参考上一篇博客),同样要保证容器内和宿主机目录的身份标识(Identify)、角色(Role)以及类型(Type),尤其是类型要相同,通过以下方法查询这三个特性:

root@56fc1ce507f1:/# ls -ldZ
drwxr-xr-x. root root system_u:object_r:svirt_sandbox_file_t:s0:c739,c876 Jul : .

可通过:

# chcon -R unconfined_u:object_r:user_home_t:s0 

来修改其属性,只用这两个方面都保证了,容器中才可正常访问挂载的数据卷。可通过:

sudo docker logs ubuntu-test-

的方式查看当前容器中日志输出情况,容器启动失败会打出相应日志,以此来排错。

  除此之外还可使用数据卷容器来实现数据的持久存储,以及备份,迁移等,可参考Docker--从入门到实践.

  当然Docker的内容还有很多,如网络配置、底层实现、Dockerfile以及一些项目的使用,已有的资源也相当多了,想深入了解的可以到其官方文档和一些中文文档去学习,次数关于Docker的内容暂时介绍到这儿,在实际搭建环境的时候还有一些其他问题,留到下次继续分享吧!

参考:1.http://dockerpool.com/static/books/docker_practice/index.html

   2.https://docs.docker.com/

      3.https://www.docker.com/

  

Docker学习之——Node.js+MongoDB+Nginx环境搭建(一)的更多相关文章

  1. node.js之开发环境搭建

    一.安装linux系统 (已安装linux可跳此步骤) 虚拟机推荐选择:VirtualBox 或者 Vmware (专业版永久激活码:5A02H-AU243-TZJ49-GTC7K-3C61N) 我这 ...

  2. 《Node.js入门》CentOS 6.5下Node.js Web开发环境搭建笔记

    近期想尝试一下英特尔的基于WebRTC协同通信开发套件,所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是CentOS 下的搭建方法.使用Windows的小伙伴请參考: <No ...

  3. 树莓派.安装系统+Node.js+MongoDB系列环境

    1.先去树莓派官网下载最新的ROM https://www.raspberrypi.org/downloads/raspbian/ 这里选的是: RASPBIAN JESSIE WITH DESKTO ...

  4. 如何用Docker建立一个Node.js的开发环境

      建立一个文件夹 用管理员身份打开powershell. 在文件夹下面运行npm init, 根据提示填入信息,以便产生一个package.json文件. 在文件中加入需要的dependencies ...

  5. Windows 7下Node.js Web开发环境搭建笔记

    Node.js是什么? 我们看看百科里怎么说的?JavaScript是一种运行在浏览器的脚本,它简单,轻巧,易于编辑,这种脚本通常用于浏览器的前端编程,但是一位开发者Ryan有一天发现这种前端式的脚本 ...

  6. node.js+ react + redux 环境搭建

    1.安装node.js 2. yarn init: 初始化,主要包含以下条目 name: 项目名 version: 版本号 description: 项目简要描述 entry point: 文件入口, ...

  7. node.js vue开发环境搭建

    开发工具安装 1.安装node.js 双击安装程序 node-v8.9.3-x64.msi,进行安装即可 2.设置taobao镜像 npm config set registry https://re ...

  8. Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建

    前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...

  9. 8 步搭建 Node.js + MongoDB 项目的自动化持续集成

    任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...

随机推荐

  1. PC高级语言与施耐德、罗克韦尔、台达等PLC的Modbus通讯源代码(ModbusTCP.DLL/ModbusRTU.DLL)

    1.0  通讯组件概述 该类通讯组件适用于基于PC高级语言的工业自动化控制系统,用于PC与可编程控制器(PLC).智能仪表等进行数据通讯.组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工 ...

  2. MDX Cookbook 04 - 在集合中实现 NOT IN 逻辑 (Minus, Except, Filter 等符号和函数的使用)

    有时需要从一些查询结果里排除掉一些成员,当然平常情况下可以通过 MDX 查询中的 WHERE 条件即 Slicer 切片来完成,同样的这里显示的是如何在切片中排除掉一些成员. 先看这一个查询 - , ...

  3. CentOS7中ELK6.2.3安装

      一.配置主机名 hostnamectl set-hostname elk vim /etc/sysconfig/network修改HOSTNAME=elk 安装Java环境:yum install ...

  4. SpringBoot中配置起动时的数据库初始化角本

    一.简介 我们使用SpringBoot + JPA时,需要程序在启动时执行数据表的初始化或者数据库记录的初始化.一般数据表的初始化可以通过在Spring Boot的application.proper ...

  5. Spark机器学习(4):朴素贝叶斯算法

    1. 贝叶斯定理 条件概率公式: 这个公式非常简单,就是计算在B发生的情况下,A发生的概率.但是很多时候,我们很容易知道P(A|B),需要计算的是P(B|A),这时就要用到贝叶斯定理: 2. 朴素贝叶 ...

  6. Git tag 标签操作

    列表 # 列出已有的标签 $ git tag # 为了能及时看到远程上新增的标签, 在上面的命令之前可以fetch一下 git fetch --all --tags --prune # 列出匹配的部分 ...

  7. unix缓冲

    目的:尽量减少read,write调用的次数. 标准IO提供3种IO: 1.全缓冲.在填满IO缓冲区后才进行实际的IO操作. 2.行缓冲.当输入和输出遇到换行符时,执行IO操作.(设计终端) 3.不带 ...

  8. Mysql INSERT、REPLACE、UPDATE的区别

    用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSE ...

  9. SqlServer 2008的tempdb数据文件大小暴增处理

    tempdb数据文件暴增,导致服务器磁盘空间被耗尽! 1.查看tempdb的使用分配情况 use tempdb go SELECT top 10 t1.session_id, t1.internal_ ...

  10. Oracle之外键(Foreign Key)使用方法具体解释(二)- 级联删除(DELETE CASCADE)

    Oracle外键(Foreign Key)之级联删除(DELETE CASCADE) 目标 演示样例解说怎样在Oracle外键中使用级联删除 什么是级联删除(DELETE CASCADE)? 级联删除 ...