柳丁脚踏车

导航

项目Docker化流程与问题总结(1)

 

到了新公司,领导让我研究项目Docker化的方案,在此做个记录。 

 

Docker

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署。 

关于Docker的资料,可以看官方的文档和Docker中文社区。中文社区有一个Docker问答录 https://blog.lab99.org/post/docker-2016-07-14-faq.html,感觉对于我这种新的Docker使用者很有帮助

Docker通常用于如下场景:

  • web应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

 

Docker 镜像Image

假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。

一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。

Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。

 

Docker 容器 Container

容器是在所有镜像层之上增加的一个可写层。容器有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态(Exited)。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。

当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。

我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。

 

Docker的安装

公司主机用的是Debian的系统,Docker支持64位、内核高于3.10的Debian操作系统,内核低于3.10将导致数据丢失和系统不稳定等问题。 查看内核版本使用以下命令:

$ uname -r

Docker的安装参照官网文档: https://docs.docker.com/engine/installation/linux/docker-ce/debian/

 

部署项目到Docker中

使用MobaXterm工具远程控制主机,将项目代码文件夹(后面用app表示)打包,移入主机的某个目录中,比如根目录 / 中,在根目录下用unzip app.zip命令解压app.zip文件,进入解压出来的目录app。

在app文件夹中创建Dockerfile文件,内容如下:

 

#设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node

#创建app目录,保存我们的代码
RUN mkdir -p /usr/src/node
#设置工作目录
WORKDIR /usr/src/node

#复制所有文件到 工作目录。
COPY . /usr/src/node

#编译运行node项目,使用npm安装程序的所有依赖,利用taobao的npm安装
RUN npm install --registry=https://registry.npm.taobao.org #暴露container的端口 EXPOSE 3100 #运行命令 CMD ["npm", "start"]

在app文件夹下,构建项目的docker镜像,最后一个点表示当前目录:

$ docker build -t app .

可以通过docker的命令查看刚构建的镜像

$ docker images
REPOSITORY    TAG            IMAGE ID            CREATED             SIZE
app           latest         a3f4ce440e89        27 minutes ago      735MB

启动docker容器

$ docker run -d --name App -p 3100:3100 app

-d表示后台运行容器,--name指定容器的名字,-p设置端口映射,前者是暴露给外部的端口号,后者是主机上的端口号。app就是刚才构建的镜像名。

这样就可以在浏览器输入 主机ip:3100 访问web应用了。

 

Docker常用命令

$ docker images                              #查看docker中的镜像
$ docker ps -a #查看docker中的容器,-a参数表示显示没有在运行的容器
$ docker stop container id/container name #停止容器
$ docker rm container id/container name #删除容器
$ docker rm $(docker ps -a -q) #删除所有容器

$ docker rmi image id/image name #删除镜像
$ docker rmi $(docker images -q) #删除所有镜像
$ docker exec -it container id/name /bin/sh #进入后台运行的容器,执行exit不会停止容器

$ docker volume create myvol #创建数据卷myvol

 

 

 

 

posted on 2017-10-25 10:00  柳丁脚踏车  阅读(751)  评论(0编辑  收藏  举报