Docker 容器实现 Linux 系统下项目快速部署

一、背景

基于 Docker 容器技术实现在 Linux 系统环境中项目快速部署,在 Linux 系统环境中正常部署项目花费时间较长,通过容器进行部署可以减少开发部署时间,只需要修改部分配置文件然后执行命令即可部署成功。

二、Docker 容器介绍

1.Docker 介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
  开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常运作,而在你的机器上不能正常运作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows 应用发布新功能。

2.Docker 核心

镜像(Image): Docker 镜像是一个特殊的文件系统,可以理解为就是一个安装包,放到恰当的环境中就可以开箱即用。例如 *.EXE 文件,windows 下可以直接运行。同理,docker 镜像在 docker 环境中,即可直接运行,实例化一个容器将镜像的应用程序封装在里面。

容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被 创建、启动、停止、删除、暂停等。

仓库(Repository): 仓库可看成一个代码控制中心,类似于 git 仓库,用来保存镜像。

clipboard.png

3.Docker 优点

  • 更快速的应用交付和部署

只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

  • 更便捷的升级和扩缩容

可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

  • 更高效的利用系统资源

Docker 是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的管理程序支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的 CPU 和内存的利用率。

  • 更轻松的迁移

只需要镜像就可迁移


容器对比虚拟机的优势:

  • docker 的速度很快,秒级,而虚拟机的速度通常要按分钟计算。

  • docker 所用的资源更少,性能更高。同样一个物理机器,docker 运行的镜像数量远多于虚拟机的数量。

  • 虚拟机实现了操作系统之间的隔离,docker 是进程之间的隔离,隔离级别更高、安全性方面也更强。

1.png

三、Docker 容器安装与卸载

1. 安装 docker

按照以下顺序步骤进行安装

1.1 查看操作系统版本是否是 CentOS7 及以上

cat /etc/redhat-release

1.2 查看系统的内核版本高于 3.10

uname -r

1.3 如果之前没有安装过旧版本的 docker 可以卸载

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

1.4 安装需要的软件包,yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

1.5 设置 yum 源为阿里云 (由于国外网站访问速度慢)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.6 更新 yum 软件包索引

yum makecache fast

1.7 安装 docker CE(社区版),Docker 提供了两个版本:社区版 (CE,免费) 和 企业版 (EE,收费)

yum -y install docker-ce

1.8 启动 docker

systemctl start docker systemctl stop docker //停止docker systemctl restart docker //重启docker

1.9 设置 docker 开机启动

systemctl enable docker

1.10 检查是否安装成功

docker version

1.11 查看 docker 状态

systemctl status docker

2. 卸载 docker

//查询docker安装过的包 
yum list installed | grep docker 
//删除安装包 
yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y 
//删除镜像/容器等 
rm -rf /var/lib/docker

四、Dockerfile 镜像介绍

1. Dockerfile 介绍

Dockfile 是一种被 Docker 程序解释的脚本,是用来构建 Docker 镜像的构建文件。Dockerfile 是由一条一条的指令组成,每条指令对应 Linux 下面的一条命令,Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,Docker 程序将读取 Dockerfile,根据指令生成定制的 image。

2. 镜像制作步骤

2.png

3. Dockerfile 制作(Nginx 样例)

# 基础镜像,当前镜像是基于那个镜像的,必须为Dockerfile的第一个指令 
FROM centos:centos7 
# 维护镜像的用户信息 
MAINTAINER hzh 
# 创建文件夹 
RUN \ 
       mkdir -p /usr/local/nginx \ 
       && mkdir -p /usr/local/mes 
# 拷贝文件和目录到镜像中 
COPY nginx-1.15.5.tar.gz /usr/local/mes 
COPY nginx.conf /usr/local/mes 
COPY mes-web.zip /usr/local/mes 
# 安装vim编辑器 
RUN \ 
      yum -y install vim \ 
      && yum install -y unzip zip \ 
# 安装 nginx 
RUN \ 
      yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel \ 
      && cd /usr/local/mes \ 
      && tar -zxv -f nginx-1.15.5.tar.gz \ 
      && rm -rf nginx-1.15.5.tar.gz \ 
      && cd nginx-1.15.5 \ 
      && ./configure --with-http_stub_status_module \ 
      && make && make install \ 
      && cd .. \ && rm -rf nginx-1.15.5 \ 
      && mv /usr/local/mes/mes-web.zip /usr/local/nginx/html \ 
      && cd /usr/local/nginx/html \ 
      && unzip mes-web.zip \ && rm -rf /usr/local/nginx/html/mes-web.zip \ 
      && cp -rf /usr/local/mes/nginx.conf /usr/local/nginx/conf \ 
      && cd /usr/local/nginx \ 
      && rm -rf /usr/local/mes/nginx.conf 
