Docker編譯啓動入口 spring-cloud-store/run.sh
#!/usr/bin/env bash
set -e
# Build the project and docker images
mvn clean install
# Export the active docker machine IP
export DOCKER_IP=$(docker-machine ip $(docker-machine active))
# docker-machine doesn't exist in Linux, assign default ip if it's not set
DOCKER_IP=${DOCKER_IP:-0.0.0.0}
# Remove existing containers
docker-compose stop
docker-compose rm -f
# Start the config service first and wait for it to become available
docker-compose up -d config-service
while [ -z ${CONFIG_SERVICE_READY} ]; do
echo "Waiting for config service..."
if [ "$(curl --silent $DOCKER_IP:8888/actuator/health 2>&1 | grep -q '\"status\":\"UP\"'; echo $?)" = 0 ]; then
CONFIG_SERVICE_READY=true;
fi
sleep 2
done
# Start the discovery service next and wait
docker-compose up -d discovery-service
while [ -z ${DISCOVERY_SERVICE_READY} ]; do
echo "Waiting for discovery service..."
if [ "$(curl --silent $DOCKER_IP:8761/actuator/health 2>&1 | grep -q '\"status\":\"UP\"'; echo $?)" = 0 ]; then
DISCOVERY_SERVICE_READY=true;
fi
sleep 2
done
# Start the other containers
docker-compose up -d
# Attach to the log output of the cluster
docker-compose logs
微服務部署在Docker上的啓動順序由 spring-cloud-store/docker-compose.yml 來定義:
config-service:
image: zigoo/config-service
environment:
- SPRING_PROFILES_ACTIVE=docker
- DOCKER_IP=$DOCKER_IP
ports:
- 8888:8888
mysql:
image: mysql:5.7
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=dbpass
- MYSQL_DATABASE=dev
neo4j:
image: neo4j:2.3
ports:
- 7474:7474
environment:
- NEO4J_AUTH=none
mongo:
image: mongo:3.3
ports:
- 27017:27017
redis:
image: redis:3.0
ports:
- 6379:6379
discovery-service:
image: zigoo/discovery-service
ports:
- 8761:8761
environment:
- SPRING_PROFILES_ACTIVE=docker
- DOCKER_IP=$DOCKER_IP
spring-cloud-store/pom.xml 定義docker編譯版本還有鏡像文件的前綴zigoo(例如:zigoo/config-service)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.contoso</groupId>
<artifactId>spring-cloud-store</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>spring-cloud-store</name>
<description>Create a Maven Project for Store</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<docker.image.prefix>zigoo</docker.image.prefix>
<docker.plugin.version>1.1.1</docker.plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<modules>
<module>config-service</module>
<module>discovery-service</module>
</modules>
</project>
config-service工程相關的配置信息:
spring-cloud-store/config-service/src/main/docker/Dockerfile
FROM anapsix/alpine-java:8
VOLUME /tmp
ADD config-service-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
spring-cloud-store/config-service/manifest.yml
---
applications:
- name: config-service
memory: 512M
instances: 1
host: config-service-${random-word}
path: target/config-service-0.0.1-SNAPSHOT.jar
env:
SPRING_PROFILES_ACTIVE: cloud
DEBUG: "true"
debug: "true"
spring-cloud-store/config-service/src/main/resources/bootstrap.yml
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: https://github.com/zhengzizhi/spring-cloud-store-config.git
spring-cloud-store/config-service/pom.xml 注意<build> 部分的定義
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.contoso</groupId>
<artifactId>spring-cloud-store</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../</relativePath>
</parent>
<artifactId>config-service</artifactId>
<name>config-service</name>
<description>Create a Maven Module for Config Service</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.plugin.version}</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
discovery-service工程相關的配置信息:
spring-cloud-store/discovery-service/src/main/docker/Dockerfile
FROM anapsix/alpine-java:8
VOLUME /tmp
ADD discovery-service-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
spring-cloud-store/discovery-service/manifest.yml
---
applications:
- name: discovery-service
memory: 512M
instances: 1
host: discovery-service-${random-word}
path: target/discovery-service-0.0.1-SNAPSHOT.jar
env:
SPRING_PROFILES_ACTIVE: cloud
DEBUG: "true"
debug: "true"
spring-cloud-store/discovery-service/src/main/resources/bootstrap.yml
server:
port: 8761
spring:
application:
name: discovery-service
---
spring:
profiles: docker
cloud:
config:
uri: http://${DOCKER_IP:192.168.99.100}:8888
spring-cloud-store/discovery-service/pom.xml 注意<build> 部分的定義
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.contoso</groupId>
<artifactId>spring-cloud-store</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../</relativePath>
</parent>
<artifactId>discovery-service</artifactId>
<name>discovery-service</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.plugin.version}</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
運行部署整個工程
$ docker-machine rm default
$ docker-machine create default --driver virtualbox --virtualbox-memory "11000" --virtualbox-disk-size "30000"
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env default)
$ cat >> /etc/profile
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Running tcp://192.168.99.100:2376 v18.06.0-ce
$ eval $(docker-machine env default)
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v18.06.0-ce
$ virtualbox
$ cd /opt/codes/spring-cloud-store && sh run.sh
發佈微服務鏡像到https://hub.docker.com/
docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0bc570eca532 mongo:3.3 "/entrypoint.sh mong…" 10 seconds ago Up 9 seconds 0.0.0.0:27017->27017/tcp spring-cloud-store_mongo_1
91f8ab0ef9d5 mysql:5.7 "docker-entrypoint.s…" 10 seconds ago Up 9 seconds 0.0.0.0:3306->3306/tcp spring-cloud-store_mysql_1
e631d13dfd2f redis:3.0 "docker-entrypoint.s…" 10 seconds ago Up 9 seconds 0.0.0.0:6379->6379/tcp spring-cloud-store_redis_1
d322e0afb80d neo4j:2.3 "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 7473/tcp, 0.0.0.0:7474->7474/tcp spring-cloud-store_neo4j_1
d3a4f7a1bb82 zigoo/discovery-service "java -Djava.securit…" 10 seconds ago Up 9 seconds 0.0.0.0:8761->8761/tcp spring-cloud-store_discovery-service_1
3c264dcacfdf zigoo/config-service "java -Djava.securit…" 10 seconds ago Up 9 seconds 0.0.0.0:8888->8888/tcp spring-cloud-store_config-service_1
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zigoo
Password: pass1234
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
$ docker push zigoo/config-service
The push refers to repository [docker.io/zigoo/config-service]
1cbd9cfec2f6: Pushed
8a3a6492a95b: Pushed
ad0b3bf520dd: Mounted from anapsix/alpine-java
cd7100a72410: Mounted from anapsix/alpine-java
latest: digest: sha256:197f92c8886eba4b72658bda3a8a97c7bad8a6b8cddaa73e192b7d2389ba65a0 size: 1164
$ docker push zigoo/discovery-service
The push refers to repository [docker.io/zigoo/discovery-service]
7c3b5acfb428: Pushed
c67c3ccd72d1: Pushed
ad0b3bf520dd: Mounted from zigoo/config-service
cd7100a72410: Mounted from zigoo/config-service
latest: digest: sha256:848d1e9bdd3bfa13b65f85ef4db0831d729c4b9637fe18ea3939c51dcd108ad8 size: 1164
如何刪除已經發布到https://hub.docker.com/倉庫中鏡像
cd /opt/codes/spring-cloud-store && docker-compose stop && docker-compose rm -f 刪除所有容器鏡像
cd /opt/codes/spring-cloud-store && docker-compose up -d 啓動所有容器服務
配置服務服務器監控&健康檢查:
$ curl -i http://192.168.99.100:8888/actuator
HTTP/1.1 200
Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 01 Aug 2018 14:47:01 GMT
{
"_links": {
"self": {
"href": "http://192.168.99.100:8888/actuator",
"templated": false
},
"health": {
"href": "http://192.168.99.100:8888/actuator/health",
"templated": false
},
"info": {
"href": "http://192.168.99.100:8888/actuator/info",
"templated": false
}
}
}
$ curl -i http://192.168.99.100:8888/actuator/health
HTTP/1.1 200
Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 01 Aug 2018 14:52:11 GMT
{"status":"UP"}
完整的配置服務器和發現服務器項目樹形結構截圖:
[root@contoso ~]# mysql -uroot -h192.168.99.100 -pdbpass // 測試鏈接一下容器上MySQL服務器
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.23 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dev |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.001 sec)
MySQL [(none)]>
在瀏覽器裏輸入 http://192.168.99.100:7474 測試鏈接一下 Neo4j數據庫
打包上傳源碼
cd /opt/codes/spring-cloud-store && mvn clean && cd ..
zip -r spring-cloud-store-v1.zip ./spring-cloud-store
sz spring-cloud-store-v1.zip //將源碼文件發送到windows系統然後上傳到我的blog空間,或者直接從Linux系統瀏覽器上直接上傳源碼到我的blog空間
spring-cloud-store-v1.zip 電商源碼:https://download.csdn.net/download/zhengzizhi/10579561