• 容器之docker基础


    一 docker的介绍

        Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup, namespace, Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其他进程,这种运行时封装的状态称为容器。Docker早起版本实现是基于LXC,并进一步对其封装,包括文件系统、网络互联、镜像管理等方面,极大简化了容器管理。从0.7版本以后开始去除LXC,转为自行研发的libcontainer,从1.11版本开始,进一步演进为使用runC和containerd。
        Docker理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Linux发行版Docker引擎上。使用沙箱机制运行程序,程序之间相互隔离。

    Containerd:是一个简单的守护进程,使用runC管理容器。向Docker Engine提供接口。
      Shim:只负责管理一个容器。
              runC:是一个轻量级的工具, 只用来运行容器。

     

     

    1 docker的体系结构

    Docker Client:客户端

    Ddocker Daemon:守护进程

    Docker Images:镜像

    Docker Container:容器

    Docker Registry:镜像仓库

    2 docker的内部组件

    Namespaces 命名空间    资源隔离

      UTS: 主机名和域名

      IPC: 消息队列 共享内存

      PID: 进程编号

      Network: 网络协议栈,例如IP、端口

      Mount: 文件系统

      User: 用户和用户组

      

    CGroups 控制组  资源限制 比如CPU 内存 磁盘IO

    UnionFS 联合文件系统       Copy-on-write 

    3 虚拟机与容器的差别

    启动时间
        Docker秒级启动, KVM分钟级启动。

    轻量级
        容器镜像大小通常以M为单位,虚拟机以G为单位。
        容器资源占用小,要比虚拟机部署更快速。

    性能
        容器共享宿主机内核,系统级虚拟化,占用资源少,没有Hypervisor层开销,容器性能基本接近物理机;
        虚拟机需要Hypervisor层支持,虚拟化一些设备,具有完整的GuestOS,虚拟化开销大,因而降低性能,没有容器性能好。

    安全性
        由于共享宿主机内核,只是进程级隔离,因此隔离性和稳定性不如虚拟机,容器具有一定权限访问宿主机内核,存在一定安全隐患。

    使用要求
        KVM基于硬件的完全虚拟化,需要硬件CPU虚拟化技术支持;
        容器共享宿主机内核,可运行在主流的Linux发行版,不用考虑CPU是否支持虚拟化技术。

    4 应用场景

    应用程序打包和发布

    应用程序隔离

    持续集成

    部署微服务

    快速搭建测试环境

    提供PaaS产品(平台即服务)

     

    二 docker的安装

    1 安装

     centos7.X安装docker

    docker 版本

      

      社区版(Community Edition,CE)

      企业版(Enterprise Edition,EE)

    # 安装依赖包
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 添加软件源信息 源地址换成阿里

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


    # 更新yum包索引
    yum makecache fast


    # 安装Docker CE
    yum install docker-ce


    # 启动
    systemctl start docker

    systemctl enable docker


    #卸载centos自带的firewall

    systemctl stop firewalld.service #关闭防火墙

    systemctl disable firewalld.service #关闭开机启动

    官方文档:https://docs.docker.com

    阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    2 配置 国内镜像仓库

    #配置国内镜像仓库的加速器

    https://www.daocloud.io/mirror#accelerator-doc
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io


    #Docker配置文件
    /etc/docker/daemon.json

    三 镜像管理 

         简单说, Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。         Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像, Docker工具

    1 镜像与容器的关系

     

      镜像不是一个单一的文件,而是有多层构成。 我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。 Docker镜像默认存储在/var/lib/docker/<storage-driver>中。

      容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动, 都会写到这个读写层。 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

    2 镜像的常用操作

    # 列出本地镜像
    docker image ls


    # 删除某个镜像
    docker image rm nginx_test


    # 下载一个镜像
    docker image pull mongo:3.4

    # 查看中间层镜像
    docker images -a

    # 删除镜像 强制删除
    docker image rm mongo:3.4
    docker image rmi nginx:1.16

    # 查看镜像的详细信息
    docker image inspect centos:6.9

    #save 与load

    导出一个完整镜像


    docker image save nginx:1.16 >nginx_save.tar


    # 导入镜像 load
    docker image load -i nginx_save.tar


    # export 与 import
    export 导出的是容器的文件系统的所有内容, 不包括分层,不包括运行命令


    # 导出镜像
    docker container export webserver > nginx.tar


    # 导入镜像
    docker image import webserver.tar nginx_august


    # 运行镜像 nginx容器
    docker run --name test_nginx -itd -p 80:80 nginx_august /bin/bash -c "echo 'hello' && exec nginx -g 'daemon off;'"
    docker run --name test_nginx -itd -p 80:80 nginx_august /bin/bash -c "exec nginx -g 'daemon off;'"

    四 容器管理

    1 容器操作命令

    docker container run --help

    -i
    -t
    -d
    -e 传变量
    -p 端口映射
    -h 主机名
    --dns

    --restart 开机启动容器
    --restart=always

    # 创建一个容器
    docker run --name webserver -d -p 80:80 nginx:1.16

    # 查看容器日志
    docker container logs web01


    # 执行容器命令
    docker exec web01 ls


    # 进入容器
    docker exec -it web01 bash


    # 查看容器的映射端口
    [root@test ~]# docker container port web02
    80/tcp -> 0.0.0.0:808

    # 宿主机中的目录 映射到容器中
    docker container run -itd --name web01 -v /data/co1/:/usr/share/nginx/html/ -p 80:80 nginx:1.16

    # 查看容器的具体改动
    docker diff webserver


    # 根据容器的改变创建新的镜像
    docker commit -a "augustyang@qq.com" -m "修改默认网页" webserver nginx:v2

    # 删除全部stop的容器
    docker rm $(docker ps -aq)

    2 容器管理命令

    # ls 列出容器
    docker container ls

    # inspect 显示一个容器的详细信息
    docker container inspect web01


    # exec 在容器运行命令
    docker container exec web01 ls

    # logs
    docker container logs web01


    # 显示容器运行的进程
    docker container top web01


    # update 
    docker container update web01 -m 100m --memory-swap -1


    #cp 宿主机的文件拷贝到容器中
    docker cp ysl web01:/usr/share/nginx/html


    # port 映射端口
    docker container port web01


    # stats 查看资源利用率
    docker stats web01 


    不用交互
    docker stats --no-stream web01

    五 管理应用程序

    Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes, bind mounts 和tmpfs

      volumes: docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)

      bind mounts: 可以存储在宿主机系统的任意位置

      tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统

     

    1 卷的创建与删除

    管理卷创建:
    docker volume create nginx-vol
    docker volume ls
    docker volume inspect nginx-vol

    用卷创建一个容器:
    # docker run -d -it --name=nginx-test --mount source=nginx-vol,target=/usr/share/nginx/html nginx
    或者
    # docker run -d -it --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx

    清理操作:
    docker container stop nginx-test
    docker container rm nginx-test
    docker volume rm nginx-vol


    注意:
      1. 如果没有指定卷,自动创建。
      2. 建议使用—mount,更通用

    2 部署测试lnmp

    docker container run -itd
    --name lnmp_mysql
    --net lnmp
    -p 3306:3306
    --mount type=bind,source=/data/mysql,target=/var/lib/mysql
    -e MYSQL_ROOT_PASSWORD=123456
    mysql:5.6 --character-set-server=utf8

     

    docker container exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'


    docker container run -itd
    --name lnmp_web
    --net lnmp
    -p 80:80
    --mount type=bind,source=/data/www,target=/var/www/html
    richarvey/nginx-php-fpm

    六 网络模式

    bridge
        默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
    host
        容器不会获得一个独立的network namespace,而是与宿主机共用一个。
    none
        获取独立的network namespace,但不为容器进行任何网络配置。
    container
        与指定的容器使用同一个network namespace,网卡配置也都是相同的。
    自定义
        自定义网桥,默认与bridge网络一样。

    七 dockfile构建

    1 dockerfile的指令

     

    2 常用的dockerfile

    redis dockerfile

    FROM centos:6.9
    # centos 6.9
    # redis-3.2.5
    MAINTAINER augustyang
    ARG REDIS_VERSION="3.2.5"
    
    ADD redis-3.2.5.tar.gz  /opt
    RUN yum -y install  gcc-c++ make gcc 
            && mkdir -p /data/redis/data  
            && cd /opt/redis-$REDIS_VERSION && make && make install 
            && cd /opt/redis-$REDIS_VERSION/utils/ && echo | /bin/bash install_server.sh 
            && /bin/cp /opt/redis-$REDIS_VERSION/redis.conf  /etc/redis/6379.conf 
            && sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis/6379.conf 
            && sed -i 's/# requirepass foobared/requirepass 123456/g' /etc/redis/6379.conf 
            && /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone 
            && sed -i 's@dir ./$@dir  /data/redis/data@g'  /etc/redis/6379.conf 
            && yum clean all 
            && rm -rf /var/cache/yum/*
    
    WORKDIR  /data/redis
    
    EXPOSE 6379
    ENTRYPOINT /usr/local/bin/redis-server /etc/redis/6379.conf && tail -f -n20 /var/log/redis_6379.log

    nginx dockerfile

    FROM centos:7
    LABEL maintainer augustyang
    RUN yum install -y gcc gcc-c++ make 
        openssl-devel pcre-devel gd-devel 
        iproute net-tools telnet wget curl && 
        yum clean all && 
        rm -rf /var/cache/yum/*
    
    COPY nginx-1.15.5.tar.gz /
    RUN tar zxf nginx-1.15.5.tar.gz && 
        cd nginx-1.15.5 && 
        ./configure --prefix=/usr/local/nginx 
        --with-http_ssl_module 
        --with-http_stub_status_module && 
        make -j 4 && make install && 
        rm -rf /usr/local/nginx/html/* && 
        echo "ok" >> /usr/local/nginx/html/status.html && 
        cd / && rm -rf nginx* && 
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    ENV PATH $PATH:/usr/local/nginx/sbin
    COPY nginx.conf /usr/local/nginx/conf/nginx.conf
    WORKDIR /usr/local/nginx
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]

    tomcat dockerfile

    FROM centos:7
    MAINTAINER augustyang
    # tomcat 
    
    ENV VERSION=8.5.43
    
    RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && 
        yum clean all && 
        rm -rf /var/cache/yum/*
    
    COPY apache-tomcat-${VERSION}.tar.gz /
    RUN tar zxf apache-tomcat-${VERSION}.tar.gz && 
        mv apache-tomcat-${VERSION} /usr/local/tomcat && 
        rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && 
        mkdir /usr/local/tomcat/webapps/test && 
        echo "ok" > /usr/local/tomcat/webapps/test/status.html && 
        sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && 
        ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    ENV PATH $PATH:/usr/local/tomcat/bin
    
    WORKDIR /usr/local/tomcat
    
    EXPOSE 8080
    CMD ["catalina.sh", "run"]

    java dockerfile

    FROM java:8-jdk-alpine
    LABEL maintainer augustyang
    # java 
    ENV JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
    RUN  apk add -U tzdata && 
         ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    COPY ./target/eureka-service.jar ./
    EXPOSE 8888
    CMD java -jar $JAVA_OPTS /eureka-service.jar

    php dockerfile

    FROM centos:7
    MAINTAINER augustyang
    # php
    
    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/*
    
    COPY php-5.6.36.tar.gz /
    RUN 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"]

    注:ENTRYPOINT需要放在CDM前面 。

    CMD    启动带参数会替换cmd内的内容

        启动容器带参数:所带参数替换默认参数

        启动容器没带参数:起默认参数,

    ENTRYPOINT 不会替换 ENTRYPOINT内的内容

     

     

  • 相关阅读:
    vim 常用操作
    Zookeeper 一种简单的原子操作机制:
    用习惯的vimrc配置,在这里记录一下,以后可以继续完善使用
    static_cast, dynamic_cast, const_cast探讨【转】
    常用CSS标签使用
    Java基础
    Hibernate的第一个程序
    Hibernate的优缺点
    python基础语法
    ansible-role安装nginx,keepalived,tomcat
  • 原文地址:https://www.cnblogs.com/augustyang/p/11906773.html
Copyright © 2020-2023  润新知