# 设置工作访问时候的WORKDIR路径,登陆落脚点 
ENV MYPATH /usr/local/nginx 
# 创建容器后终端默认登录进来的工作目录,落脚点 
WORKDIR $MYPATH 
# 环境变量 ENV PATH 
$PATH:/usr/local/nginx/sbin 
# EXPOSE 映射端口 
EXPOSE 80 
# CMD 容器启动时运行以下命令
CMD [ "nginx","-g","daemon off;" ]

4. Dockerfile 生成镜像

执行Docker命令:docker build -f 宿主机中Dockerfile文件的绝对路径/Dockerfile文件名称 -t 新镜像名称[:版本号] 宿主机资源文件路径 
例:docker build -f docker/NginxDockerfile -t mynginx:v1.0 docker 
-f:指定要使用的Dockerfile路径 
-t:镜像的名字及标签

生成镜像后可使用命令:docker images 查看生成的镜像信息,如图:

3.png

5. 启动镜像

执行Docker命令:docker run --name 新镜像名称 -d -p 映射端口:端口 新镜像名称:版本号 
例:docker run --name mynginx -d -p 80:80 mynginx:v1.0
 -d:表示后台运行容器
 -p:指定端口映射,第一个80 表示对外暴露的端口 (即:应用服务端口),第二个80 表示nginx容器端口 
--name:指定容器名称

启动镜像后可使用命令:docker ps 查看启动镜像信息,如图:

4.png

五、Docker 容器下项目部署

1. 将 war 包、nginx、redis 中配置文件进行修改

例 1:war 包中 Mestar_home 配置文件以及 redis 配置文件修改数据库以及 redis 用户密码配置。

例 2:nginx 中需要修改 nginx.conf 配置文件。

例 3:redis 需要修改 redis.conf 中配置文件。

2. 将所需要生成容器的 dockerfile 文件以及 war 包、安装包、配置文件全部传至服务器中

5.png

3. 生成镜像与启动命令

Nginx 镜像:

//执行生成镜像命令 
docker build -f docker/NginxDockerfile -t mynginx:v1.0 V5.5Docker 
//启动镜像命令 
docker run --name mynginx -d --restart=always -p 80:80 mynginx:v1.0

Redis 镜像:

//执行生成镜像命令 
docker build -f docker/RedisDockerfile -t myredis:v1.0 V5.5Docker 
//启动镜像命令 
docker run --name myredis -d --restart=always -p 6379:6379 myredis:v1.0

Web 端镜像:

//执行生成镜像命令 
docker build -f docker/WebDockerfile -t unimaxweb:v1.0 V5.5Docker 
//启动镜像命令 
docker run --net host --name unimaxweb -d --restart=always -p 8082:8082 unimaxweb:v1.0

4. 启动成功查看

查看命令 docker ps

6.png

六、Docker 容器项目部署中问题以及注意事项

1. 问题

1.1 当主机重启后 docker 自动启动但是容器中部署服务没有自启

原因:镜像未设置开机自启,导致主机重启后无法自启。

解决方法:如果已经生成镜像则通过:docker update 容器 ID –restart=always 设置容器开机自启或在启动容器时增加属性例:

docker run --name mynginx -d --restart=always -p 80:80 mynginx:v1.0

1.2 在使用 MES 服务时,服务器时间日期不正确,会报 500 错误

原因:系统与硬件时间不正确,导致后端代码获取时间错误。

解决方法:将服务器系统和硬件时间设置时区,保证时间日期正确。

1.3 在启动镜像时,无法看到是否在启动

解决方法:可通过命令 docker logs 容器 name 查看启动情况。

2. 注意事项

2.1 建议在容器启动时增加开机自启的属性配置。

2.2 在启动容器前关闭系统防火墙。

2.3 在部署 MES 服务前先设置服务器系统时区,确保时间日期正确。

2.4 生成镜像时,dockerfile 所需要的包和配置文件不能缺少,否则就会报错。

2.5 war 包配置置文件路径修改,如下四个文件中将所有 "file:/“改为"file:”

uma-unimax-web.war/WEB-INF/classes/application.properties 
uma-unimax-web.war/WEB-INF/classes/applicationContext.xml 
uma-unimax-web.war/WEB-INF/classes/spring/spring-cache.xml 
uma-unimax-web.war/WEB-INF/web.xml>