美文网首页
docker(一)

docker(一)

作者: 吃可爱长大鸭 | 来源:发表于2020-01-07 19:54 被阅读0次

    1.什么是容器?

    容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,ip地址,主机名等
    

    2.容器和虚拟化的区别

    linux容器技术,容器虚拟化和kvm虚拟化的区别

    kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)

    linux开机启动流程:
    bios开机硬件自检
    根据bios设置的优先启动项boot  网卡 硬盘 u盘 光驱
    读取mbr引导 2T  UEFI(gpt分区)    mbr硬盘分区信息,内核加载路径,   
    加载内核
    启动第一个进程/sbin/init  systemd
    系统初始化完成
    运行服务(nginx,httpd,mysql)等等。
    
    容器启动流程:
    共用宿主机内核:
    第一个进程直接启动服务(nginx,httpd,mysql)
    

    容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
    虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统

    3.docker 虚拟化理论

    Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
    namespace  资源隔离
    cgroups    进程的资源限制
    kvm       虚拟磁盘文件,资源隔离
    kvm       资源限制,--cpus --memory
    

    4.docker的主要组成部分

    docker是传统的CS架构分为docker client和docker server,向mysql一样    
    
    命令:docker version
    [root@controller ~]# docker version 
    Client:
     Version:   17.12.0-ce
     API version:   1.35
     Go version:    go1.9.2
     Git commit:    c97c6d6
     Built: Wed Dec 27 20:10:14 2017
     OS/Arch:   linux/amd64
    
    Server:
     Engine:
      Version:  17.12.0-ce
      API version:  1.35 (minimum version 1.12)
      Go version:   go1.9.2
      Git commit:   c97c6d6
      Built:    Wed Dec 27 20:12:46 2017
      OS/Arch:  linux/amd64
      Experimental: false
    
    
    docker主要组件有:镜像、容器、仓库, 网络,存储
    
    启动容器必须需要一个镜像,仓库中只存储镜像
    容器---镜像---仓库
    

    第一章 docker的安装

    # 清楚旧版本
    yum remove docker docker-common docker-selinux docker-engine
    # 安装依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 下载yum源
    wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
    sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
    # 更新
    yum makecache fast
    # 安装docker server client 最新稳定版本
    yum install docker-ce docker-ce-cli containerd.io
    # 指定安装哪个版本
    yum list docker-ce --showduplicates | sort -r
    yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
    # 启动docker&加入开机自启
    systemctl start docker 
    systemctl enable docker
    # 查看版本
    docker version
    # 查看详细信息
    docker info
    

    第二章 镜像加速

    docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行

    部署服务,环境问题、一次构建,处处运行 、docker是一种软件的打包技术

    官网地址

    https://www.daocloud.io/mirror

    加速命令

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

    阿里镜像加速地址

    https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
    

    加速命令

    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl restart docker
    

    第三章 docker的镜像管理

    选镜像的建议:  
    1,优先考虑官方  
    
    2,stars数量多
    
    官方镜像仓库地址:hub.docker.com
    
    获取镜像    docker pull(push)    
    镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,
    Docker 中国官方镜像加速:[https://registry.docker-cn.com](https://registry.docker-cn.com)    
    官方pull  docker pull centos:8(没有指定版本,默认会下载最新版)  
    私有仓库pull  docker pull daocloud.io/huangzhichong/alpine-cn:latest
    

    第四章 docker镜像命令

    搜索镜像    
        docker search
    查看镜像列表
        docker images  or  docker image  ls
    删除镜像
        docker rmi  例子:docker image rm centos:latest
    导出镜像
        docker save  例子:docker image save centos -o docker-centos7.tar.gz
    导入镜像
        docker load  例子:docker image load -i docker-centos7.tar.gz
    

    第五章 docker容器命令

     docker run -d -p 80:80 nginx:latest  
    run(创建并运行一个容器)
    -d 放在后台
    -p 端口映射
    -v  源地址(宿主机):目标地址(容器)
    
    nginx docker镜像的名字
    
    docker run -it --name centos6 centos:6.9 /bin/bash
    -it   分配交互式的终端interactive tty
    --name 指定容器的名字
    /bin/sh覆盖容器的初始命令
    
    运行容器***
        docker run image_name   
    
        docker run ==== docker create  + docker start
    启动容器
        docker start  ID或NAME
    停止容器
        docker stop   ID或NAME
    杀死容器
        docker kill container_name
    查看容器列表
        docker ps(-a -l  -q)
    查看容器的详细信息
        docker inspect 容器ID
    进入正在运行的容器(目的,调试,排错)
    *** docker exec  (会分配一个新的终端tty)
            docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    
        docker exec -it  容器id或容器名字 /bin/bash(/bin/sh)   
        docker attach(使用同一个终端)  偷偷离开的快捷键ctrl+p,ctrl+q
            docker attach [OPTIONS] CONTAINER
        nsenter(安装yum install -y util-linux 弃用)
    
    删除容器
        docker rm
    批量删除容器
        docker rm -f `docker ps -a -q`
    

    总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!

    业务在容器中运行:初始命令,夯住,启动服务

    第六章 docker容器的网络访问(端口映射)

    docker0:172.17.0.1   jumpserver:172.17.0.2   nginx:172.17.0.3
    
    指定映射(docker 会自动添加一条iptables规则来实现端口映射)
        docker run -p hostPort:containerPort
        docker run -p ip:hostPort:containerPort  多个容器都想使用8080端口
        docker run -p ip::containerPort(随机端口)
        docker run -p hostPort:containerPort/udp
        docker run -p  10.0.0.100::53/udp   使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
        docker run -p 81:80 –p 443:443 可以指定多个-p
    
    随机映射
        docker run -P (随机端口)
    
    通过iptables来实现的端口映射
    

    第七章 docker的数据卷管理

    创建目录:
    mkdir /data
    解压压缩包到/data目录
    tar xf xiaoniao.tar.gz -C /data
    docker宿主机映射到容器站点目录
    docker run -d -p 80:80 -v /data/xiaoniao:/usr/share/nginx/html nginx:latest
    
    映射多个目录
    配置文件
    cat >/data/game.conf<<EOF
    server {
        listen       82;
        server_name  localhost;
        location / {
            root   /data/game/;
            index  index.html index.htm;
        }
    }
    
    server {
        listen       83;
        server_name  localhost;
        location / {
            root   /data/xiaoniao/;
            index  index.html index.htm;
        }
    }
    EOF
    docker run -d -p 82:82 -p 83:83 -v /data/xiaoniao:/data/xiaoniao -v /data/game:/data/game -v /data/game.conf:/etc/nginx/conf.d/game.conf nginx:latest
    
    数据卷(文件或目录)
        -v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
        -v src(宿主机的目录):dst(容器的目录)
    数据卷容器
        --volumes-from(跟某一个已经存在的容器挂载相同的卷)
    

    第八章 docker手动将容器保存为镜像

    运行centos:7镜像

    docker run -it centos:7 /bin/bash
    

    进入容器安装

    yum install wget install openssh-clients -y
    rm -rf /etc/yum.repos.d/*
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
    cat >/etc/yum.repos.d/nginx.repo<<EOF  
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    EOF
    yum makecache fast
    yum install nginx -y
    scp -r 10.0.0.11:/data/* /opt/
    mv /opt/game.conf /etc/nginx/conf.d/
    docker ps
    docker commit 容器ID game:v1
    docker images
    docker save game:v1 > game-v1.tar
    docker load < game-v1.tar
    docker run -p 8080:8080 -p 8090:8090 -d game:v1 nginx -g 'daemon off;'
    

    第九章 自定义一个云盘镜像kod

    1.先系统初始化

    rm -rf /etc/yum.repos.d/*
    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
    useradd www -s /sbin/nologin -M
    

    2.安装nginx和php环境

    cat >/etc/yum.repos.d/nginx.repo<<EOF  
    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    EOF
    yum makecache fast
    yum install nginx php-fpm php-mbstring php-gd unzip -y
    

    3.创建nginx配置文件

    rm -rf /etc/nginx/conf.d/default.conf
    sed -i '/^user/c user www;' /etc/nginx/nginx.conf
    sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
    sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
    sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf     
    cat >/etc/nginx/conf.d/kod.conf<<EOF
    server {
        server_name localhost;
        listen 80;
        root /code/kod;
        index index.php index.html;
    
        location ~ \.php\$ {
            root /code/kod;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
            include fastcgi_params;
        }
    }
    EOF
    

    4.创建代码目录并上传代码

    mkdir /code/kod -p 
    unzip kodexplorer4.40.zip -d /code/kod 
    chown -R www:www /code 
    

    5.启动测试

    nginx
    php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
    

    6.编写启动脚本

    vi /root/go.sh
    #!/bin/bash
    nginx 
    php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
    

    7.基于当前的容器提交新镜像

    docker commit 容器ID my_kod:v1 
    

    8.基于自定义的镜像启动新容器

    docker stop $(docker ps -qa)
    docker rm $(docker ps -qa)
    docker run -d -p 80:80 my_kod:v1 /bin/bash /root/go.sh 
    

    9.测试

    10.0.0.11
    

    第十章 dockerfile自动构建docker镜像

    类似ansible剧本,大小几kb
    手动做镜像:大小几百M+

    dockerfile 支持自定义容器的初始命令

    dockerfile主要组成部分:
        基础镜像信息       FROM  centos:7
        制作镜像操作指令   RUN yum install openssh-server -y
        容器启动时执行指令 CMD ["/bin/bash"]
    

    dockerfile常用指令:

    FROM  这个镜像的妈妈是谁?(指定基础镜像)
    MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
    LABLE      描述,标签
    RUN 你想让它干啥(在命令前面加上RUN即可)
    ADD 给它点创业资金(会自动解压tar)  制作docker基础的系统镜像
    WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
    VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
    EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
    CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
    dockerfile其他指令: 
    COPY 复制文件(不会解压)rootfs.tar.gz
    ENV  环境变量
    ENTRYPOINT  容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
    

    可道云案例:

    1.先收集所有需要的配置文件

    mkdir /root/dockerfile/{conf,repo,code} -p
    docker cp ee59eef3d3a0:/etc/yum.repos.d/CentOS-Base.repo  /root/dockerfile/repo/
    docker cp ee59eef3d3a0:/etc/yum.repos.d/epel.repo  /root/dockerfile/repo/
    docker cp ee59eef3d3a0:/etc/yum.repos.d/nginx.repo  /root/dockerfile/repo/
    
    docker cp ee59eef3d3a0:/etc/nginx/nginx.conf /root/dockerfile/conf
    docker cp ee59eef3d3a0:/etc/nginx/conf.d/kod.conf /root/dockerfile/conf
    docker cp ee59eef3d3a0:/etc/php-fpm.d/www.conf  /root/dockerfile/conf
    docker cp ee59eef3d3a0:/root/go.sh  /root/dockerfile/conf
    
    docker cp ee59eef3d3a0:/code/kod /root/dockerfile/code/
    

    2.编写dockerfile

    vim /root/dockerfile/dockerfile
    

    0.基础镜像

    FROM centos:7
    

    1.系统初始化

    RUN useradd www -s /sbin/nologin -M
    RUN rm -rf /etc/yum.repos.d/*
    ADD repo/CentOS-Base.repo   /etc/yum.repos.d/CentOS-Base.repo
    ADD repo/epel.repo          /etc/yum.repos.d/epel.repo
    ADD repo/nginx.repo         /etc/yum.repos.d/nginx.repo
    

    2.安装nginx和php环境

    RUN yum install nginx php-fpm php-mbstring php-gd unzip -y
    RUN yum clean all
    

    3.创建nginx配置文件

    ADD conf/nginx.conf     /etc/nginx/nginx.conf
    ADD conf/kod.conf       /etc/nginx/conf.d/kod.conf 
    ADD conf/www.conf       /etc/php-fpm.d/www.conf
    ADD conf/go.sh          /root/go.sh
    

    4.创建代码目录并上传代码

    RUN rm -rf /etc/nginx/conf.d/*
    ADD code  /code
    RUN chown -R www:www /code 
    

    5.启动命令

    CMD ["/bin/bash","/root/go.sh"]
    

    3.构建镜像

    docker build --network=host -t my_kod:v3 .
    

    4.测试新镜像

    docker stop $(docker ps -qa)
    docker rm $(docker ps -qa)
    docker run -d -p 80:80 my_kod:v3
    

    相关文章

      网友评论

          本文标题:docker(一)

          本文链接:https://www.haomeiwen.com/subject/zjhdactx.html