13.将微服务运行在docker上

dockerfile 是一个文本文件,其中包含了若干条指令

  1. 创建 文件 Dockerfile
FROM nginx
RUN echo '<h1>spring cloud yu docker ha ha </h1>' > /usr/share/nginx/html/index.html

  1. 构建并且运行

    docker build -t nginx:my .
    docker run -d -p 92:80 nginx:my
    

http://192.168.43.201:92/ 即可访问

dockerfile常用指令

ADD 复制文件

add src … dest

add [“src”,…“desc”]

src目录文件,desc容器

src可以是Dockerfile所在目录的相对路径,url,压缩包

ADD eureka.jar aap.jar

ARG 构建参数,类似于ENV,只不过在容器运行时,不存在这些参数的

ARG user1=someuser

CMD 容器启动指令

每个Dockerfile只有一个CMD命令

CMD [“executable”,“param1”,“param2”]

CMD [“param1”,“param2”]

CMD command param1 param2 在shell中执行

例子:CMD echo “This is a test” | wc -

COPY 复制文件

COPY src … desc 通add

和 ADD类似,只是 不支持 RUL 和 压缩包

ENTRYPOINT entrypoint 入口点

ENTRYPOINT [“executable”,“param1”,“param2”]

ENTRYPOINT command param1 param2 在shell中执行

和 CMD 一样,都是 docker 容器启动时执行的命令

ENV 设置环境变量

ENV key value

ENV key=value

ENV JAVA_HOME /path/to/java

EXPOSE 声明暴露的端口

运行时,容器提供服务的端口

EXPOSE port

EXPOSE prot1 #端口示例
docker run -p port1 image   #运行
docker run -p image  #或者-P image

EXPOSE prot1 prot2 #端口示例
docker run -p port1 -p port2 image   #运行
docker run -p host_port1:port1 -p host_port2:port2 image   #运行


FROM 指定基础镜像

像extends关键字

FROM必须指定,切需要写在其他指令之前

FROM

FROM :

FROM @

LABEL 为镜像添加元数据

LABEL = =

“” 转义 \ 换行

LABEL version=“1.0”

LABEL “com.exaple”=“Incorporated”

MAINTAINER main tainer 指定维护者的信息

为 Dockerfile署名

MAINTAINER 周立eacdy0000@126.com

RUN 执行

RUN command

在shell终端运行

linux /bin/sh -c

windows cmd /s /c

RUN [“executable”,“param1”,“param2”] 使用exec执行,类似于函数调用

RUN ["/bin/bash","-c",“echo hello”]

USER 设置用户

启动镜像时的用户 或者 UID

USER 用户名

USER deamon

VOLUME 指定挂载点 volume

使用容器的一个目录,具有持续化存储的功能,可被容器本身使用或共享给其他容器

VOLUME /data

WORKDIR workdir 指定工作目录

WORKDIR /path/to/workdir

该指令后的 RUN CMD ENTRYPOINT 都将该目录作为当前目录

使用Dockerfile构建 镜像

mvn clean package

编写docker file

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"] # 配置容器启动后执行的命令,java -jar /app.jar

可以使用"-Djava.security.egd=file:/dev/./urandom"加快随机数产生过程。
解决阿里云的tomcat启动慢的问题: Djava.security.egd=file:/dev/./urandom
后台启动并打印日志 nohup java -jar项目名.jarDjava.security.egd=file:/dev/./urandom > 日志.log 2>&1 &

docker build -t itmuch/microservice-discovery-eureka-0.0.1 . 打包
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka-0.0.1
http://localhost:8761/


[root@CentOS1rr 桌面]# docker build -t itmuch/microservice-discovery-eureka-0.0.1 .
Sending build context to Docker daemon  282.2MB
Step 1/6 : FROM java:8
8: Pulling from library/java  #pull下来java 8
5040bd298390: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/6 : VOLUME /tmp
 ---> Running in e59982b4f158
Removing intermediate container e59982b4f158
 ---> dd0ce5eeff83
Step 3/6 : ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar #复制到 app.jar
 ---> 77cb6bb3326f
Step 4/6 : RUN bash -c 'touch /app.jar'  #运行
 ---> Running in 7791e50b5f5a
Removing intermediate container 7791e50b5f5a
 ---> 304a49be92c3
Step 5/6 : EXPOSE 8761 #端口为8761
 ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
 ---> Running in a52d73f32edd
