docker pull nginx
命令如下所示,FROM 后面跟的你的基础镜像,而run则是表示你构建镜像时需要执行的指令,下面的指令意思就构建一个自定义的nginx镜像,然后欢迎页面显示this is my Spring Cloud and Docker study Demo
vim Dockerfile
FROM nginx
RUN echo ' this is my Spring Cloud and Docker study Demo
' > /usr/share/nginx/html/index.html
在Dockerfile的目录下运行如下命令,可以看到命令最后面有个.,这个点就是用于参数传递,表示当前路径
docker build -t nginx:my .
键入如下命令即可看到我们的自定义的镜像构建完成了
docker images
docker run -d -p 91:80 nginx:my
可以看到笔者通过91端口访问到了自己创建的容器
该命令常用于复制文件
格式为
ADD src(源文件或者目录) desc(容器目标文件或者目标目录)
可以看出这里复制的可以是文件夹或者目录,注意源文件或者目录是相对Dockerfile文件而言的位置。如果src为url且dest没有/,则说明复制的是文件
如果src是url且dest结尾有/,则说明是复制的文件夹
如下所示,这就是一条将dockerfile路径下的jar复制到容器中的命令
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
常用与构建参数,设置的常是环境遍历,但是在容器运行时时是不会存在这些变量的,配置示例
ARG username=用户名
用于执行容器提供的默认值,在Dockerfile文件中,无论你配置多条cmd,只会以最后一条为准,即只会执行最后一条指令
支持的格式有
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2 (在shell中执行)
示例
cmd echo 'this is a test'
和ADD命令类似,使用也类似
和cmd一样,都是指定Docker容器启动时需要执行的指令,可以多次设置,但还是以最后一条为准,使用格式也和cmd差不多,示例如下所示
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
设置环境变量
示例
ENV JAVA_HOME /path/to/java
说明运行容器提供的端口,但并不会因为该声明而打开相应端口,该指令主要作用是帮助理解该镜像服务的守护端口
当然,在容器未指明端口随机运行时,会自动映射EXPOSE的端口
EXPOSE 8761
指定基础镜像,优点类似java的extends关键字,需要注意的时FROM指令必须用在所有指令之前
指明维护者信息,用于作为Dockerfile的署名
示例
MAINTAINER 名字<123@qq.com>
用户设置启动镜像时所用的用户id或者uid,写在RUN和CMD以及ENTRYPOINT后的内容都将用该用户执行
示例
USER zhang
该指令使容器的一个容器具有持久化存储的功能,该目录可悲容器本身使用,也可以共享给其他容器,当容器中有数据需要持久化时,就可以在Dockerfile中添加该指令,格式如下,意为将数据持久化到/data
目录中
VOLUME /data
笔者这里使用了参考书籍所用的源码具体读者可以去这个地址捞
https://github.com/itmuch/spring-cloud-docker-microservice-book-code-docker
书籍中使用命令,笔者这里就偷了个懒,把源码拉下来在idea中打成jar包扔到服务器中,而使用的模块如下图所示
由于书中编写的Dockerfile使用的时java:8,书中前文并没有提及所以笔者在本文中对此进行详细化
docker pull java:8
在上文扔到服务器中的jar包位置编写一个Dockerfile
vim Dockerfile
编辑的内容如下
# 使用java8作为基础镜像
FROM java:8
# 将本地文件挂到tmp中
VOLUME /tmp
# 复制文件到容器
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
# 运行命令
RUN bash -c 'touch /app.jar'
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker build -t itmuch/microservice-discovery-eureka-0.0.1 .
如果可以看到下图所示的过程说明构建是成功的,读者也可以使用docker images确认是否构建成功
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka-0.0.1
使用服务器ip地址:8761
确认是否可以访问
docker hub是官方维护的Docker Registry,上面存放着很多优秀的镜像,读者只需在docker官网注册账号号,就可以将镜像存放到docker hub上。
这里笔者就先演示一下将镜像推送到本地的docker registry
Docker Registry 100搭建非常简单,使用如下所示命令即可完成搭建
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
由于docker push默认会推送到官方仓库,所以这里我们需要修改一下要提交的docker镜像的tag,如下所示,将地址改为localhost
docker tag itmuch/microservice-discovery-eureka-0.0.1:latest localhost:5000/itmuch/microservice-discovery-eureka-0.0.1:latest
执行推送命令
docker push localhost:5000/itmuch/microservice-discovery-eureka-0.0.1:latest
找到microservice-discovery-eureka
对应的pom
文件修改build
标签对应的配置
<build>
<plugins>
<!-- 添加spring-boot的maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 添加docker-maven插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!--用于指定仓库+镜像名称-->
<imageName>itmuch/microservice-discovery-eureka:0.0.1</imageName>
<!--指定基础镜像-->
<baseImage>java</baseImage>
<!--就是dockerfile的 ENTRYPOINT指令-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<!--指定需要复制的根目录-->
<directory>${project.build.directory}</directory>
<!--只当要复制的文件-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
这里要求服务器安装好maven,具体maven在阿里云服务器的安装可以参考笔者这篇文章
Linux环境下maven的安装
mvn clean package docker:build
docker images
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT
上文中我们每次都要打好jar包扔到服务器上去,创建一个Dockerfile,然后使用命令构建镜像,这里我们来一个进阶偷懒,即在项目中创建一个Dockerfile然后在pom文件中指定该文件位置,直接将项目扔到服务器中直接在package阶段就构建镜像
FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
如下所示,可以看到我们构建镜像时,不在指定baseImage
entryPoint
,直接指定dockerDirectory
,而这个标签直接指向dockerfile文件,而且我们还增加了一个executions标签指定打包时就构建镜像
<build>
<plugins>
<!-- 添加spring-boot的maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<!--在每次package就打包镜像-->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--最终构建的镜像的名称-->
<imageName>itmuch/microservice-discovery-eureka:0.0.3</imageName>
<!--指定dockerfile-->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
mvn package
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.3
这部不多赘述,自行去注册即可
https://hub.docker.com/
完成后找到这个选项创建仓库即可,笔者这里就创建了一个名为microservice-discovery-eureka
的仓库
vi /etc/maven/settings.xml
找到servers标签添加dockerhub的信息
<servers>
<server>
<id>docker-hub</id>
<username>DockerHub 的账号</username>
<password>DockerHub 的密码</password>
<configuration>
<email>[email protected]</email>
</configuration>
</server>
</servers>
可以看到我们用
指定到servers配置的docker-hub信息,以及配置的imageName必须是你的dockerhubid+仓库名
更多配置参见以下配置的注释
<build>
<plugins>
<!-- 添加spring-boot的maven插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>zhangshiyu3007/microservice-discovery-eureka:0.0.4</imageName>
<baseImage>java</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
<serverId>docker-hub</serverId>
<!--设置覆盖构建相同标签的镜像-->
<forceTags>true</forceTags>
</configuration>
</plugin>
</plugins>
</build>
进入项目目录
cd microservice-discovery-eureka/
构建镜像并推送
mvn clean package docker:build -DpushImage
确认构建成功
docker images
确认推送成功,可以看到命令中已经开始将镜像推送到dockerhub中
运行镜像,并使用ip:port查看
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.4
《Spring Cloud与Docker微服务架构实战》
使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上