五、网络管理
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镜像和容器
dockerfile:
#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
compose内容
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
compose内容
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