Docker-compose部署java項目
前置條件:
- 安裝docker
- 安裝docker-compose
- 防火牆啥的都設置好
dockerfile-demo
FROM java:8
VOLUME /tmp
WORKDIR /
ADD ./project-demo-1.0.0.jar project-demo.jar
RUN bash -c 'touch /project-demo.jar'
EXPOSE 8080
ENTRYPOINT ["java","-jar","/project-demo.jar"]
compose-project-demo.yaml
version: '3'
# 關於網絡,如果用到mysql或者redis,並且希望在同一個網絡,那么就可以直接使用同一個網絡名
# docker network create project-demo_bridge
networks:
project-demo_bridge:
driver: bridge
services:
project-demo:
container_name: project-demo
image: project-demo:1.0
restart: always
volumes:
# 同步時間
- /etc/localtime:/etc/localtime:ro
# 如果項目有些日志或者寫文件,需要同步到宿主機器,也需要定義相應的卷
- ./data:/etc/project-demo/data
- ./log:/etc/project-demo/log
ports:
- 8080:8080
networks:
- project-demo_bridge
start-project-demo.sh
#! /usr/bin/bash
PROJECT_NAME=project-demo
containerName=$PROJECT_NAME:1.0
imagesName=$PROJECT_NAME:1.0
# 定義一個名稱變量
network_name="$PROJECT_NAME_bridge"
filterName=`docker network ls | grep $network_name | awk '{ print $2 }'`
if [ "$filterName" == "" ]; then
# 不存在就創建
docker network create $network_name
echo "Created network $network_name success!!"
fi
existContainer=`docker inspect --format '{{.State.Running}}' ${containerName}`
function delExistImagesAndContainer() {
if [ "${existContainer}" == "true" ]; then
docker stop ${containerName}
echo "容器:${containerName}已停止"
docker rm ${containerName}
echo "容器:${containerName}已刪除"
docker rmi ${imagesName}
echo "鏡像:${containerName}已刪除"
fi
}
function buildJar(){
echo "正在構建jar鏡像"
# 其實這個構建指令是可以直接寫到compose的那個啟動文件中的
docker build -f dockerfile-$PROJECT_NAME -t $PROJECT_NAME:1.0 .
echo "鏡像構建完成"
echo "正在創建並啟動容器"
docker-compose -f ./compose-$PROJECT_NAME.yaml up -d
}
delExistImagesAndContainer
buildJar