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

发表于 2年以前  | 总阅读数:262 次

一、docker入门

1、docker的安装及入门示例

  • 环境准备:docker需要安装在centos7 64位系统上;docker要求系统内核在3.10以上

  • 查看系统内核:

    uname -r
    
  • 安装命令:

    yum -y install docker-io
    
  • 安装完成后,启动命令

    service docker start
    
  • 安装nginx体验

    docker run -p 80:80 -d nginx
    

2、doker的理论概念

  • 什么是docker:

    鲸鱼通过身上的集装箱(Container)来将不同种类的货物进行隔离;而不是通过生出很多小鲸鱼(Guest OS)来承运不同种类的货物。Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

    物理机、虚拟机、docker的形象对比

    这是物理机:一栋楼一户人家、独立地基、独立花园。

    这是虚拟机:一栋楼包含多套房子,一套房一户人家,共享地基、共享花园,独立卫生间、厨房、宽带

    这是docker容器:一套房隔离成多个小空间俗称胶囊公寓,每个胶囊住一个租客,共享地基、花园、卫生间、厨房、宽带等等

  • docker和虚拟机的对比
docker 虚拟机
运行环境 docker构建在操作系统上,所以docker甚至可以在虚拟机上运行 虚拟化技术依赖物理CPU和内存,是硬件级别的
隔离性 docker属于进程之间的隔离 虚拟机可实现系统级别隔离
安全性 Docker的租户root和宿主机root等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。 故:docker的安全性也更弱 虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机利用硬件隔离:如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互 虚拟机的安全性高
可管理性 docker的集中化管理工具还不算成熟。 各种虚拟化技术都有成熟的管理工具,例如VMware vCenter提供完备的虚拟机管理能力。
快速创建、删除 Docker容器创建是秒级别的,Docker的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。 虚拟化创建是分钟级别的
交付、部署 Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署; 虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;
  • docker的架构原理

derver daemon:docker server是一个守护进程,它可以部署远程也可以部署本地。它包含2部分网络newtwork和磁盘data volumes

REST API: 实现了client和server间的通信交互协议

CLI(command line interface): docker client ,它包含2部分容器和镜像,1个镜像可以创建N个容器(container)

Image: 一个只读的镜像模板。可以自己创建一个镜像也可以从网站上下载镜像供自己使用。

Container:由docker client通过镜像创建的实例,用户在容器中运行应用,一旦创建后就可以看做是一个简单的操作系统,每个应用运行在隔离的容器中,享用独自的权限,用户,网络。

Registry:镜像仓库,用来存储和管理image镜像,目前主流的仓库有Docker hub、阿里云镜像仓库,也可以自己创建仓库来管理。

说明:docker client 通过3个命令,先到docker daemon pull拉取images,如果服务端没有,先到仓库拉取,(如果仓库没有你可以build自建images);最后通过run命令创建容器

二、镜像管理

1、什么是镜像

  • 一个只读的模板,就是一个dockerfile,可以在镜像仓库上传或下载
  • 先有镜像,后有容器;并且一个镜像可以创建多个容器。
  • docker镜像最大的特点:分层结构。 最底层是一个base层,也即是一个操作系统层。它还会从base层一层层的叠加生成(什么是层层叠加?例如,安装一个软件,它就会在base层的基础上追加一层。它的好处就是资源共享)。

2、镜像相关命令

  • 查看docker本地的镜像

    docker images
    

    搜索一个镜像

    docker search mysql
    

    INDEX :仓库地址 NAME :仓库+名称 STARS :用户的喜欢程度 OFFICIAL:是否为官方,如果为OK的话代表官方,可信度高,放心使用 UTOMATED:是否为公开的dockerfile脚本制成的?也即是说dockerfile是否提供。

  • 下载一个镜像

    docker pull mysql:5.7
    

    下载完后,查看是否在本地 docker images

  • 删除docker镜像

    docker rmi [imageID]
    # 如果要删除全部镜像 
    docker rmi $(docker images -q)
  • 加速器的配置

    #centos的阿里云加速器命令
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://uqxmqcrw.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker

3、dockerfile

  • dockerfile概念

    dockerfile是一个文本的配置文件,它可以快速创建自定义的镜像,文本内容包含了若干的命令行,并支持#作为注释行,文本格式包含基础镜像FROM,维护者MAINTAINER,操作指令ADD,容器启动后指令等共计4部分

  • dockerfile文件示例

  #1.基础镜像:FROM指令:基础镜像名:tag,例如java:8
FROM java:8

#2.维护者:格式:MAINTAINER <name>
MAINTAINER jackly

#3.镜像的操作指令
# ADD拷贝一个文件到容器中,格式:ADD <src> <dest>
ADD eureka-server-0.0.1-SNAPSHOT.jar  /app/service/eureka/data/app.jar

