1. 程式人生 > >通過dockerfile釋出springweb工程並將映象上傳至私有倉庫

通過dockerfile釋出springweb工程並將映象上傳至私有倉庫

工程結構

檔案結構

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 '================結束遠端啟動================'