上篇给大家简单的介绍了一下docker的架构,已经常用命令.


今天带大家通过Dockerfile构建docker镜像,并构建docker私有仓库,通过maven进行打包自动构建镜像自动部署,达到持续集成目的

废话不多说,首先介绍下Dockerfile中常用的命令

FROM


 指依赖的基础镜像是....

RUN




指要执行的命令



ADD


复制文件  格式为:  

ADD ['src', 'dksrc']


注意: src可以是一个路径,也可以是一个url,还可以是一个压缩包,如果dksrc不是以/结尾将被识别为一个文件,如果以/结尾将识别为一个目录


ARG


是用于构建参数


CMD


容器的启动命令,只会执行一条.如果有多个,最后一条会被执行 目前支持三种格式:


CMD  ["executable","param1","param2"]  (推荐使用)
    CMD  ["param1","param2"]  (为ENTRYPOINT指令提供预设参数)
    CMD  command   param1   param2  (在shell中执行)
COPY



复制文件 格式为:



COPY   src  dksrc
COPY   ["src","dksrc"]
COPY   不支持url和压缩包



ENTRYPOINT



用于构建参数和CMD相似 可以设置多条只有最后一条会被执行



ENV

这个命令很重要,只用来设置环境变量 格式为:



ENV  KEY   VALUE
ENV  KEY=VALUE
EXPOSE



用于声明暴露的端口 格式为:



EXPOSE  PORT
EXPOSE  PORT1 PORT2 PORT3



注意:并不是声明后容器就会打开响应的端口,只是告诉使用者



MAINTAINER

这个用处不大,用来指定维护者信息,


VOLUME


指定挂在点

大概常用的几个命令介绍完了,下面带大家构建一下



FROM java:8
VOLUME /home/gang
ADD gang-spring-cloud-eureka-1.0-SNAPSHOT.jar /app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]



这是我的Dockerfile 在home目录下面, 下面我们通过docker build -t name . 进行构建,其中最后的点代表Dockerfile在本目录.



docker build -t test/testeureka:0.1 .

如图所示出现


docker的maven插件 dockerfile maven_docker的maven插件



Successfully built f0acb0fed231

即表示构建成功,我们在看下本地的镜像 通过docker images



docker images



docker的maven插件 dockerfile maven_docker的maven插件_02



此时本地已经有了testeureka这个镜像了



但是我们从dockerGub上pull镜像的时候太慢了.所有我推荐自己建立私有仓库,我们可以吧这个私有仓库看做是maven的私服.仓库中的镜像看做是jar.这样或许好理解多了.



现在我们构建私有仓库


很简单,


docker run -d -p 5000:5000 --restart=always --name registry2 registry:2

默认启动的是5000端口


这个时候我们就可以吧刚刚创创建的镜像push到我们的私有仓库上了.


docker push  name

但是我们会发现执行失败,

因为默认是docker hub,所以我们要设置镜像标签

docker tag  name  localhost:5000/name

这个时候在执行push就可以了.


docker push name  localhost:5000/name



但是我们怎么查看私有仓库中的镜像呢?


# curl -XGET http://registry:5000/v2/_catalog
# curl -XGET http://registry:5000/v2/image_name/tags/list



通过这两个命令就可以查看,当我们需要pull镜像时候就可以从私有仓库中直接拉去,这样方便许多




现在微服务流行,一个微服务可能有成百上千的服务,这时候,如果通过人为一一去部署......后果可想而知,


这个时候结合docker git maven 就可以快速的部署,以及持续集成,



下面咱们通过docker部署一个spring-cloud-eureka  的微服务,经过查找资料,找到一个maven插件


docker-maven-plugin


当然也是看了周立大神的著作,学到的.



下面是我的pom.xml


<plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.3</version>
                <configuration>
                    <!--镜像名称-->
                    <imageName>eurak1</imageName>
                    <!--相当于from基于父镜像-->
                    <baseImage>java</baseImage>
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>





这时候我们在ideal中运行mvn clean package docker:build 发现报错  


docker的maven插件 dockerfile maven_jar_03


发现需要连接docker服务,于是改pom.xml为下

<plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.3</version>
                <configuration>
                    <!--镜像名称-->
                    <imageName>eurak1</imageName>
                    <!--相当于from基于父镜像-->
                    <baseImage>java</baseImage>
                    <!--远程docker服务地址-->
                    <!--<dockerHost>http://192.168.68.128:2375</dockerHost>-->
                    <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>

但是发现还是不行,还是报错,连接192.168.68.128超时,怎么回事呢,明明开着docker服务的????

后来发现,就像redis一样需要开启远程访问,其实好多技术思想都是一样的.只不过每个技术的实施方式不同而已

于是设置docker开启远程连接.以后再进行打包部署

docker的maven插件 dockerfile maven_docker的maven插件_04


已经构建成功了,我们再看192.168.68.128上的docker镜像,

docker的maven插件 dockerfile maven_jar_05

已经有这个镜像了.其实是docker-maven-plugin这个插件帮我们写了一个Dockerfile  然后去远程docker上执行的构建,我们也可以指定自己的Dockerfile,达到自动部署目的

通过配置

<dockerDirectory>

即可加载自定义的Dockerfile   


我们也可以通过配置maven中的settings文件,达到构建完成后自动上传到docker仓库中.即可持续集成