简介

什么是docker

  • 解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术

image.png

为什么会出现docker

  • 测试|运维:我这跑不起来啊
  • 开发:我这里能跑的起来啊

image.png

  • 痛点1:环境不同所引发的问题
    一款产品从开发到上线,一般都会有开发环境,测试环境,运行环境。 如果有一个环境中某个软件或者依赖版本不同了,可能产品就会出现一些错误,甚至无法运行。比如开发人员在windows系统,但是最终要把项目部署到linux。如果存在不支持跨平台的软件,那项目肯定也无法部署成功。 这就产生了开发和运维人员之间的矛盾。开发人员在开发环境将代码跑通,但是到了上线的时候就崩了。还要重新检查操作系统,软件,依赖等版本,这大大降低了效率。造成了搭环境一两天,部署项目两分钟的事件
  • 痛点2:配置的繁琐
    一个产品需要使用mysql集群,redis集群,Haddop集群,或者elasticsearch集群等等,不同的人都要用到这些,那每一个人都要对集群进行配置,如果有一个位置不同就有可能产生重大问题。况且配置环境是一个极其繁琐

    docker运作

    image.png
  1. 拉取镜像,若本地已经存在该镜像,则不用到Docker仓库去拉取
  2. 使用镜像创建新的容器
  3. 分配union文件系统并且挂载一个可读写的层,任何修改容器的操作都会被记录在这个读写层上,你可以保存这些修改成新的镜像,也可以选择不保存,那么下次运行改镜像的时候所有修改操作都会被消除
  4. 分配网络/桥接接口,创建一个允许容器与本地主机通信的网络接口
  5. 设置ip地址,从池中寻找一个可用的ip地址附加到容器上,换句话说,localhost并不能访问到容器
  6. 运行你指定的程序
  7. 捕获并且提供应用输出:连接并且记录标准输出、输入和错误让你可以看到你的程序是如何运行的。

    使用场景

  • docker:build once run anywhere
  • java:write once,run anywhere

image.png

使用操作

镜像

镜像简介

  • 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码,运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件 只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象 )
    分层的镜像 镜像基于UnionFS(联合文件系统):是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改座位一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作具体的应用镜像

    镜像操作

  1. 拉取镜像,先从本地库拉取,再从远程仓库
    docker pull image
  2. 搜索镜像
    docker search image
  3. 列出本地镜像
    docker images
  4. 提交镜像到远程仓库docker hub
    docker push {image name}
  5. 删除某个镜像
    docker rmi {image name}
  6. 从变动容器创建镜像
    docker commit
  7. 编译镜像
    docker build -t image:tag .
  8. 设置镜像标签
    docker tag
  9. 查看镜像、容器、数据卷所占的空间
    docker system df

    容器

    容器简介

  • 类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。

    容器操作

  1. 运行某个镜像
    docker run
  2. 启动容器
    docker start
  3. 停止容器
    docker stop
  4. 删除容器
    docker rm
  5. 导出容器
    docker export
  6. 导入容器
    docker import
  7. 查看容器日志
    docker logs
  8. 进入容器
    docker exec
  9. 复制文件(从宿主机到容器,从容器到宿主机)
    docker cp

    Dockerfile

  • Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。(就像是sql脚本文件)
  1. COPY 复制指令
  2. ADD 同COPY,区别自动解压
  3. CMD 为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束
  4. ENTRYPOINT 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,固参
  5. ENV 置环境变量,定义了环境变量
  6. ARG 构建参数,与 ENV 作用一致。不过作用域不一样,在dockerfile build过程生效
  7. VOLUME 定义匿名数据卷
  8. EXPOSE 仅仅只是声明端口
  9. WORKDIR 指定工作目录
  10. USER 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)
  11. HEALTHCHECK 用于指定某个程序或者指令来监控 docker 容器服务的运行状态
  12. ONBUILD 用于延迟构建命令的执行,在子镜像的build 才会执行命令

    network 模型区别

    image.png

    可视化操作

  • docker for destop
  • portainer
  • idea

    docker compose

  • compose 是docker公司推出的一个工具软件,可以管理多个docker容器组成的一个应用。你需要定义一个YAML格式的配置文件 docker-compose.yml 写好多容器之间的调用关系,然后,只要一个命令就能启动/关闭这些容器

  • docker-compose -f ./docker-compose-server.yml up -d

    解决案例

    fardo-centos dockerfile

    1. #基础镜像
    2. FROM centos:centos7
    3. LABEL JAVA_VERSION="jdk1.8.0_311"
    4. MAINTAINER maozf
    5. #创建/faduit/jdk 目录并下载ifconfig,telnet工具
    6. RUN mkdir -p /faduit/jdk && yum install net-tools -y && yum install telnet -y
    7. #定义java系统变量
    8. ADD jdk-8u311-linux-x64.tar.gz /faduit/jdk
    9. ENV JAVA_HOME /faduit/jdk/jdk1.8.0_311
    10. ENV JRE_HOME /faduit/jdk/jdk1.8.0_311/jre
    11. ENV PATH $JAVA_HOME/bin:$PATH

    fardo-tomcat dockerfile

    #基础镜像
    FROM fardo-centos7:jdk8
    MAINTAINER maozf
    LABEL JAVA_VERSION="1.8.0_311" TOMCAT_VERSION="8.5.76"
    ADD apache-tomcat-8.5.76.tar.gz /faduit/
    RUN mv /faduit/apache-tomcat-8.5.76 /faduit/tomcat
    ENV CATALINA_HOME /faduit/tomcat 
    ENV CATALINA_BASE /faduit/tomcat 
    ENV PATH $CATALINA_HOME/bin:$PATH
    #定义JVM参数配置
    ENV JAVA_OPTS -server -Xms512M -Xmx2048M -Duser.timezone="Asia/Shanghai" -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
    #工作空间,为了/bin/bash/直接进入到tomcat 下
    WORKDIR /faduit/tomcat
    #日志挂载卷
    VOLUME TOMCAT_LOG
    EXPOSE 8080
    CMD /faduit/tomcat/bin/catalina.sh run
    

    笔录高级版dockerfile

    ```shell

    基础镜像

    FROM fardo-tomcat8:jdk8 ADD target/FDZNBL_SERVER-*.war /faduit/tomcat/webapps/znbl.war

EXPOSE 8080

<a name="Gfmxx"></a>
## 笔录V4.0
<a name="PGCwr"></a>
### 部分项目dockerfile,如znbl服务,其他雷同
```shell
FROM anapsix/alpine-java:8_server-jre_unlimited

