微服務架構電商開發Docker部署從零起步之[004]:配置微服務的docker開發及其部署環境

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章