且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

史上最详细的docker学习手册,请查收!(二)

更新时间:2022-05-26 00:33:03

五、网络管理


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容器


史上最详细的docker学习手册,请查收!(二)


查看eureka注册信息


史上最详细的docker学习手册,请查收!(二)


部署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


史上最详细的docker学习手册,请查收!(二)


七、镜像仓库管理系统搭建


搭建一个镜像仓库管理系统需要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



史上最详细的docker学习手册,请查收!(二)


#在配置文件中,加入:-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

验证效果


史上最详细的docker学习手册,请查收!(二)


九、编排构建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

史上最详细的docker学习手册,请查收!(二)

史上最详细的docker学习手册,请查收!(二)

史上最详细的docker学习手册,请查收!(二)