初识docker以及node应用的部署

388 阅读4分钟

环境:centos7

##docker的安装以及一些设置

  • 安装docker yum install docker

  • 启动docker服务 systemctl start docker.service

  • 设置开机启动 systemctl enable docker.service

pull下nodejs镜像,说是docker hub 慢,就找到了一个国内的镜像去下载

docker pull hub.c.163.com/nce2/nodejs:0.12.2

  • 查看镜像 docker images

  • 创建node应用

  • 在工作目录下创建package.json文件 vi package.json 写入内容

  • 创建server.js,也就是我们node应用的主文件 vi server.js 写点内容

  • 创建Dockerfile文件

  • 在项目代码更目录创建Dockerfile文件 vi Dockerfile

下面简单解释下Dockerfile文件

FROM hub.c.163.com/nce2/nodejs:0.12.2

FROM是构建镜像的基础镜像源,后面的一串是我们刚才pull下来的那个Image,如果本地没有Docker,会自己pull镜像的。

RUN mkdir -p /home/Service
WORKDIR /home/Service

第一句RUN用于在Image里创建一个文件夹,将会用于保存我们的代码。 第二句WORKDIR是将我们创建的文件夹作为工作目录。

# Bundle app Source
COPY . /home/Service
RUN npm install

第一句的COPY是把本机当前目录下的所有文件拷贝到Image/home/Service目录下。 第二句的RUN是用npm 安装我们的node应用中的所有依赖包。

EXPOSE 8888

我们的node应用监听的是8888端口,我们可以把这个端口暴露给主机。这样我们就可以从外网访问我们的应用了。

CMD ["npm" , "start"]

用来启动我们的node应用。

##构建Image

在我们的Dockerfile所在的目录下执行构建命令

docker build -t mynodeapp .

别忘了最后那个点,不久我们会看到成功构建的信息。

然后我们去查看一下我们构建的镜像

docker images

##运行构建的Image

docker run -d -p 8888:8888 50550c

-d表示容器会在后台运行,-p表示端口映射,把本机的8888端口映射到container的8888端口,这样外网就可以通过本机访问我们的应用, 后面的50550c是我们Image的ID,没写后面的是因为根据这几个就能定位出来了。

竟然报错了,也不能访问8888端口。想了一下,应该是镜像的问题。 就跑去dochub找了官方镜像,修改Dockerfile里的基础镜像

FROM node:4-onbuild

然后再次构建我们的应用 docker build -t nodeapp .

然后开始从官网下载镜像,确实特别慢..等了好久才下载完1个。貌似需要下载9个文件.. 在漫长的等待过程中。。。

算了,放弃。。找找国内镜像试试吧~~

然后去daocloud注册了帐号,在这拉镜像吧

很快,镜像pull下来了。然后查看下现在的镜像。

现在我们去改下Dockerfile的基础镜像吧。

FROM daocloud.io/library/node

现在我们再来构建下镜像试试 docker build -t nodeapp .

看到了构建成功的信息,接着查看一下imges

然后启动: docker run -d -p 8888:8888 7b784

果然出现了问题... 启动不成功,最后才知道,镜像和Dockerfile都是一一对应的,不对应就可能会出现上面的所有问题。(切记

最近还是选择了官网的镜像,等待了40分钟左右,全部pull下来了,开始干活~~

  • 修改Dockerfile文件如下:
FROM node:4-onbuild
# replace this with your application's default port
EXPOSE 8888
  • 重新构建: docker build -t my-node-apps .

  • 启动docker镜像: docker run -d -p 8888:8888 8b

  • 然后查看下container docker ps

然后用浏览器访问下8888端口,能成功访问到我们的应用了。

完美!!!!!!!!!这次终于成功了~

然后去删除没用的imagescontainer...

若要删除所有的image, 使用命令:docker rmi $( docker images -q )

删除container docker rm id

##总结


因为镜像的事情走了不少弯路,浪费了很多的时间,所以最好还是去官网下需要的东西,然后看官方给的文档,英文的也要尽力去看。 今后还要去做学习一些images的管理,container的管理,以及应用日志处理相关的东西。


本文于2017-04-03发布在 麦晓杰的新浪博客

参考:

hub.docker.com/r/library/n…

dockone.io/article/53

linux.cn/article-434…

www.cnblogs.com/li-peng/p/5…