docker将当前环境打包成镜像(docker怎么运行镜像)

我们知道,Docker的出现,极大地简化了从开发到运维的交付过程,因为它可以使得开发交给运维的是软件程序以及软件程序所依赖的环境,即Docker镜像,而不仅仅是软件程序

上一篇文章,我们认识了Dockerfile,知道了它的角色以及Dockerfile的指令,也通过两个小实践,带领大家了解到该如何使用Docker构建一个镜像

不过,你肯定觉得还不是很“过瘾”,为啥?因为那两个小实践,并没有体现出它真正的作用—将软件即软件程序依赖的环境打包到一起,随处部署,以简化交付流程

那么今天呢,我们就来见证一下这个作用。将一个使用到mariadb的Spring Boot项目,构建为一个镜像,直接运行这个镜像,来完成项目的部署

开始之前,我们先分别来看看只构建MariaDB的环境和只构建Spring Boot项目(不依赖数据库)的过程,由简单到复杂,层层递进,逐步深入理解其步骤

 

一 MariaDB

MariaDB环境构建

 

先来介绍一下MariaDB

 

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品

MariaDB虽然被视为MySQL数据库的替代品,但它在扩展功能、存储引擎以及一些新的功能改进方面都强过MySQL

据我所知,很多企业现在已渐渐由Mysql转为MariaDB数据库

 

接下来,我们正式开始MariaDB环境的构建

 

1 编写Dockerfile文件

FROM centos
VOLUME ["test1", "test2", "/mylog/test3"]
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum install -y mariadb-server
EXPOSE 3306
CMD /bin/bash

说明

 

1)基于centos镜像

2)创建test1、test2以及/mylog/test3,这三个挂载目录(在这里无实际意义,只是为了演示VOLUMN关键字的作用)

3)声明环境变量MYPATH,值为/usr/local

4)进入到/usr/local目录下

5)使用yum安装mariadb-server

6)暴露端口3306

7)进入容器目录/bin/bash

 

2 构建镜像

 

执行命令

docker build -f Dockerfile -t mycentos:1.2 . 

进行镜像的构建

其中docker build为构建镜像的Docker指令

-f Dockerfile,表示指定当前目录下的Dockerfile文件

-t mycentos:1.2,表示构建的镜像名称和版本分别为mycentos1.2

最后的一点,表示在当前目录进行构建

 

下面为具体的构建步骤

 

1)前五步

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

2)后面两个步骤

 

docker将当前环境打包成镜像(docker怎么运行镜像)

显然,镜像已成功构建

 

3 查看镜像

 

执行docker images 查看本地镜像,如下所示

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

mycentos:1.2这个镜像已成功创建

 

4 运行镜像

 

执行命令

docker run -it -v /Users/wangjie/Downloads/documents/mydocker:/test1  --privileged=true mycentos:1.2 /sbin/init

启动镜像

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

5 验证

 

执行docker ps,发现该镜像已启动,并存在其对应的容器号

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

进入这个容器,执行systemctl status mariadb,验证mariadb环境。我们发现已安装成功

 

后面就可以进行设置密码,初始化数据库的操作步骤

 

好了,完成得比较轻而易举

 

接下来,我们进入Spring Boot项目打包为镜像的步骤

 

二 项目

Spring Boot项目打包为镜像

 

1 编写Dockerfile文件

 

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=eureka-server-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} eureka-server-0.0.1-SNAPSHOT.jar
EXPOSE 8762
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /eureka-server-0.0.1-SNAPSHOT.jar ${0} ${@}"]

 

说明

 

1)基于jdk8镜像构建

2)创建/tmp挂载目录

3)创建参数JAR_FILE,默认值为eureka-server-0.0.1-SNAPSHOT.jar

4)将eureka-server-0.0.1-SNAPSHOT.jar包拷贝到镜像根目录

5)暴露8762端口

6)执行java -jar eureka-server-0.0.1-SNAPSHOT.jar,完成项目的启动

 

2 构建镜像

 

进入项目的target目录(jar包存在的目录),执行命令

docker build -f ../Dockerfile -t myeureka:1.0 .

 

运行如下:

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

显然,镜像已成功构建

 

3 查看镜像

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

发现镜像myeureka:1.0已存在

 

4 启动镜像

 

执行命令

docker run -it -p 8762:8762 myeureka:1.0 /bin/bash

启动镜像,日志如下:

 

docker将当前环境打包成镜像(docker怎么运行镜像)

docker将当前环境打包成镜像(docker怎么运行镜像)

 

我们发现,服务已正常启动。访问页面:

