zoukankan      html  css  js  c++  java
  • docker入门学习之旅

    一、docker与传统虚拟化技术的区别

        传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;

            而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

            Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

      Hypervisor 不仅协调虚拟机硬件资源,而且增加各虚拟机施加防护;

       

         

     二、docker的基本概念

         Docker 包括三个基本概念:
          镜像(Image)
          容器(Container)
          仓库(Repository)
          理解了这三个概念,就理解了 Docker 的整个生命周期,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

    2.1.镜像

          Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等) 。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

          镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。

    2.2.容器

          镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

          容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会把容器和虚拟机搞混。

    2.3.仓库

          镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个仓库(Repository) ;每个仓库可以包含多个标签(Tag) ;每个标签对应一个镜像。

    三、安装部署

      3.1配置docker的yum仓库

        curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

      3.2 安装docker-ce的社区版本

        yum install  docker

      3.3  检查已安装的docker版本

        yum list  intalled | grep docker  |   yum list docker-ce --showd uplicates

    四、docker的镜像管理

      4.1 进入http://dockerhub.com官网注册一个账号
      4.2  登录docker
        docker login docker.io
      4.3 查找镜像
        docker search alpine
      4.4 拉取镜像
        docker pull   docker.io/library/alpine
      4.5 拉取指定版本的镜像
        docker pull   docker.io/library/alpine:3.10.1
      4.6 列出本地镜像
        docker images | docker image ls
      4.7 给镜像打标签
         docker tag ${image_id} ${tag} 示例:docker tag 965ea09ff2eb docker.io/jhoneming/alpine:v3.10.3
      4.8 推送镜像
        docker push docker.io/jhoneming/alpine:3.10.1
      4.9 删除镜像
        docker rmi ${image_id} | docker rmi ${image_name}
    4.10 强制删除镜像
        docker rmi -f ${image_id} | docker rmi -f ${image_name}

    五、docker容器的基本操作

    容器主要操作如下:

      

    查看所有容器
      docker ps -a
    启动交互式容器(写入内容到1.txt文件: echo hello > 1.txt, 1.txt文件随着容器的退出文件也就不存在了) ~]# docker run -ti --rm jhoneming/alpine:latest /bin/sh 启动一次性运行容器 ~]# docker run --rm jhoneming/alpine:latest /bin/echo hello 启动一个后台容器 docker run -d a24bb4013296 /bin/sleep 120 交互式进入一个容器 ~]# docker exec -ti e0b7fcf28418 /bin/sh
    容器的启停操作 ~]# docker start/stop/restart e0b7fcf28418 删除镜容器 ~]# docker rm -f myalpine1 删除所有已经退出的容器 ~]# for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done 将容器固化成镜像(写入内容到1.txt文件:echo hello > 1.txt,由jhoneming/alpine:v3.10.3_with_1.txt镜像运行的容器中1.txt文件不会随着容器的退出而不存在) ~]# docker commit -p myalpine jhoneming/alpine:v3.10.3_with_1.txt 将镜像保存成文件 ~]# docker save 6c2009aef1cc > alpine:v3.10.3_with_1.txt.tar 加载文件生成一个镜像 ~]# docker load < alpine:v3.10.3_with_1.txt.tar 给镜像打标签 ~]# docker tag 6c2009aef1cc jhoneming/alpine:v3.10.3_with_1.txt 实时查看容器运行产生的日志 ~]# docker logs -f 7756b96cc32a

    六、docker容器的高级操作

    容器主要高级操作如下:

    ~]# docker pull nginx:1.12.2
    映射容器内端口到容器外 ~]# docker run --rm --name mynginx -d -p81:80 jhoneming/nginx:v1.12.2 ~]# mkdir html html]# wget www.baidu.com -O index.html
    将容器内目录挂载到容器外目录上 ~]# docker run -d --rm --name nginx_with_baidu -d -p82:80 -v/root/html:/usr/share/nginx/html jhoneming/nginx:v1.12.2
    检视容器目录挂载信息 ~]# docker inspect 8c440bed2ccb
    初始化容器时传递环境变量 ~]# docker run --rm -e E_OPTS=abcdefg jhoneming/alpine:latest printenv ~]# docker exec -ti nginx_with_baidu /bin/bash tee /etc/apt/sources.list << EOF deb http://mirrors.163.com/debian/ jessie main non-free contrib deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib EOF
    容器内安装软件 /# apt-get update && apt-get install curl -y ~]# docker commit -p 8c440bed2ccb jhoneming/nginx:curl ~]# docker push jhoneming/nginx:curl

    七、Dockerfile

     

    7.1 USER/WORKDIR指令用法
    vi /data/dockerfile/Dockerfile FROM jhoneming/nginx:v1.12.2 #标红为基础镜像需创建 USER nginx ##指定容器进程运行用户 WORKDIR /usr/share/nginx/html #运行容器后进入的目录 dockerfile]# docker build . -t docker.io/jhoneming/nginx:v1.12.2_with_user_workdir #根据Dockerfile文件构建镜像 dockerfile]# docker run --rm -ti --name nginx123 jhoneming/nginx:v1.12.2_with_user_workdir /bin/bash #运行容器 nginx@149ac8f528cc:/usr/share/nginx/html$ whoami nginx nginx@149ac8f528cc:/usr/share/nginx/html$ pwd /usr/share/nginx/html 7.2 ADD/EXPOSE指令用法 FROM jhoneming/nginx:v1.12.2 ADD index.html /usr/share/nginx/html/index.html # 拷贝宿主机当前目录index.html文件到容器/usr/share/nginx/html目录下 EXPOSE 80 #将容器运行服务的80端口在宿主机映射随机端口 参数 -P dockerfile]# docker build . -t jhoneming/nginx:v1.12.2_with_index_expose dockerfile]# docker run --rm -d --name nginx123 -P jhoneming/nginx:v1.12.2_with_index_expose /data/dockerfile/dcokerfile #-P 映射端口

    7.3 ENV/RUN指令用法

    FROM centos:7
    ENV VER 9.11.4 环境变量
    RUN yum install bind-$VER -y 引用环境变量,bind软件固化到镜像上(RUN指令用法:构建镜像时执行可执行的命令)

    dockerfile]# docker build . -t jhoneming/bind:v9.11.4_with_env_run

    7.4 CMD/ENTRYPOINT指令用法

    FROM centos:7
    RUN yum install httpd -y
    CMD ["httpd","-D","FOREGROUND"]  #(启动容器时执行命令启动httpd服务进程)

    dockerfile]# docker build . -t jhoneming/httpd:test

    FROM centos:7
    ADD entrypoint.sh /entrypoint.sh
    RUN yum install epel-release -q -y && yum install nginx -y
    ENTRYPOINT /entrypoint.sh    #(启动容器默认会执行容器里/entrypoint.sh脚本)

    vim /data/dockerfile/entrypoint.sh

    #!/bin/bash

    /sbin/nginx -g "daemon off;"   #(容器的nginx进程以前台方式运行)

    dockerfile]# docker run --rm -p84:80 jhoneming/nginx:mynginx

    八、综合实验

    FROM jhoneming/nginx:v1.12.2
    USER root
    ENV WWW /usr/share/nginx/html
    ENV CONF /etc/nginx/conf.d
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && 
    echo 'Asia/Shanghai' >/etc/timezone
    WORKDIR $WWW
    ADD index.html $WWW/index.html
    ADD demo.od.com.conf $CONF/demo.od.com.conf
    EXPOSE 80
    CMD ["nginx","-g","daemon off;"]
    
    dockerfile]# vi demo.od.com.conf
    server {
    listen 80;
    server_name demo.od.com;
    root /usr/share/nginx/html;
    }

    [root@centos7 dockerfile]# wget index.html www.baidu.com

    [root@centos7 dockerfile]# ls /data/dockerfile/ -l
    total 12
    -rw-r--r-- 1 root root 78 Sep 13 17:47 demo.od.com.conf
    -rw-r--r-- 1 root root 329 Sep 13 18:05 Dockerfile
    -rw-r--r-- 1 root root 2381 Sep 13 18:24 index.html

    dockerfile]# docker run -ti --rm --name lhwl2 --net=container:d62807b4af37 jhoneming/nginx:curl

      

    九、Docker的网络模式

    访问地址:https://www.cnblogs.com/sammyliu/p/5894191.html

  • 相关阅读:
    unity3d 免费好用的数据库处理框架 数据库直连框架
    为.NET搭建Linux的开发环境,鄙视那些将简单事情复杂化的人
    为Linux重新开发MVC,有图有真相
    让我们一起用开源数据库和开源框架废弃Access
    C#子线程执行完后,调用主线程的方法
    javascript 将 table 导出 Excel ,可跨行跨列
    Easyui中 messager.alert 后某文本框获得焦点
    Easyui中 alert 带回调函数的 消息框
    wamp 在本地安装PHP环境, 开启 curl 扩展
    H+ 编辑tab页 保存后 刷新列表tab页 并关闭自已。tabA页调用tabB页的方法
  • 原文地址:https://www.cnblogs.com/tanxiaojun/p/13585984.html
Copyright © 2011-2022 走看看