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

  

  

  

  

   构建完成:

  

  访问:

  

posted @ 2019-08-20 17:53  淋汐去水  阅读(634)  评论(0编辑  收藏  举报