通過dockerfile釋出springweb工程並將映象上傳至私有倉庫
阿新 • • 發佈:2018-12-23
工程結構
dockerfile檔案內容
# 這個映象的基礎映象是alpine
FROM alpine
# 作者
MAINTAINER test.com "[email protected]"
# 配置社群源
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 '================結束遠端啟動================'