#告诉docker容器暴露端口,在容器启动的时候,需要通过-p 做端口映射
EXPOSE 8761

#5.配置容器启动后,执行什么命令
ENTRYPOINT ["java","-jar","/app/service/eureka/data/app.jar"]
  • 构建docker镜像

    #其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号
    #注意:其中 .号,代表当前目录下的dockerfile文件
    docker build -t registry-jackly/eureka-server:1.0.0 .
  • 查看和运行镜像容器

    #查看本地镜像
    docker images
    #启动镜像
    docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0

三、镜像仓库管理

1、建设dockerhub官方仓库

  • 什么是镜像仓库

    就是存放镜像的地方

  • 推送镜像到dockerhub(需翻墙)

    ①、登录 https://hub.docker.com/,创建一个eureka-server仓库
    ②、本地linux登录docker官方, docker login
    ③、改镜像的名,(为什么要改?因为docker官方镜像仓库是以 用户名 来命名仓库的)
     docker tag registry-jackly/eureka-server:1.0.0 jacklydocker/eureka-server:1.0.0
    ④、推送镜像到官方仓库
     docker push jacklydocker/eureka-server:1.0.0
    ⑤、拉取上传的镜像
     先删除旧镜像:docker rmi jacklydocker/eureka-server:1.0.0
     拉取镜像:docker pull jacklydocker/eureka-server:1.0.0
     创建容器:docker run -d -p 8761:8761 --name=eureka docker.io/jacklydocker/eureka-server:1.0.0

2、建设阿里云docker仓库

  • 推送镜像到阿里云仓库

    ①、登录阿里云,先创建命名空间,并建个镜像仓库
    ②、本地linux登录登录阿里云Docker Registry, docker login --username=你的用户名 registry.cn-shenzhen.aliyuncs.com
    ③、改镜像的名,(为什么要改?因为docker官方镜像仓库是以 用户名 来命名仓库的)
     docker tag 58acc264425c registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0
    ④、推送镜像到阿里云仓库
     docker push registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0
    ⑤、拉取上传的镜像
     docker pull registry.cn-shenzhen.aliyuncs.com/jackly/eureka-server:1.0.0

3、建设本地仓库

  • 为什么需要搭建本地仓库

    (1).节约带宽:因为如果用docker或阿里云官方的仓库走的互联网浪费带宽,而且慢。 (2).提供资源利用和安全:因为公司内部的镜像,推送到本地仓库,更方便公司内部人员用,而且安全性高。

  • 创建仓库容器

    #查找官方仓库
    docker search registry
    #拉取仓库镜像
    docker pull registry
    #运行仓库容器
    docker run -d -p 5000:5000 \
    --restart=always \
    --privileged=true \
    --name=registry-local-jackly \
    -v /date/volume/registry:/var/lib/registry \
    registry
  • 推动镜像到本地私有仓库

    ①、改镜像的名
     docker tag 58acc264425c reg.qxbdocker.com:5000/eureka-server:1.0.0
    ②、推送镜像到私有仓库(注意:记得改本地hosts:127.0.0.1 reg.qxbdocker.com)
     docker push reg.qxbdocker.com:5000/eureka-server:1.0.0
    ③、查看搭建仓库的信息
     查看仓库的镜像:
      curl -X GET http://127.0.0.1:5000/v2/_catalog
     仓库仓库某个镜像的版本信息:
      curl -X GET http://127.0.0.1:5000/v2/eureka-server/tags/list
    ⑤、拉取上传的镜像
    #先删除本地镜像
    docker rmi reg.qxbdocker.com:5000/eureka-server:1.0.0
    #在拉取仓库中的镜像
      docker pull reg.qxbdocker.com:5000/eureka-server:1.0.0

四、容器管理

