本博客将记录博主学习b站编程不良人的Docker的总结,虽然以前也有使用过docker,但都是一些最基本的用法,这次将会全面认真的学习Docker。

09:Docker镜像分层原理

  • 镜像定义:
    一个镜像代表一个软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时的所需的库、环境变量和配置文件
  • 镜像为什么那么大:
    因为一个软件镜像不仅仅是原来的软件包,而是包含软件包所需的操作系统依赖、软件自身依赖以及自身软件包组成(及包含了软干个公共镜像)
  • 为什么docker镜像采用分层镜像原理
    注意:docker在设计镜像时每一个镜像都是有n个镜像共同组成 ==>镜像像是一个画卷一层层组成,每层都是一个镜像
    原理:UnionFS 联合文件系统。 docker镜像实际是由一层一层的文件系统组成。
    采用UnionFS 联合文件系统最大的一个好处就是资源共享,采用分层机制实现基础层共享,从而减小docker仓库整体体积


  • 所以,前期拉取的镜像越来越多,后期拉取就快

10:Docker中容器之间网络配置

  • 为什么提供网络功能:
    Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
  • docker容器与操作系统通信机制
    docker通信机制
  • docker 网络使用
    注意:一般在使用docker网桥(bridge)实现容器与容器通信时,都是站在一个应用的角度进行容器通信
  • 查看docker所有 配置
    docker network ls
    docker inspect 网桥名称
  • 创建自定义网桥
    docker create NAMES(网桥名称)  ===> docker create -d bridge ems(网桥名称)
  • 例子:
    docker run -d -p 8082:8080 -network ems --name mytomcat01 tomcat:8.0-jre8
    docker run -d -p 8082:8080 -network ems --name mytomcat01 tomcat:8.0-jre8

    注意,一但在启动容器时指定了网桥之后,日后可以在任何这个网桥关联的容器中使用容器名字进行与其他容器通信(docker将容器名字与该容器划分的子网做了映射)
    172.18.02 ==> mytomcat01 , 172.18.0.3 ==> mytomcat02

    使用docker run 指定 --network 网桥时网桥必须存在

11:docker 核心架构图

docker架构图

12:docker安装服务

  • 安装哪个服务去docker hub搜索对应服务的镜像
  • 点击进入该服务docker hub
    • 首先看描述(description),如何使用images
    • 其次找版本(tags)

安装mysql

  • 启动:(后台启动,设置端口,启动时给root用户指定密码,使用数据卷进行数据持久化,以修改之后的配置文件启动)
    docker pull mysql
    docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxx -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql --name mysql80 mysql

安装tomcat

  • 下载tomcat服务
    docker pull tomcat:8.0-jre8
  • 启动tomcat服务(将部署应用目录和配置文件目录通过数据卷挂在宿主机系统)
    注意:部署web应用在容器中目录为/usr/local/tomcat/webapps
    配置文件 /usr/local/tomcat/conf
    docker run -d -p 8081:8080 -v tomcatApps:/usr/local/tomcat/webapps -v confs:/usr/local/tomcat/conf --name tomcat8 tomcat:8.0-jre8

    注意修改配置文件里的端口不会对已创建的tomcat生效,需新创建一个

安装redis

  • 下载镜像
    docker pull redis
  • 启动,并开启redis持久化(持久化生成aof文件会被放入容器中/data目录中),
    docker run -d -p 6379:6379 --name redis redis redis-server --appendonly yes
  • 以自定义配置文件略麻烦...

安装rabbitmq

  • 下载镜像
    docker pull rabbitmq
  • 启动镜像,挂载配置目录
    docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v rabbitmq:/etc/rabbitmq/ --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq
  • 启动rabbitmq_management管理界面
    docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
  • 修改配置文件,开启统计数据
    # vim /var/ilb/docker/volumes/rabbitmq/_data/conf.d/management_agent.disable_metrics_collector.conf 
    management_agent.disable_metrics_collector = false   # 默认为true,解决Stats in management UI are disabled on this node
  • 重启rabbitmq

安装ES & Kibana

  • 下载镜像
    docker pull elasticsearch:7.10.1
  • 预先配置(修改虚拟内存大小)
    vim /etc/sysctl.conf
    加入如下配置:vm.max_map_count=262144
    启用配置: sysctl -p
  • 单节点启动,设置jvm并将数据、配置、插件持久化:
    docker network create esnetwork  建立网桥
    docker run -d --name es --net esnetwork -p 9200:9200 -p 9300:9300 -v esdata:/usr/share/elasticsearch/data -v esconfig:/usr/share/elasticsearch/config -v esplugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:7.10.1
  • 安装Kibana
    docker pull kibana:7.10.1
  • 启动Kibana
    docker run -d -p 5601:5601 --link es:elasticsearch --name kibana --net esnetwork kibana:7.10.2

13:dockerfile

docker架构图

  • 定义:
    用来帮助我们自己构建一个自定义镜像,dockerfile成为镜像构建文件 描述文件
  • 为什么要存在dockerfile
    日后用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行
  • dockerfile 构建镜像原理
    dockerfile
  • dockerfile 基本命令
    docker基本命令

    示例

  • FROM
    FROM centos:7
  • RUN
    RUN yum install -y vim         #构建镜像时安装vim
    RUN ["yum","install","-y","vim"]    #第二种写法
  • EXPOSE
    EXPOSE 5672
    EXPOSE 15672
  • WORKDIR 指定进入容器后在哪个目录下,可以写多个(绝对+相对累加)
    WORKDIR /data
    WORKDIR bb    #实际进入容器目录为/data/bb,没有也会自动创建
  • COPY (将某文件拷贝到打包后的目录中 COPY src dest)
    COPY aa.txt /data/bb
  • RUN
    RUN  xxx-8.0.tar.gz /data/bb   # 拷贝进入的同时还会自动解压
    RUN mv xxx-8.0 xx  # 可以把自动解压后的文件夹重命名
    WORKDIR yy # 甚至把进入容器后的目录修改
  • VOLUME 设置可以被挂载的容器目录
    VOLUME /data/bb/tomcat/webapps
  • ENV 设置公共的环境变量
    ENV BASE_DIR /data/bb
    VOLUME $BASE_DIR/tomcat/webapps
  • ENTRYPOINT & CMD (用数组形式)
    通常ENTRYPOINT后的shell命令写固定死的,如java -jar
    CMD后用来接收run容器时传入的参数,如jar包名称
    ENTRYPOINT ["java","-jar"]
    CMD ["ems.jar"]
    ...
    docker run xxx:01 aaa.jar   #此时执行的为 java -jar aaa.jar

    014:Dockerfile构建springboot应用

  • 打包项目 : demo.jar
  • 在服务器中创建dockerfile上下文目录 context
    mkdir demo   # 这个目录作为 context
    touch Dockerfile  # 在context目录中创建Dockerfile文件
  • 上传应用jar到context目录
  • 编写Dockerfile
    FROM openjdk:8-jre     # 基于哪个镜像构建
    WORKDIR /app           # 定义进入容器时默认位置,接下来后序操作工作位置
    ADD demo.jar app.jar   # 将上下文中名字为 demo.jar复制到工作目录,同时修改为app.jar
    EXPOSE 8081            # 暴露8081端口
    ENTRYPOINT ["java","-jar"]      # 启动应用固定命令
    CMD ["app.jar"]       # 执行jar名称
  • 执行构建并运行
    docker build -t demo:01
    docker run -d -p 8081:8081 --name demo demo:01
最后修改:2021 年 09 月 17 日