MAINTAINER faduit@dragoninfo.com.cn

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN mkdir -p /fd-cloud-znbl-biz

WORKDIR /fd-cloud-znbl-biz

EXPOSE 8202

ADD ./target/fd-cloud-znbl-biz-*.jar ./fd-cloud-znbl-biz.jar

CMD java -Djava.security.egd=file:/dev/./urandom -jar fd-cloud-znbl-biz.jar

docker compose yml配置文件

version: '2'
services:
  #fd-cloud-mysql:
  #  image: 192.168.1.11:5000/fd-cloud-mysql:1.0
  #  environment:
  #    MYSQL_ROOT_PASSWORD: root
  #  restart: always
  #  container_name: fd-cloud-mysql
  #  command:
  #    --character-set-server=utf8mb4
  #    --collation-server=utf8mb4_general_ci
  #    --explicit_defaults_for_timestamp=true
  #    --lower_case_table_names=1
  #    --max_allowed_packet=128M
  #  ports:
  #    - 3306:3306

#  fd-cloud-redis:
#    image: redis:5
#    ports:
#      - 6379:6379
#    restart: always
#    container_name: fd-cloud-redis
#    hostname: fd-cloud-redis

#  fd-cloud-nacos:
#    image: nacos/nacos-server
#    restart: always
#    container_name: fd-cloud-nacos
#    hostname: fd-cloud-nacos
#    ports:
#      - 8848:8848
#    environment:
#      MODE: standalone

  fd-cloud-gateway:
    image: fd-cloud-gateway:demo
    restart: always
    ports:
      - 9210:9210
    container_name: fd-cloud-gateway
    hostname: fd-cloud-gateway

  fd-cloud-job-admin:
    image: fd-cloud-job-admin:demo
    restart: always
    ports:
      - 9030:9030
    container_name: fd-cloud-job-admin
    hostname: fd-cloud-job-admin

  fd-cloud-monitor:
    image: fd-cloud-monitor:demo
    restart: always
    ports:
      - 9020:9020
    container_name: fd-cloud-monitor
    hostname: fd-cloud-monitor

  fd-cloud-system:
    image: fd-cloud-system:demo
    restart: always
    container_name: fd-cloud-system
    hostname: fd-cloud-system

  fd-cloud-znbl:
    image: fd-cloud-znbl:demo
    restart: always
    container_name: fd-cloud-znbl
    hostname: fd-cloud-znbl