通过dockerfile发布springweb工程并将镜像上传至私有仓库

docker-maven-plugin插件官网地址:https://github.com/spotify/docker-maven-plugin

工程结构

文件结构

dockerfile文件内容

# 这个镜像的基础镜像是alpine
FROM alpine

# 作者
MAINTAINER test.com "test@test.com"

# 配置社区源
RUN echo -e "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main\n\
https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/community" > /etc/apk/repositories

# 安装curl bash jre
RUN apk --update add curl bash openjdk7-jre-base && rm -rf /var/cache/apk/*

# 环境变量
ENV JAVA_HOME /usr/lib/jvm/default-jvm
ENV PATH ${PATH}:${JAVA_HOME}/bin

# 创建一个文件夹 /web
RUN mkdir /web/

# 切换工作目录到/web/下
WORKDIR /web/

# 下载tomcat文件
RUN wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.85/bin/apache-tomcat-7.0.85.tar.gz

# 解压tomcat压缩文件
RUN tar -xzf apache-tomcat-7.0.85.tar.gz && rm -rf apache-tomcat-7.0.85.tar.gz && \
 mv apache-tomcat-7.0.85 tomcat && rm -rf /web/tomcat/webapps/*

# 切换工作目录到ROOT下
WORKDIR /web/tomcat/webapps/

# 将我们的项目(webtest-1.0.0-SNAPSHOT.war)添加到docker镜像中的tomcat下的ROOT目录下
COPY webtest-1.0.0-SNAPSHOT.war /web/tomcat/webapps/ROOT.war

RUN ls -s

# 公布tomcat的8080端口
EXPOSE 8080

# 启动tomcat
ENTRYPOINT ["/web/tomcat/bin/catalina.sh", "run"]

Q&A
:通过dockerfile构建镜像时遇到过一个问题,解压tomcat tar包的时候发现如果是用两个RUN一个解压tar包一个删除webapps里面的内容会提示文件非空,而提示文件非空的原因就是文件正在被使用中。
:解决这个问题的方法是将两条命令放到一个RUN中通过&&连接起来执行。

pom.xml文件添加下面的内容

<properties>
    <!-- 是镜像的前缀 -->
    <docker.registry.name>devops</docker.registry.name>
    <!-- docker私有仓库地址 -->
    <docker.registry.url>192.168.199.199:5000</docker.registry.url>
    <!-- docker编译地址 -->
    <docker.registry.host>192.168.199.199:4243</docker.registry.host>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.4.14</version>
            <configuration>
                <!-- 镜像地址 -->
                <imageName>${docker.registry.url}/${docker.registry.name}/${project.artifactId}</imageName>
                <!-- 镜像tag -->
                <imageTags>
                    <imageTag>${project.version}</imageTag>
                </imageTags>
                <!-- dockerfile和其他一些需要在镜像中用到的文件夹地址 -->
                <dockerDirectory>src/main/docker</dockerDirectory>
                <!-- 本地有docker可以不用 -->
                <!-- <dockerHost>${docker.registry.host}</dockerHost> -->
                <!-- 上传镜像 -->
                <pushImage>true</pushImage>
                <!-- 重试次数 -->
                <retryPushCount>3</retryPushCount>
                <resources>
                    <rescource>
                        <targetPath>/</targetPath>
                        <!-- target目录 -->
                        <directory>${project.build.directory}</directory>
                        <!-- 需要移动的文件 -->
                        <include>${project.build.finalName}.${project.packaging}</include>
                    </rescource>
                </resources>
                <serverId>docker-registry</serverId>
            </configuration>
        </plugin>
    </plugins>
</build>

/usr/lib/systemd/system/docker.service文件在对应位置添加-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock
添加完后如下所示

# --insecure-registry 指定私有仓库地址   -H 指定build地址
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.199.199:5000 \
          -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock

maven编译命令使用

mvn clean package -Dmaven.test.skip=true docker:build

注意:如果pom.xml文件里面已经添加了build命令里面就不需要在添加docker:build参数,否则dockerfile文件会build两次。

批量停止删除容器脚本

operate="$1"
docker_name="$2"
if [ -z "$operate" ]; then
  echo "操作不能为空"
  echo "help"
  echo "stop docker_name 停止所有docker_name容器"
  echo "rm docker_name 删除所有docker_name容器"
  echo "rmi docker_name 删除所有docker_name镜像"
  exit
fi
if [ -z "$docker_name" ]; then
  echo "容器名称不能为空"
  exit
fi
if [ "$operate" = "stop" ]; then
  run_containers=$(docker ps | grep $docker_name | awk '{print $1}'|sed 's/%//g')
  if [ -z "$run_containers" ]; then
    echo "没有找到要停止的容器"
  else
    echo "停止容器"
    docker stop $run_containers
        echo "成功!"
  fi
elif [ "$operate" = "rm" ]; then
  all_containers=$(docker ps -a | grep $docker_name|awk '{print $1}'|sed 's/%//g')
    if [ -z "$all_containers" ]; then
      echo "没有找到要删除的容器"
    else
      echo "删除容器"
      docker rm $all_containers
          echo "成功!"
    fi
elif [ "$operate" = "rmi" ]; then
  docker_images=$(docker images | grep $docker_name|awk '{print $1":"$2}'|sed 's/%//g')
    if [ -z "$docker_images" ]; then
    echo "没有找到要删除的镜像"
  else
    echo "删除镜像"
    docker rmi $docker_images
        echo "成功!"
  fi
else
  echo "help"
  echo "stop docker_name 停止所有docker_name容器"
  echo "rm docker_name 删除所有docker_name容器"
  echo "rmi docker_name 删除所有docker_name镜像"
fi

远程启动容器

ssh ip
docker pull 192.168.199.199:5000/devops/webtest:1.0.0-SNAPSHOT
docker run -d -m 300m -p 8080:8080 --name=webtest-`date +%Y-%m-%d` --restart=always 192.168.199.199:5000/devops/webtest:1.0.0-SNAPSHOT
echo "运行成功!"
exit  ###退出远程机器
remotessh  ###结尾哦
echo '================结束远程启动================'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值