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 '================结束远程启动================'