五、網絡管理
1、外部網絡如何通路容器應用
- 外部通路容器應用,是通過端口來實作的
#參數-p,指定端口,其中 8080是主控端的端口,80是容器的端口
docker run -d -p 8080:80 nginx
#參數-P(大寫),随機端口,随機範圍 32769-60999
docker run -d -P nginx
dockerfile的端口實作規則
(1)有開放 EXPOSE 8761
#參數-p,指定端口
docker run -d -p 8761:8761 --name=eureka registry-agan/eureka-server:1.0.0
#參數-P,随機端口( 達到的效果是0.0.0.0:32771->8761)
docker run -d -P --name=eureka registry-jackly/eureka-server:2.0.0
(2)沒有開放 EXPOSE 8761
#參數-p,指定端口(效果:正常)
docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0
#參數-P,随機端口( 達到的效果是,無端口号,連内部容器都沒有端口)
docker run -d -P --name=eureka registry-jackly/eureka-server:2.0.00
2、如何實作容器之間的網絡通信
-
業務場景為4個容器
mysql、eureka、product、config
- 安裝mysql
#啟動mysql容器
docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=agan \
-d mysql:5.7
#進入mysql容器
docker exec -it mysql /bin/bash
#docker鏡像沒有ifconfig、ping指令
apt-get update
apt install net-tools # ifconfig
apt install iputils-ping # ping
建立eureka容器
docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0
部署config鏡像和容器(加入config有問題,暫時未找到原因)
dockerfile:
#1.基礎鏡像:FROM指令:基礎鏡像名:tag,例如java:8
FROM java:8
#2.維護者:格式:MAINTAINER <name>
MAINTAINER jackly
#3.鏡像的操作指令
# ADD拷貝一個檔案到容器中,格式:ADD <src> <dest>
ADD config-server-0.0.1-SNAPSHOT.jar /app/service/config/data/app.jar
#5.配置容器啟動後,執行什麼指令
ENTRYPOINT ["java","-jar","/app/service/config/data/app.jar"]
建構鏡像
#其中 -t 對鏡像進行命名,一般的命名法:倉庫名字/鏡像名字:版本号
#注意:其中 .号,代表目前目錄下的dockerfile檔案
docker build -t registry-jackly/config-server:1.0.0 .
建立容器
#檢視本地鏡像
docker images
#啟動鏡像 link eureka:jacklyureka==>link 容器名稱:别名(将配置中心服務注冊到eureka)
docker run -d -p 9030:9030 --name config \
--link eureka:jacklyureka \
registry-jackly/config-server:1.0.0
#檢視config資訊
http://172.31.65.26:9030/e-book-product/deauflt
進入config容器
檢視eureka注冊資訊
部署product鏡像和容器
#1.基礎鏡像:FROM指令:基礎鏡像名:tag,例如java:8
FROM java:8
#2.維護者:格式:MAINTAINER <name>
MAINTAINER jackly
#3.鏡像的操作指令
# ADD拷貝一個檔案到容器中,格式:ADD <src> <dest>
ADD e-book-product-core-0.0.1-SNAPSHOT.jar /app/service/product/data/app.jar
#5.配置容器啟動後,執行什麼指令
ENTRYPOINT ["java","-jar","/app/service/product/data/app.jar"]
#其中 -t 對鏡像進行命名,一般的命名法:倉庫名字/鏡像名字:版本号
#注意:其中 .号,代表目前目錄下的dockerfile檔案
#檢視本地鏡像
docker images
#啟動鏡像 注:link就是容器直接的連接配接,你不用IP的情況下可以通過link來實作容器名之間的通信;它的文法是 link 容器名:别名
docker run -d -p 8083:8083 --name product \
--link mysql:jacklymysql \
--link eureka:jacklyeureka \
registry-jackly/product-server:1.0.0
#驗證效果
http://172.31.65.26:8761/
http://172.31.65.26:8083/product/findAllProduct
link原理
#原理就是在prodct容器中的hosts加了2條記錄。
docker exec -it product /bin/bash
cat /etc/hosts
六、資料管理
1、docker容器的資料如何共享給主控端
-
主控端檢視eureka日志
1)使用docker run volume方式實作
#建構鏡像
docker build -t registry-jackly/eureka-server:2.0.0 .
#建立容器
#就是把docker的資料儲存到主控端的磁盤中,通常說的就是挂載點,或者叫做卷。
#文法: -v 主控端目錄:容器目錄
docker run -d -p 8761:8761 --name=eureka \
--privileged=true \
-v /app/service/eureka/logs:/opt/data \
registry-jackly/eureka-server:2.0.0
2)使用dokcerfile方式實作
#1.基礎鏡像:FROM指令:基礎鏡像名:tag,例如java:8
FROM java:8
#2.維護者:格式:MAINTAINER <name>
MAINTAINER jackly
#3.加入挂載點
VOLUME /opt/data
#4.鏡像的操作指令
# ADD拷貝一個檔案到容器中,格式:ADD <src> <dest>
ADD eureka-server-0.0.1-SNAPSHOT.jar /app/service/eureka/data/app.jar
#5.告訴docker容器暴露端口,在容器啟動的時候,需要通過-p 做端口映射
EXPOSE 8761
#6.配置容器啟動後,執行什麼指令
ENTRYPOINT ["java","-jar","/app/service/eureka/data/app.jar"]
#重新建構eureka
docker build -t registry-jackly/eureka-server:3.0.0 .
#建立容器
docker run -d -p 8761:8761 --name=eureka \
--privileged=true \
registry-jackly/eureka-server:3.0.0
注意點:dockerfile volume 無法指定主控端的目錄,都是自動生成,而且是随機的;預設在/var/lib/docker/volumes/。
(為什麼是随機生成?因為dockerfile無法确定每台主控端是否都存在目錄)
#如何找到主控端的挂載目錄?
docker inspect eureka
#資訊段
"Mounts": [
{
"Type": "volume",
"Name": "cf527694ebafb92426a52f1916b26832b4c8977093083450a96fbccb3d866669",
"Source": "/var/lib/docker/volumes/cf527694ebafb92426a52f1916b26832b4c8977093083450a96fbccb3d866669/_data",
"Destination": "/opt/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
總結
docker run 是能指定主控端的目錄。
dockerfile volume 無法指定主控端的目錄,都是自動生成,而且是随機的;預設在/var/lib/docker/volumes/。
2、主控端如何直接維護docker容器的資料
在沒有使用-v挂載點時,建立的容器,在容器删除後,根據鏡像重新生成容器後,資料也随之流失。如果使用了挂載點,删除容器後,在根據鏡像生成容器,資料還會保留。
docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=agan \
--privileged=true \
-v /app/data/mysql:/var/lib/mysql \
-d mysql:5.7
七、鏡像倉庫管理系統搭建
搭建一個鏡像倉庫管理系統需要3個步驟,分别是:生成一個認證檔案,rsa的認證檔案;建立一個倉庫容器;建立一個倉庫web管理系統
- 生成一個認證檔案,rsa的認證檔案
#建立/app/registry-jackly/conf,在/app/registry-jackly目錄下執行 以下指令:
openssl req -new -newkey rsa:4096 -days 365 -subj "/CN=localhost" -nodes -x509 -keyout conf/auth.key -out conf/auth.cert
建立一個倉庫容器
#建立配置檔案/app/registry-jackly/conf/registry-jackly.yml
version: 0.1
#鏡像存儲地方
storage:
filesystem:
rootdirectory: /var/lib/registry
#鏡像的删除權限,enabled: true代表開啟删除權限
delete:
enabled: true
log:
level: info
#開啟倉庫的網絡,端口号為5000
http:
addr: 0.0.0.0:5000
#建立倉庫指令
docker run \
-v /app/registry-jackly/conf/registry-jackly.yml:/etc/docker/registry/config.yml:ro \
-v /app/registry-jackly/conf/auth.cert:/etc/docker/registry/auth.cert:ro \
-p 5000:5000 --name registry-docker -d \
--privileged=true \
建立一個倉庫web管理系統
#建立一個配置檔案:/app/registry-jackly/conf/registry-web.yml
registry:
# 指定registry的位址(注意:registry-docker為倉庫的容器名字)
url: http://registry-docker:5000/v2
#倉庫的名稱(注意:registry-docker為倉庫的容器名字)
name: registry-docker:5000
#是否為隻讀模式,設定true時,不允許删除鏡像
readonly: false
#權限驗證
auth:
#是否開啟驗證
enabled: true
#驗證證書的key
key: /conf/auth.key
#證書頒發者的名稱
issuer: docker
#建立倉庫web管理系統指令(注意:--link registry-docker很重要,沒有的話,無法連接配接倉庫。)
docker run \
-v /app/registry-jackly/conf/registry-web.yml:/conf/config.yml:ro \
-v /app/registry-jackly/conf/auth.key:/conf/auth.key \
-v /app/registry-jackly/db:/data \
-d -p 8080:8080 --link registry-docker --name registry-web \
--privileged=true \
hyper/docker-registry-web
效果驗證
#登入倉庫管理系統
http://172.31.65.26:8080/login/auth
使用者名=admin
密碼 =admin
#建構鏡像
#其中 -t 對鏡像進行命名,一般的命名法:倉庫名字/鏡像名字:版本号
#注意:其中 .号,代表目前目錄下的dockerfile檔案
docker build -t registry-docker:5000/eureka-server:3.0.0 .
#修改hosts(vi /etc/hosts)
127.0.0.1 registry-docker
#給搭建好的倉庫加個鏡像
docker push registry-docker:5000/eureka-server:3.0.0
#權限設定
預設admin使用者是沒有删除權限,需要重新建立使用者,并且給予權限。
八、maven建構springcloud鏡像
在先前建構項目時,先通過maven打包出jar,在手動上傳到虛拟機上,并編寫dockerfile檔案,在使用docker build指令建構鏡像,比較繁瑣。實際上可以通過maven來直接建構springcloud鏡像,maven建構springcloud鏡像推送給倉庫,需要2步驟:開啟docker遠端API;編寫maven的docker插件。
開啟docker遠端API
#在配置檔案中,加入:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
vi /usr/lib/systemd/system/docker.service
#重新開機docker
systemctl daemon-reload
systemctl restart docker
#驗證docker遠端api是否生效
netstat -anp|grep 2375
curl 127.0.0.1:2375/info
編寫maven的docker插件
#本地配置hosts(c:\windows\system32\drivers\etc)
172.31.65.26 registry-docker
#docker maven插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 添加docker maven插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<!-- 推送到指定的倉庫 -->
<registryUrl>registry-docker:5000</registryUrl>
<!-- 開啟docker遠端API的端口 -->
<dockerHost>http://registry-docker:2375</dockerHost>
<!-- 指定鏡像名稱 格式:倉庫域名:端口/鏡像名字:鏡像的版本号 -->
<imageName>registry-docker:5000/${project.artifactId}:${project.version}</imageName>
<!-- 指定基礎鏡像 類似dockerfile的FROM指令 -->
<baseImage>java:8</baseImage>
<!-- 配置容器啟動後,執行什麼指令,等于與 dockerfile的ENTRYPOINT -->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!-- 為dockerde tag指定版本号、latest -->
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<!-- 是否有push的功能 true代表有 -->
<pushImage>true</pushImage>
<!-- push後是否覆寫已存在的标簽鏡像 -->
<forceTags>true</forceTags>
<!-- 複制jar包到docker容器指定的目錄 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 指定要複制jar包的根目錄,${project.build.directory}代表 target的目錄 -->
<directory>${project.build.directory}</directory>
<!-- 指定要複制的檔案,${project.build.finalName}代表打包後的jar -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
#執行指令
clean package -DskipTests docker:build
驗證效果
九、編排建構springcloud執行個體
什麼是compose為什麼要使用compose
因為運作一個docker鏡像,通常是需要docker run 指令,在運作鏡像的時候還需要一定的參數 ;例如 容器的名稱 映射的卷,綁定端口等等,非常麻煩。那如果有個一個檔案來記錄儲存這些指令該多好? 是以compose就是用于存儲這些指令,而且呢是比docker run還要簡單存儲。那compose是什麼呢? 它既是一個yaml格式的檔案,例如docker-compose.yml檔案。
#安裝最新compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#添加可執行權限
chmod +x /usr/local/bin/docker-compose
#測試安裝結果
docker-compose --version
自動建構spring cloud注冊中心eureka
建立一個網絡
建立指令:docker network create dockernet
檢視指令:docker network ls
compose内容:
#docker compse 的配置檔案包含3大部分:version services networks
version: '3'
services:
# 服務名稱
eureka:
# 容器名稱
container_name: eureka
# 鏡像名稱
image: registry-docker:5000/eureka-server:0.0.1-SNAPSHOT
# 暴露的端口号
ports:
- "8761:8761"
# 設定卷挂載的路徑 /opt/data代表的是日志存儲路徑
volumes:
- /app/service/eureka/logs:/opt/data
# 設定權限 :擁有root權限
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
運作指令
docker-compose -f docker-compose-eureka.yml up -d
示範效果
http://172.31.65.26:8761/
自動建構spring cloud 配置中心config
compose内容
ersion: '3'
services:
config-server:
container_name: config-server
image: registry-docker:5000/config-server:0.0.1-SNAPSHOT
ports:
- "9030:9030"
networks:
- default
networks:
default:
external:
name: dockernet
docker-compose -f docker-compose-config.yml up -d
http://172.31.65.26:9030/e-book-product/default
自動建構spring cloud 調用鍊zipkin
version: '3'
services:
zipkin-server:
container_name: zipkin-server
image: registry-docker:5000/zipkin-server:0.0.1-SNAPSHOT
ports:
- "9411:9411"
networks:
- default
networks:
default:
external:
name: dockernet
docker-compose -f docker-compose-zipkin.yml up -d
http://172.31.65.26:9411
自動建構spring cloud 日志系統ELK
version: '3'
services:
elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:6.1.1
command: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
privileged: true
networks:
- default
logstash:
container_name: logstash
image: docker.elastic.co/logstash/logstash:6.1.1
command: logstash -f /etc/logstash/conf.d/logstash.conf
volumes:
# 挂載logstash配置檔案
- /app/service/logstash/config:/etc/logstash/conf.d
- /app/service/logstash/build/:/opt/build/
ports:
- "6000:5000"
privileged: true
networks:
- default
kibana:
container_name: kibana
image: docker.elastic.co/kibana/kibana:6.1.1
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
ports:
- "5601:5601"
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
logstash.conf存放在/app/service/config下
# For detail structure of this file
# Set: https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
input {
# For detail config for log4j as input,
# See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
tcp {
mode => "server"
host => "logstash" #logstash容器名稱
port => 9250
}
}
filter {
#Only matched data are send to output.
}
output {
# For detail config for elasticsearch as output,
# See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
elasticsearch {
action => "index" #The operation on ES
hosts => "elasticsearch:9200" #ElasticSearch host, can be array. elasticsearch容器名稱
index => "applog" #The index to write data to.
}
}
docker-compose -f docker-compose-elk.yml up -d
如果elasticsearch 報這個錯誤
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決方案:sudo sysctl -w vm.max_map_count=262144
#建立一個索引
curl -XPUT http://172.31.65.26:9200/applog
#進入elk頁面
http://172.31.65.26:5601/app/kibana
自動建構product 服務
第一步:自動建構 mysql 微服務
# Docker Compose 配置檔案,包含3大部分 version、services、networks
version: '3'
services:
# 服務名稱
mysql:
# 容器名稱
container_name: mysql
# 鏡像名稱
image: mysql:5.7
# 暴露端口
ports:
- "3306:3306"
# 設定卷挂載路徑
volumes:
- /app/data/mysql:/var/lib/mysql
# 環境變量
environment:
MYSQL_USER: root
MYSQL_PASSWORD: agan
MYSQL_ROOT_PASSWORD: agan
# 設定權限 :擁有root權限
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
#啟動mysql容器
docker-compose -f docker-compose-mysql.yml up -d
第二步:自動建構 product 微服務
#docker-compose-product.yml
version: '3'
services:
product:
container_name: e-book-product
image: registry-docker:5000/e-book-product-core:0.0.1-SNAPSHOT
ports:
- "8083:8083"
# 設定權限 :擁有root權限
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
#啟動容器
docker-compose -f docker-compose-product.yml up -d
第三步:示範效果
#看注冊中心
http://172.31.65.26:8761/
#産品查詢接口
http://172.31.65.26:8083/product/findAllProduct
#看日志
http://172.31.65.26:5601/app/kibana
#調用鍊
http://172.31.65.26:9411/
自動建構自動建構 user order trade consumer 微服務
第一步:建構相關服務
#docker-compose-service.yml
version: '3'
services:
product:
container_name: e-book-product
image: registry-docker:5000/e-book-product-core:0.0.1-SNAPSHOT
ports:
- "8083:8083"
networks:
- default
user:
container_name: e-book-user
image: registry-docker:5000/e-book-user-core:0.0.1-SNAPSHOT
ports:
- "8084:8084"
networks:
- default
order:
container_name: e-book-order
image: registry-docker:5000/e-book-order-core:0.0.1-SNAPSHOT
ports:
- "8085:8085"
networks:
- default
trade:
container_name: e-book-trade
image: registry-docker:5000/e-book-trade-core:0.0.1-SNAPSHOT
ports:
- "8086:8086"
networks:
- default
consumer:
container_name: e-book-consumer-order
image: registry-docker:5000/e-book-consumer-order:0.0.1-SNAPSHOT
ports:
- "8090:8090"
networks:
- default
networks:
default:
external:
name: dockernet
#啟動容器指令
docker-compose -f docker-compose-service.yml up -d
第二步:示範效果
#看注冊中心
http://172.31.65.26:8761/
#産品查詢接口
http://172.31.65.26:8083/product/findAllProduct
#建立訂單
http://172.31.65.26:8090/createOrder
#看日志
http://172.31.65.26:5601/app/kibana
#調用鍊
http://172.31.65.26:9411/
自動建構spring cloud 網關zuul
第一步:建構zuul服務
#docker-compose-zuul.yml
version: '3'
services:
zuul-gateway:
container_name: zuul-gateway
image: registry-docker:5000/zuul-gateway:0.0.1-SNAPSHOT
ports:
- "9010:9010"
# 設定權限 :擁有root權限
privileged: true
networks:
- default
networks:
default:
external:
name: dockernet
#啟動容器
docker-compose -f docker-compose-zuul.yml up -d
————————————————
版權聲明:本文為CSDN部落客「飄渺Jam」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/jianzhang11/article/details/117918220
http://172.31.65.26:9010/e-book-consumer-order/createOrder
http://172.31.65.26:9010/e-book-product/product/findAllProduct