1、容器的生命周期实践

  • 什么是容器

    容器类似于胶囊公寓,它是一个精简版的操作系统,一般容器中只运行一个应用(例如:eureka-server镜像)。

  • 如何创建容器

    通过镜像创建容器,通过docker run命令创建。

  • 容器的作用

    容器起到了隔离的作用,独享空间、网络等等。

  • doker命令

    docker run --help
    -d, --detach=false         指定容器运行于前台还是后台,默认为false
    -i, --interactive=false    打开STDIN,用于控制台交互
    -t, --tty=false            分配tty设备,该可以支持终端登录,默认为false
    -u, --user=""              指定容器的用户
    -a, --attach=[]            登录容器(必须是以docker run -d启动的容器)
    -w, --workdir=""           指定容器的工作目录
    -c, --cpu-shares=0         设置容器CPU权重,在CPU共享场景使用
    -e, --env=[]               指定环境变量,容器中可以使用该环境变量
    -m, --memory=""            指定容器的内存上限
    -P, --publish-all=false    指定容器暴露的端口
    -p, --publish=[]           指定容器暴露的端口
    -h, --hostname=""          指定容器的主机名
    -v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录
    --volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录
    --cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
    --cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
    --cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
    --device=[]                添加主机设备给容器,相当于设备直通
    --dns=[]                   指定容器的dns服务器
    --dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
    --entrypoint=""            覆盖image的入口点
    --env-file=[]              指定环境变量文件,文件格式为每行一个环境变量
    --expose=[]                指定容器暴露的端口,即修改镜像的暴露端口
    --link=[]                  指定容器间的关联,使用其他容器的IP、env等信息
    --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用
    --name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
    --net="bridge"             容器网络设置:
                                 bridge 使用docker daemon指定的网桥
                                 host    //容器使用主机的网络
                                 container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源
                                 none 容器使用自己的网络(类似--net=bridge),但是不进行配置
    --privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities
    --restart="no"             指定容器停止后的重启策略:
                                 no:容器退出时不重启
                                 on-failure:容器故障退出(返回值非零)时重启
                                 always:容器退出时总是重启
    --rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
    --sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
  • docker创建示例

    docker run -d -p 5000:5000 \
    --restart=always \
    --privileged=true \
    --name=registry-local-jackly \
    -v /date/volume/registry:/var/lib/registry \
    registry
  • docker常用命令

    #查看正在运行的容器
    docker ps
    #查看所有的容器(包括已经停止的容器)
    docker ps -a
    #停止容器
    docker stop 容器ID
    #强制停止容器
    docker kill 容器ID
    #启动容器
    docker start 容器ID
    #重启容器
    docker restart 容器ID
    #删除已经停止的容器
    docker rm 容器ID
    #删除正在运行的容器,强制删除
    docker rm -f 容器ID
    

2、如何进入容器内部

  • 进入容器的方式

    有4种方式能进入容器,分别为 exec、docker attach、ssh、nsenter. 这4种都能进入容器,但是最好用最常用的是exec

  • exec命令

    docker exec --help
    -d 以后台方式执行,这样,我们执行完这条命令,还可以干其他事情,写脚本最常用
    -e 代表环境变量
    -i 以交互方式运行,是阻塞式的
    -t 分配一个伪终端,这个参数通常与-i参数一起使用,然后在后面跟上容器里的/bin/bash,这样就把我们带到容器里去了。
    -u 指定进入的容器以哪个用户登陆,默认是root
  • 进入容器命令

    #启动镜像,若镜像容器已经创建,则通过docker ps -a查询停止的容器id,在通过docker start 容器ID  启动容器
    docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0
    #进入容器的相关命令
    docker exec -it eureka sh
    #进入后可以使用ls查看目录(/app/service/eureka/data/app.jar)
    docker exec -it eureka /bin/bash
    docker exec -it eureka pwd
    docker exec -it eureka top

3、容器内容改变后,能否重新生成镜像

  • 使用ll命令验证

    ①、进入容器:docker exec -it eureka /bin/bash
    ②、修改容器内容:echo "alias ll='ls -l'" >> ~/.bashrc && source ~/.bashrc
    ③、验证ll命令:ll
    ④、强制删除容器:docker rm -f 容器ID
    ⑤、启动镜像容器:docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0
    ⑥、进入容器使用ll命令:发现先前修改的实效
  • 修改容器后,重新生成镜像

    ①、进入容器:docker exec -it eureka /bin/bash
    ②、修改容器内容:echo "alias ll='ls -l'" >> ~/.bashrc && source ~/.bashrc
    ③、验证ll命令:ll
    #生成镜像命令
    docker commit --help
    -a 用来指定作者
    -c 使用Dockerfile指令来创建镜像
    -m 描述我们此次创建image的信息
    -p 在commit时,将容器暂停
    ④、重新生成镜像
    docker commit -m="add ll" --author="jackly" eureka registry-jackly/eureka-server:2.0.0
    ⑤、启动新镜像
    docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0

五、网络管理

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.0

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 build -t registry-jackly/product-server:1.0.0 .

创建容器

  #查看本地镜像
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 \
registry
  • 创建一个仓库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内容

  version: '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

第二步:演示效果

http://172.31.65.26:9010/e-book-consumer-order/createOrder
http://172.31.65.26:9010/e-book-product/product/findAllProduct

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/ucdLxlFXTy5fOoYM4nDAqw

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:8月以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:8月以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:8月以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:8月以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:8月以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:8月以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:8月以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:8月以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:8月以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:8月以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:8月以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:8月以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:8月以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:8月以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:8月以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:8月以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:8月以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:8月以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:8月以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:8月以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  236890次阅读
vscode超好用的代码书签插件Bookmarks 1年以前  |  7003次阅读
 目录