docker将当前环境打包成镜像(docker怎么运行镜像)

 

页面也已正常显示,表示该项目已通过docker构建为镜像、并成功启动

 

接下来,就进入今天的真正主题,使用Dockerfile来完成一个完整业务项目的镜像构建与启动

 

三 项目

程序+组件(Mariadb)构建

其实步骤都一样,需要经历Dockerfile编写,镜像构建以及镜像启动三个步骤,只是过程中需要分别考虑程序和组件而已

先来介绍一下这个后端程序druid_demo,是杰哥之前练习druid连接池时创建的一个demo项目,里面使用jpa进行mysql数据库的操作,我先来换成mariadb,配置如下

 

spring.datasource.url=jdbc:mariadb://127.0.0.1:3306/adp_test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

具体,就不细说啦,这个完整的项目我也会放到github上面去,大家需要可以down下来自己试试

1 编写Dockerfile文件

FROM centos

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel mariadb-server
#RUN yum install -y mariadb-server

VOLUME /tmp
ARG JAR_FILE=druid_demo-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} /druid_demo-0.0.1-SNAPSHOT.jar

EXPOSE 3306
EXPOSE 8080
CMD /bin/bash

 

说明

 

1)基于centos镜像

2)声明环境变量MYPATH,值为/usr/local

3)进入到/usr/local目录下

4)使用yum安装jdk8以及mariadb-server

6)将打好的jar包拷贝到容器根目录

7)分别暴露端口3306,8080

8)进入容器目录/bin/bash

 

2 构建镜像

进入项目target目录,执行命令

 

docker build  -f ../Dockerfile2 -t druid_demo:0.0.1-SNAPSHOT .

进行镜像的构建,执行过程如下:

 

docker将当前环境打包成镜像(docker怎么运行镜像)

docker将当前环境打包成镜像(docker怎么运行镜像)

3 查看镜像

运行docker ps,查看本地镜像

 

docker将当前环境打包成镜像(docker怎么运行镜像)

发现,这个镜像已成功构建,接下来启动这个镜像

4 运行镜像

执行命令

docker run -it  -p 8888:9999 --privileged=true druid_demo:0.0.1-SNAPSHOT /sbin/init

运行该镜像,即创建容器,其中该启动命令指定了容器中9999映射到主机端口为8888

 

5 进入容器

 

docker将当前环境打包成镜像(docker怎么运行镜像)

6 更改配置(可选)

若要使mariadb使用utf8编码,则可以分别操作如下步骤进行文件配置的修改

1)修改 /etc/my.cnf.d/client.cnf 文件

在内容[client] 下加一行配置 default-character-set=utf8

最终内容

docker将当前环境打包成镜像(docker怎么运行镜像)

2)修改 /etc/my.cnf.d/mysql-clients.cnf 文件

[mysql] 下加一行配置 default-character-set=utf8

最终内容如下

docker将当前环境打包成镜像(docker怎么运行镜像)

3)修改/etc/my.cnf.d/mariadb-server.cnf文件

[mysqld] 下添加配置

collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
sql-mode = TRADITIONAL

最终内容如下

docker将当前环境打包成镜像(docker怎么运行镜像)

7 启动mariadb

分别执行

systemctl start mariadb


systemctl status mariadb

 

启动mariadb,并查看状态

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

8 修改密码

初始的root密码为空,我们需要执行mysql_secure_installation,修改密码

 

docker将当前环境打包成镜像(docker怎么运行镜像)

修改成功,新密码为123456

 

9 验证连接

 

执行mysql -uroot -p123456

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

10 初始化sql

 

由于代码中只使用到了adp_test数据库中的一个表t_user2,因此我们分别创建adp_test数据库和t_user2表,创建语句如下:

 

create database if not exists adp_test;
create table t_user2 (id int(11) primary key,name varchar(30),age int(20));

 

并插入一条记录

insert into t_user2 values(1,"wangjie",21);

 

最终的效果为:

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

好了,数据库环境已准备好,接下来试着启动程序

 

11 启动程序

 

执行命令

java -jar -Xmx128m druid_demo-0.0.1-SNAPSHOT.jar --server.port=9999

完成程序的启动

 

docker将当前环境打包成镜像(docker怎么运行镜像)

 

查看日志,项目的确已成功启动

 

12 访问页面

 

docker将当前环境打包成镜像(docker怎么运行镜像)

页面正常访问,也就是我们成功的标志!

 

那么,到这里,我们就顺利完成了将后端项目和其使用到的mariadb打包到一个镜像,启动镜像,并最终完成启动项目的过程

 

四 总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论