zoukankan      html  css  js  c++  java
  • kubernetes入门到放弃-docker基础篇

      一.Docker基础概述

     1.Docker是什么?

      简单的的说Docker就是一种虚拟机的容器引擎,可以由以下四点概括

      (1).是一种最广泛的开源容器引擎

      (2).一种操作系统级的虚拟化技术

      (3).依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)

      (4).一个简单的应用程序打包工具

     2.Docker的设计目标

      (1).提供简单的应用程序打包工具

      (2).开发人员和运维人员职责逻辑分离

      (3).多环境保持一致性

     3.Docker的基本组成

      包含五个组成部分:

    • Docker Client 客户端
    • Docker Daemon 守护进程
    • Docker Images 镜像
    • Docker Container 容器
    • Docker Registry 镜像仓库

      Docker服务安装成功后,每个节点伴随着启动两个服务一个docker的客户端,一个docker的守护进程

      当我们运行服务时,可以从镜像仓库拉取基础镜像也可以使用dockerfile自主制作镜像,镜像制作完毕,我们可以通过镜像生成容器,容器里面运行着业务

      如下图所示:

      

     4.容器和虚拟机的区别

      docker的最小单元是容器,是与宿主机完全隔离的虚拟化应用程序,那么他与虚拟机有什么区别呢?如图

      

      简单来说容器与虚拟机的区别可以如下表格概括出来:

      

     5.Docker的应用场景

       docker可以在以下场景中应用:

    • 应用程序打包和发布
    • 应用程序隔离
    • 持续集成
    • 部署微服务
    • 快速搭建测试环境
    • 提供Paas产品(产品即服务)

    二.Linux 安装Docker

     1.Docker的版本

      关于docker的详细官方文档,我们可以在这里查看到https://docs.docker.com/

      Docker目前分为社区版(CE)和企业版(EE)两个版本

         一般开发常用的社区版就足够了,企业版面向无应用能力的企业收费,提供技术服务的群体,本篇安装也是基于社区版进行安装部署的

     2.支持平台

      目前docker基本支持Linux各种平台包括:CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu

      支持Mac操作系统

      支持windows操作系统

      

     3.Centos7.X安装Docker

      这里我们直接参考官方文档进行安装

      

      如果做测试,建议找一个干净的操作系统,安装docker的步骤如下:

      安装之前最好先关闭防火墙和selinux

    • 如果已经安装过docker,可以执行命令卸载:yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
    • 安装依赖工具包:yum install -y yum-utils device-mapper-persistent-data lvm2
    • docker默认使用的repo源,所以这里我们要为Docker添加软件包源:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    • 安装docker-ce 默认安装的是docker-ce最新版本的:yum install -y docker-ce
    • 启动docker服务并设置开机自启:systemctl start docker(启动)   systemctl enable docker(加入开机自启)

        安装完毕启动成功如下即可:

        

    三.Docker镜像管理

     1.镜像是什么

    • 镜像是一个分层存储的文件
    • 一个软件的环境
    • 一个镜像同时可以创建N个镜像
    • 一种标准化的交付手段
    • 一个不包含Linux内核而又精简的Linux操作系统

      镜像不是一个单一的文件,而是有多层构成,我们可以通过docker  history 《ID/NAME》 查看镜像中的各层内容及大小,每层对应着Dockerfile中的一条指令

      Docker镜像默认存储在/var/lib/docker/<storage-driver>/中

      这里我们可以使用命令简单创建一个镜像:docker run -it nginx

      

      本地不存在这个镜像时,会默认从镜像仓库下载

      如图:我们的镜像就被下载成功:

      

      那么我们的镜像从哪里来呢?

    • Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像,地址是:https://hub.docker.com/explore

      由于镜像镜像仓库地址属于国外,因此我们这里配置下镜像加速器:

    • curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

      

      重启docker即可

     2.镜像与容器的联系

      如图:镜像与容器的关系

      

      如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中

      如果容器删除了,最上面的读写层也就删除了,改动也就丢失了,所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。

      若想持久化这些改动,可以通过docker-commit 将容器保存为一个新的镜像

    • 一个镜像创建多个容器
    • 镜像增量式存储
    • 创建的容器里面修改不会影响到镜像

     3.管理镜像的常用命令

        一般我们常用的管理镜像命令有以下这么多,其他不常用的这里不再一一列出。

       可以通过docker  images --help查看所有

      

      简单测试:查看镜像历史分层

      

    四.容器管理

     1.创建容器的常用选项

      我们在创建容器时,最常用的命令如下:

      

      创建一个容器并启动:

      

     2.容器资源限制

      一个镜像可以创建很多个容器,我们不可能让一个容器无限制的使用所有空间,因此可以通过命令限制容器的内存和cpu,以使资源能够更好的得到利用

      

      比如以下例子对内存限额:

      允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:

      docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx bash

      

      对CPU限额:

      允许容器最多使用一个半的CPU:

      docker run -d --name nginx04 --cpus="1.5" nginx bash

      允许容器最多使用50%的CPU:

      docker run -d --name nginx05 --cpus=".5" nginx bash

      

     3.管理容器常用命令

      管理容器常用的命令如下所示:

      

       查看容器详细信息:

      

      进入容器:

      

      删除容器:

      

     五.管理应用程序数据

     1.将数据从宿主机挂载到容器中的三种方式

      Docker提供三种方式将数据从宿主机挂载到容器中:

    • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes),保存数据的最佳方式
    • bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中
    • tmpfs:挂载存储到主机系统的内存中,而不会写入主机的文件系统,如果不希望将数据持久化存储在任何位置,可以使用tmpfs.同时避免写入容器可写层提高性能。

      

     2.Volume数据卷

      管理卷:

      docker volume create nginx-vol

      docker volume ls

      docker volume inspect nginx-vol

      

      用卷创建一个容器:

      docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx

      

      docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx

      这种方法和mount的一样,创建完数据卷和宿主机的默认映射位置在/var/lib/docker/volumes/nginx-vol/_data目录下,不支持修改

      

      清理数据卷:

       # docker stop nginx-test

         # docker rm nginx-test

           # docker volume rm nginx-vol

      注意如果事先没有指定卷,则自动创建,建议使用--mount,更通用

     3.Bind Mounts

      利用此方法创建数据卷,先要创建本地的映射目录:

      mkdir -p /root/wwwroot

      docker run -d -it --name=nginx-test --mount type=bind,src=/root/wwwroot,dst=/usr/share/nginx/html nginx

      

      查看映射目录:docker inspect nginx-test

      

      清除:

      

      注意:如果源文件/目录没有存在如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏;映射目录需要提前创建,不会自动创建,会抛出一个错误

     4.小结

       Volume特点:

    • 多个运行容器之间共享数据,多个容器可以同时挂载相同的卷。
    • 当容器停止或被移除时,该卷依然存在。
    • 当明确删除卷时,卷才会被删除。
    • 将容器的数据存储在远程主机或其他存储上(间接)
    • 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

       Bind Mounts 特点:

    • 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析
    • 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机 上构建Maven项目时,容器都可以访问构建的项目包。
    • 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

    六.容器网络

     1.网络模式

      docker的网络模式可以分为5种:

      bridge: --net=bridge

      默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。

      宿主机会产生一个docker0网桥

      

      

      host: --net=host  容器不会获得一个独立的network  namespace,而是与宿主机共用一个,这就意味着容器不会有自己的网卡信息,而是使用宿主机的,容器除了网络,其他都是隔离的

      docker run  -itd  --net=host busybox

      

      none:--net=none  获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置

      docker run  -it  --net=none busybox

      

      container:--net=container:Name/ID  与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的

      自定义网络:与默认的bridge原理一样,但自定义的网络具备内部DNS发现,可以通过容器名容器之间网络通信。

      创建自定义网络:docker network create test  查看:docker network ls

      

      创建容器并加入自定义网络中:

      docker run  -it --name c3 --net=test  busybox

      docker run  -it --name c4 --net=test  busybox

      之后容器内就可以相互ping通主机名:

      

      

     2.容器网络访问原理

       

      

    七.Dockerfile实践

     1.Dockerfile格式

      Dockerfile文件是分步执行,从上到下依次执行,每执行一条指令将会产生一层镜像,因此命令中最好使用&&拼接起来,并及时清理yum clean和没有的安装包

      语法格式如下:

      

     2.Dockerfile指令

      Dockerfile指令:常用的如下表格:

      

     3.Build镜像

      build 语法格式:

      

      可以通过docker  build  --help查看

      Usage: docker build [OPTIONS] PATH | URL | - [flags]

      Options:

      -t, --tag list # 镜像名称

      -f, --file string # 指定Dockerfile文件位置

       # docker build -t shykes/myapp .

       # docker build -t shykes/myapp -f /path/Dockerfile /path

       # docker build -t shykes/myapp http://www.example.com/Dockerfile

     4.构建Nginx,PHP,Tomcat基础镜像

      (1).构建Ngin镜像:

      nginx的镜像dockerfile

     1 FROM centos:7
     2 label maintainer www.ctnrs.com
     3 RUN yum install -y gcc gcc-c++ make 
     4     openssl-devel pcre-devel gd-devel 
     5     iproute net-tools telnet wget curl && 
     6     yum clean all && 
     7     rm -rf /var/cache/yum/*
     8 RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && 
     9     tar zxf nginx-1.15.5.tar.gz && 
    10     cd nginx-1.15.5 && 
    11     ./configure --prefix=/usr/local/nginx 
    12     --with-http_ssl_module 
    13     --with-http_stub_status_module && 
    14     make -j 4 && make install && 
    15     rm -rf /usr/local/nginx/html/* && 
    16     echo "ok" >> /usr/local/nginx/html/status.html && 
    17     cd / && rm -rf nginx-1.15.5* && 
    18     ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    19 
    20 ENV PATH $PATH:/usr/local/nginx/sbin
    21 COPY nginx.conf /usr/local/nginx/conf/nginx.conf
    22 WORKDIR /usr/local/nginx
    23 EXPOSE 80
    24 CMD ["nginx", "-g", "daemon off;"]
    nginx-dockerfile

      构建命令:docker build -t nginx:v1 -f Dockerfile-nginx .

      (2).构建php镜像:

      php镜像dockerfile

    FROM centos:7
    MAINTAINER www.ctnrs.com
    RUN yum install epel-release -y && 
        yum install -y gcc gcc-c++ make gd-devel libxml2-devel 
        libcurl-devel libjpeg-devel libpng-devel openssl-devel 
        libmcrypt-devel libxslt-devel libtidy-devel autoconf 
        iproute net-tools telnet wget curl && 
        yum clean all && 
        rm -rf /var/cache/yum/*
    
    RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && 
        tar zxf php-5.6.36.tar.gz && 
        cd php-5.6.36 && 
        ./configure --prefix=/usr/local/php 
        --with-config-file-path=/usr/local/php/etc 
        --enable-fpm --enable-opcache 
        --with-mysql --with-mysqli --with-pdo-mysql 
        --with-openssl --with-zlib --with-curl --with-gd 
        --with-jpeg-dir --with-png-dir --with-freetype-dir 
        --enable-mbstring --with-mcrypt --enable-hash && 
        make -j 4 && make install && 
        cp php.ini-production /usr/local/php/etc/php.ini && 
        cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && 
        sed -i "90a daemonize = no" /usr/local/php/etc/php-fpm.conf && 
        mkdir /usr/local/php/log && 
        cd / && rm -rf php* && 
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    ENV PATH $PATH:/usr/local/php/sbin
    COPY php.ini /usr/local/php/etc/
    COPY php-fpm.conf /usr/local/php/etc/
    WORKDIR /usr/local/php
    EXPOSE 9000
    CMD ["php-fpm"]
    php-dockerfile

      构建命令:docker build -t php:v1 -f Dockerfile-php .

      (3).构建tomcat镜像

     1 FROM centos:7
     2 MAINTAINER www.ctnrs.com
     3 
     4 ENV VERSION=8.5.43
     5 
     6 RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && 
     7     yum clean all && 
     8     rm -rf /var/cache/yum/*
     9 
    10 RUN wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && 
    11     tar zxf apache-tomcat-${VERSION}.tar.gz && 
    12     mv apache-tomcat-${VERSION} /usr/local/tomcat && 
    13     rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && 
    14     mkdir /usr/local/tomcat/webapps/test && 
    15     echo "ok" > /usr/local/tomcat/webapps/test/status.html && 
    16     sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && 
    17     ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    18 
    19 ENV PATH $PATH:/usr/local/tomcat/bin
    20 
    21 WORKDIR /usr/local/tomcat
    22 
    23 EXPOSE 8080
    24 CMD ["catalina.sh", "run"]
    tomcat-dockerfile

      构建命令:docker build -t tomcat:v1 -f Dockerfile-tomcat .

     5.快速搭建LNMP网络平台

      

      自定义网络:docker network create lnmp

      创建Mysql容器:docker run -d  --name lnmp_mysql  --net lnmp  --mount src=mysql-vol,dst=/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8

      创建PHP容器:docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1

      创建Nginx容器:docker run -d --name lnmp_nginx --net lnmp -p 88:80  --mount src=wwwroot,dst=/wwwroot nginx:v1

      之后进入挂载目录:

      

      将wordpress安装包放置下面即可访问站点:http://IP:88

      

    八.企业级镜像仓库Harbor的使用

     1.Harbor概述

      Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访 问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。

      官方地址:https://vmware.github.io/harbor/cn/

      Harbor的组件:

      

     2.Harbor部署

      Harbor安装有3种方式:

       • 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小

       • 离线安装:安装包包含部署的相关镜像,因此安装包比较大

       • OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor

      下载安装包:tar zxvf harbor-offline-installer-v1.6.1.tgz

      下载docker-composew二进制文件放置/usr/bin下

      安装docker服务并启动即可

      # tar zxvf harbor-offline-installer-v1.6.1.tgz

      # cd harbor

      # vi harbor.cfg hostname = 10.206.240.188     ui_url_protocol = http     harbor_admin_password = 123456

      # ./prepare

      # ./install.sh

      之后通过admin   123456访问即可:

      

     3.基本使用

      配置http镜像仓库可信任:

      vi /etc/docker/daemon.json

      

      给要上传的标签打标签:

      docker tag tomcat:v1 192.168.1.242/library/tomcat:v1

      上传:docker push 192.168.1.242/library/tomcat:v1

      

      这里提示权限失败,先要登录:docker  login  192.168.1.242 输入账户名密码登录成功即可

      再次推送成功:

      

      从镜像仓库下载镜像:

      docker pull 192.168.1.242/library/tomcat:v1

     九.基于Docker构建企业Jenkins CI平台

     1.什么是CI/CD

      持续集成(Continuous Integration,CI):代码合并、构建、部署、测试都在一起,不断地执行这个过程,并对结果反馈。

      持续部署(Continuous Deployment,CD):部署到测试环境、预生产环境、生产环境。

      持续交付(Continuous Delivery,CD):将最终产品发布到生产环境,给用户使用。

      

      高效的CI/CD环境可以获得:

    • 及时发现问题
    • 大幅度减少故障率
    • 加快迭代速度
    • 较少时间成本

     2.CI流程

      开发上传代码至git服务器,触发jenkins,进行代码编译构建镜像并推送至远程服务器启动docker镜像完成CI这部分流程

      

     3.部署Git代码版本仓库

      在harbor服务器上安装git服务:yum  install -y git

      创建git用户和密码,并切换至git账户建立demo.git文件夹,执行初始化:git  --bare init

      

     4.上传java项目代码

      模拟开发在docker服务器安装安装git服务端,之后clone java代码实例:

      git clone https://github.com/lizhenliang/tomcat-java-demo

     5.部署Harbor镜像仓库

      见上述操作

     6.配置JDK和Maven环境

      将安装包上传配置环境环境变量即可

      

     7.安装Jenkins

      将jenkins,war放置tomcat的webapps/ROOT下直接启动tomcat,访问8080端口即可:

      

      安装插件git和pipeline即可完成配置

      

     8.安装Docker

      各个机器安装Docker服务即可

     9.构建Tomcat基础镜像

      jenkins创建项目:

      

      简单pipeline:

      

      结果:

      

     10.流水线发布测试

      提交java代码:

      先拷贝至本地目录:

      

      提交代码:

      

      编写pipeline:

     1 node { 
     2    // 拉取代码
     3    stage('Git Checkout') { 
     4         checkout([$class: 'GitSCM', branches: [[name: '$branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '8db1da0a-bcf7-43c5-b98d-a711d6119933', url: 'git@192.168.1.242:/home/git/demo.git']]])   // 代码编译
     5    }
     6    stage('Maven Build') {
     7         sh '''
     8         export JAVA_HOME=/usr/local/jdk
     9         /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
    10         '''
    11    }
    12    // 项目打包到镜像并推送到镜像仓库
    13    stage('Build and Push Image') {
    14 sh '''
    15 REPOSITORY=192.168.1.242/library/tomcat-java-demo:${branch}
    16 cat > Dockerfile << EOF
    17 FROM 192.168.1.242/library/tomcat:v1
    18 MAINTAINER www.ctnrs.com
    19 RUN rm -rf /usr/local/tomcat/webapps/*
    20 ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
    21 EOF
    22 docker build -t $REPOSITORY .
    23 docker login 192.168.1.242 -u admin -p 123456
    24 docker push $REPOSITORY
    25 '''
    26    }
    27    // 部署到Docker主机
    28    stage('Deploy to Docker') {
    29         sh '''
    30         REPOSITORY=192.168.1.241/library/tomcat-java-demo:${branch}
    31         docker rm -f tomcat-java-demo |true
    32         docker pull $REPOSITORY
    33         docker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY
    34         '''
    35    }
    36 }
    pipeline

      配置git通信:

      

      

      

      

       构建完成:

      

      访问:

      

  • 相关阅读:
    Golang Failpoint 的设计与实现
    没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达
    多元微分学 枚举破解15位路由器密码 存储空间限制 拆分减长,求最值 数据去重
    ARP Poisoning Attack and Mitigation Techniques ARP欺骗 中间人攻击 Man-In-The-Middle (MITM) attack 嗅探 防范 Can one MAC address have two different IP addresses within the network?
    The C10K problem
    HTTP Streaming Architecture HLS 直播点播 HTTP流架构
    现代IM系统中消息推送和存储架构的实现
    现代IM系统中的消息系统架构
    长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
    doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
  • 原文地址:https://www.cnblogs.com/datastart/p/11381607.html
Copyright © 2011-2022 走看看