极简的docker教程-在docker上运行微服务

文章目录

  • 用一个简单的demo了解docker构建自定义镜像
    • 首先用docker拉一个nginx
    • 编写一个Dockerfile
    • 构建
    • 查看自己构建的镜像是否成功了
    • 运行
    • 测试
  • 了解一下Dockerfile的常用指令
    • ADD
    • ARG
    • CMD
    • COPY
    • ENTRYPOINT
    • ENV
    • EXPOSE
    • FROM
    • MAINTAINER
    • USER
    • VOLUME
  • 使用Dockerfile构建镜像
    • 步骤
      • 将自己的项目打成jar包
      • 拉取一个java8的镜像
      • 编辑一个Dockerfile
      • 构建镜像
      • 启动并查看是否可以运行
  • 使用Docker Registry管理docker镜像
    • 介绍
    • 步骤
      • 搭建私有仓库
      • 将镜像推送到私有仓库
  • 使用maven插件构建docker镜像
    • 步骤
      • 编写pom文件
      • 将项目扔到服务器中
      • 运行如下命令
      • 查看镜像是否生成了
      • 运行该容器
  • 使用maven插件读取Dockerfile构建镜像
    • 介绍
    • 步骤
      • 项目中编写一个Dockerfile文件
      • 修改pom文件
      • 扔到服务器中
      • 构建镜像
      • 测试运行
  • 构建镜像并推送镜像到远程仓库中
    • 步骤
      • dockerhub注册账号
      • 创建仓库
      • 将dockerhub配置写道maven的setting.xml中
      • 修改pom文件
      • 把项目扔到云服务器中
      • 打包并推送
      • 确认打包和推送都成功
      • 运行程序查看是否正确运行
  • 参考文献

用一个简单的demo了解docker构建自定义镜像

首先用docker拉一个nginx

docker pull nginx

编写一个Dockerfile

命令如下所示,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教程-在docker上运行微服务_第1张图片

运行

docker run -d -p 91:80 nginx:my

测试

可以看到笔者通过91端口访问到了自己创建的容器

极简的docker教程-在docker上运行微服务_第2张图片

了解一下Dockerfile的常用指令

ADD

该命令常用于复制文件
格式为

ADD src(源文件或者目录)  desc(容器目标文件或者目标目录)

可以看出这里复制的可以是文件夹或者目录,注意源文件或者目录是相对Dockerfile文件而言的位置。如果src为url且dest没有/,则说明复制的是文件
如果src是url且dest结尾有/,则说明是复制的文件夹

如下所示,这就是一条将dockerfile路径下的jar复制到容器中的命令

ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar

ARG

常用与构建参数,设置的常是环境遍历,但是在容器运行时时是不会存在这些变量的,配置示例

ARG username=用户名

CMD

用于执行容器提供的默认值,在Dockerfile文件中,无论你配置多条cmd,只会以最后一条为准,即只会执行最后一条指令

支持的格式有

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2 (在shell中执行)

示例

cmd echo 'this is a test'

COPY

和ADD命令类似,使用也类似

ENTRYPOINT

和cmd一样,都是指定Docker容器启动时需要执行的指令,可以多次设置,但还是以最后一条为准,使用格式也和cmd差不多,示例如下所示

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

ENV

设置环境变量

示例

ENV JAVA_HOME /path/to/java

EXPOSE

说明运行容器提供的端口,但并不会因为该声明而打开相应端口,该指令主要作用是帮助理解该镜像服务的守护端口
当然,在容器未指明端口随机运行时,会自动映射EXPOSE的端口

EXPOSE 8761

FROM

指定基础镜像,优点类似java的extends关键字,需要注意的时FROM指令必须用在所有指令之前

MAINTAINER

指明维护者信息,用于作为Dockerfile的署名
示例

MAINTAINER 名字<123@qq.com>

USER

用户设置启动镜像时所用的用户id或者uid,写在RUN和CMD以及ENTRYPOINT后的内容都将用该用户执行
示例

USER zhang

VOLUME

该指令使容器的一个容器具有持久化存储的功能,该目录可悲容器本身使用,也可以共享给其他容器,当容器中有数据需要持久化时,就可以在Dockerfile中添加该指令,格式如下,意为将数据持久化到/data目录中

VOLUME /data

使用Dockerfile构建镜像

步骤

笔者这里使用了参考书籍所用的源码具体读者可以去这个地址捞
https://github.com/itmuch/spring-cloud-docker-microservice-book-code-docker

将自己的项目打成jar包

书籍中使用命令,笔者这里就偷了个懒,把源码拉下来在idea中打成jar包扔到服务器中,而使用的模块如下图所示

极简的docker教程-在docker上运行微服务_第3张图片

拉取一个java8的镜像

由于书中编写的Dockerfile使用的时java:8,书中前文并没有提及所以笔者在本文中对此进行详细化

 docker pull java:8

编辑一个Dockerfile

在上文扔到服务器中的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教程-在docker上运行微服务_第4张图片极简的docker教程-在docker上运行微服务_第5张图片

启动并查看是否可以运行

docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka-0.0.1

使用服务器ip地址:8761确认是否可以访问

极简的docker教程-在docker上运行微服务_第6张图片

使用Docker Registry管理docker镜像

介绍

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

使用maven插件构建docker镜像

步骤

编写pom文件

找到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教程-在docker上运行微服务_第7张图片

运行该容器

docker run  -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT

极简的docker教程-在docker上运行微服务_第8张图片

使用maven插件读取Dockerfile构建镜像

介绍

上文中我们每次都要打好jar包扔到服务器上去,创建一个Dockerfile,然后使用命令构建镜像,这里我们来一个进阶偷懒,即在项目中创建一个Dockerfile然后在pom文件中指定该文件位置,直接将项目扔到服务器中直接在package阶段就构建镜像

步骤

项目中编写一个Dockerfile文件

极简的docker教程-在docker上运行微服务_第9张图片
内容如下

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"]

修改pom文件

如下所示,可以看到我们构建镜像时,不在指定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

极简的docker教程-在docker上运行微服务_第10张图片

构建镜像并推送镜像到远程仓库中

步骤

dockerhub注册账号

这部不多赘述,自行去注册即可
https://hub.docker.com/

创建仓库

完成后找到这个选项创建仓库即可,笔者这里就创建了一个名为microservice-discovery-eureka的仓库
极简的docker教程-在docker上运行微服务_第11张图片

将dockerhub配置写道maven的setting.xml中

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>

修改pom文件

可以看到我们用docker-hub指定到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

极简的docker教程-在docker上运行微服务_第12张图片

确认推送成功,可以看到命令中已经开始将镜像推送到dockerhub中

极简的docker教程-在docker上运行微服务_第13张图片

运行程序查看是否正确运行

运行镜像,并使用ip:port查看

docker run  -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.4

极简的docker教程-在docker上运行微服务_第14张图片

参考文献

《Spring Cloud与Docker微服务架构实战》
使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上

你可能感兴趣的:(微服务,操作系统,数据结构,链表)