Removing intermediate container a52d73f32edd
 ---> 627b3990da2a
Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]  #后续的执行
 ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
 ---> Running in d5b2ac655200
Removing intermediate container d5b2ac655200
 ---> 2548e842daa3
Successfully built 2548e842daa3
Successfully tagged itmuch/microservice-discovery-eureka-0.0.1:latest  #构建成功

docker registry管理 docker镜像

docker hub 是 docker官方维护的 docker registry。上面有很多优秀的镜像

docker search 命令搜索镜像

https://hub.docker.com/

docker login

docker push itmuch/microservice-discovery-eureka-0.0.1 推送到仓库

docker registry 2.0 搭建私有仓库

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


docker tag itmuch/microservice-discovery-eureka-0.0.1 localhost:5000/itmuch/microservice-discovery-eureka-0.0.1   #更改tag

docker push localhost:5000/itmuch/microservice-discovery-eureka-0.0.1 #推送

http://ip:5000/v2/_catalog ,访问可查看仓库动态,和仓库中有多文件

配置仓库
vi /etc/docker/daemon.json
内容如下:
{
        "registry-mirrors": [
                "<your acccelerate address>"
        ],
        "insecure-registries":  [
                "ip:5000"
        ]
}
重启服务:
service docker restart

还可以为私有仓库配置 域名,ssl登陆,认证

Docker Registry 2.0 不包含界面,用户管理,权限控制,如果想要这些,用 Docker Trusted Registry

使用maven插件构建镜像

spotify

fabric8io

bibryam

unzip microservice-discovery-eureka.zip 是解压的


      <!-- 添加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>
          <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>

imageName 镜像名字,itmuch 仓库名。microservice-discovery-eureka 镜像名。0.0.1 标签

baseImage 指定基础镜像

entryPoint 结束要运行的

resources directory: 需要复制的根目录,target目录

include 指定需要复制的文件

mvn clean package docker:build
docker images
docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1

读取Dockerfile构建

src/main/docker/Dockerfile

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,在Dockerfile设置了

      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>0.4.13</version>
        <configuration>
          <imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName>
          <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
          
           
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>

maven 安装

export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export JAVA_HOME=/usr/local/jdk1.8.0_131
export PATH=$MAVEN_HOME/bin:$JAVA_HOME/bin:$PATH

which java

wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

tar zvxf apache-maven-3.6.3-bin.tar.gz

vim apache-maven-3.6.1/conf/settings.xml

<mirror>

      <id>alimaven</id>

      <name>aliyun maven</name>

      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

      <mirrorOf>central</mirrorOf>       

</mirror>

vim /etc/profile

export MAVEN_HOME=/usr/local/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH

#/opt/maven/apache-maven-3.6.1

source /etc/profile

mvn -v

将插件绑定在某个phase执行

mvn phase:goal

mvn package docker:build

package docker 都是 phase

build 是 goal

<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>
        <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>
          <baseImage>java</baseImage>
          <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>

            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
        </configuration>
      </plugin>
    </plugins>
  </build>
不加这些要用: mvn clean package docker:build
          <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
              <goal>build</goal>
            </goals>
          </execution>

执行: mvn package 就会自动执行: docker:build

推送镜像

docker push

也可用maven插件推送一个Docker镜像到 Docker Hub

修改 maven的 setting.xml

<servers>
    <server>
      <id>docker-hub</id>
      <username>cakin24</username>
      <password>cakin24的密码</password>
      <configuration>
          <email>DockerHub邮箱</email>
      </configuration>
    </server>
  </servers>

pom.xml

	<plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>0.4.13</version>
        <configuration>
          <imageName>itmuch/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>
        </configuration>
      </plugin>

mvn clean package docker:build -DpushImage

推送到私有仓库

localhost:5000/itmuch/microservice-discovery-eureka:0.0.4

		<imageTags>
            <imageTag>0.0.5</imageTag>
            <tag>latest</tag>
          </imageTags>

mvn clean package docker:build -DpushImageTags -DdockerImageTags=lastest -DdockerImageTags=another-tag

<configuration> <forceTags>true</forceTags> #覆盖push

Docker Compose 编排微服务

Compose 定义和运行多容器Docker应用程序的工具,前身是Fig。

构建CI工作流

本书用 1.10.0

curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

 docker-compose s
scale  start  stop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值