• 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通信:

      

      

      

      

       构建完成:

      

      访问:

      

  • 相关阅读:
    sha1加密java代码
    android中用get和post方式向服务器提交请求
    如何通过shell脚本操作MongoDB
    Redis在win7上的安装与可视化应用
    Java的图片处理工具类
    JAVA 读取图片储存至本地
    如何在Objective-C中实现链式语法
    iOS开发之——从零开始完成页面切换形变动画
    开发完iOS应用,接下去你该做的事
    IOS-错误总结
  • 原文地址:https://www.cnblogs.com/datastart/p/11381607.html
Copyright © 2020-2023  润新知