Docker学习之——Node.js+MongoDB+Nginx环境搭建(一)

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

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

  我的开发环境是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的内容暂时介绍到这儿,在实际搭建环境的时候还有一些其他问题,留到下次继续分享吧!