最近須要打包項目給成員們進行測試,但打包運行後很影響開發,因而打算使用docker
模擬生產環境運行打包後的項目,這樣就能既開發,又能給成員進行測試了。
因爲原項目過大,打算先拿軟件工程的大實驗試試水,軟件工程大實驗使用的是spring-boot,redis,mysql,angular,nginx
這些環境,先試了試後臺的spring-boot,redis,mysql
的docker
搭建。java
compose
項目是Docker官方的開源項目,負責實現對Docker容器集羣的快速編排。compose
定位是定義和運行多個docker容器的應用。
咱們都知道,使用一個Dockerfile
模版文件就能夠建立一個應用容器,但一般在一個項目中,須要多個應用容器,就像個人後臺,同時須要jdk8
、redis
、mysql
這些應用。docker-compose
恰好知足了這樣的需求。它容許用戶經過一個單獨的docker-compose.yml
模版文件來定義一組相關聯的應用容器爲一個項目。mysql
compose
中兩個重要的概念:react
- 服務(service):一個應用的容器,實際能夠包括若干運行相同鏡像的容器實例。
- 項目(project):由一組關聯的應用容器組成的一個完整的業務單元,在
docker-compose.yml
文件中定義。
服務就是咱們須要的docker
容器,項目就是由許多服務構成的,瞭解了docker-compose
以後就能夠進行環境搭建了。nginx
爲了編譯spring-boot
,基於如下流程:redis
jdk8
鏡像spring-boot
下的mvnw、pom.xml
複製到容器中,導入maven依賴src
目錄下的源碼複製到容器中,使用maven
打包spring-boot項目jre8
環境運行項目構建的Dockerfile
文件:spring
#### 創建spring-boot項目 FROM openjdk:8-jdk-alpine as build # 設置項目在docker容器中工做目錄 WORKDIR /app # 將 maven 可執行程序複製到容器中 COPY mvnw . COPY .mvn .mvn # 複製pom.xml文件 COPY pom.xml . # 導入全部maven依賴 RUN ./mvnw dependency:go-offline -B # 複製項目源代碼 COPY src src # 打包應用程序 RUN ./mvnw package -DskipTests RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar) #### 設置能運行應用程序的最小docker容器 FROM openjdk:8-jre-alpine ARG DEPENDENCY=/app/target/dependency # Copy project dependencies from the build stage COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","com.xiang.airTicket.AirTicketApplication"]
完成了spring-boot的容器構建後,就可使用docker-compose
集成spring-boot、redis、mysql
容器了。具體思路:sql
docker-compose.yml
文件:docker
version: '3.7' # 定義服務 services: # spring-boot服務 app-server: build: context: . # 配置須要構建Dockerfile的路徑 相對於docker-compose.yml dockerfile: Dockerfile ports: - "8080:8080" # 將本機8080端口映射到容器8080端口 restart: always depends_on: - db # 須要依賴的服務 率先構建 - redis environment: # 設置環境變量 SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/airTicket?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: 123456 SPRING_REDIS.HOST: redis networks: # 網絡 鏈接mysql和redis - backend db: image: mysql:5.6 ports: - "3306:3306" restart: always environment: MYSQL_DATABASE: airTicket MYSQL_USER: htx MYSQL_PASSWORD: 123456 MYSQL_ROOT_PASSWORD: 123456 volumes: - db-data:/var/lib/mysql networks: - backend redis: image: redis command: [ "redis-server", "--protected-mode", "no" ] hostname: redis ports: - "6379:6379" networks: - backend volumes: db-data: networks: backend:
使用docker-compose build
構建項目容器:
使用docker-compose up
啓動容器:
當成功看到spring-boot啓動成功的日誌,就成功配置好了。網絡
此次只構建了後臺,但願能把前臺的angular、nginx
也構建完畢,爭取一條docker
命令,就直接啓動應用程序。app