zoukankan      html  css  js  c++  java
  • 001/Docker入门(Mooc)

    docker官网:https://www.docker.com/

    1。什么是docker

    2。Docker思想

        ==》

    【1】。集装箱:保证程序完整(不缺东西,如配置文件等)。

    【2】。标准化:开发测试都是使用一套环境

           (1)。运输方式:选择传输应用的方式,如QQ,ftp等。(docker不用)

           (2)。应用存储位置。(docker不需要你记住存储位置)

       (3)。API接口:接品标化化用同样的命令控制所有应用

    【3】。隔离:每个服务独自运行,互不影响

             LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。

    3。Docker解决什么问题

    【1】。我本地环境没问题啊〜(docker集装箱解决该问题)

    【2】。系统好卡,哪个同学又写死循环了〜(docker隔离性解决该问题,如:linux本来是多租户,允许多个用户使用。)

    【3】。双11来了,服务器撑不住了。(节日前扩展机器,节后再下线节点。浪费。有了docker,即可随时扩充服务器。)

    docker让快速扩展 & 弹性伸缩变得简单。

    4。Docker核心技术

    镜像:(集装箱)

    仓库:(超级码头)

    容器:(运行程序的地方)

    用docker运行一个程序的过程:去仓库把镜像拉到本地,用一条命令,把镜像运行起来变成容器。

    Build:构建镜像 [镜像 类比 集装箱]

    Ship:运输镜像(从仓库 & 主机上运输)[仓库 类比 超级码头]

    Run:运行镜像(运行的镜像就是一个容器)- [容器 就是 运行程序的地方]

    5。Docker镜像

    鲸鱼驮着的就是一堆镜像

    Docker镜像:镜像就是一系列的文件,它可以包括应用程序,应用环境的文件,docker将它保存到本地,以什么格式保存(涉及技术linux的存储技术:联合文件系统)

    联合文件系统:docker Unie fileSystem (分层)(可将不同目录挂在同一文件系统)

    test1第一层,test2第二层。test联合文件系统可以看到test1和test2所有内容。

    镜像存储格式:

     

    最底层-》最顶层:

    【1】操作系统引导 【2】具体linux操作系统 【3】相关软件,如tomcat/jdk【4】存储应用代码【5】容器(可修改)

    以上这些均为一个文件系统,为一个docker镜像。

    6。Docker容器

    容器的本质就是一个进程。(容器在镜像的最上层为可读可写,镜像的其他层均为只读)

    (可将容器理解为一个虚拟机)

    Docker镜像的每一层都是只读的,而容器作为最上层,是可读可写的。如果程序需要对镜像进行修改,那么Docker会把要修改的镜像文件拷贝到最上层的容器中,然后再进行修改。往后对该文件的访问会优先从容器中读取,寻找文件的顺序是从下往下。

    7。Docker仓库

    构建镜像的目的是在其他环境或其他机器上运行我的程序

    需要将镜像传输到其他环境--应用docker仓库(构建镜像-》运输-》Docker仓库《- 目地的从docker仓库拉取镜像)
    docker提供中央仓库:地址(hub.docker.com / c.163.com) 

    8。Docker安装

    视频地址;https://www.imooc.com/video/14616 (windows/ mac /linux)

    推荐linux,docker本身在linux研发,更源生。

    9。第一个docker镜像

    10。docker网络

    网络类型:

    1.Bridger:桥接模式(有独立的network namespace,即有独立IP和端口).与外界互通,需要端口映射。

    2.Host:主机模式(与主机共用同一网卡)

    3.NONE:无网络。docker容器不能与外界互通

    $docker run -d -p 8080:80 hub.c.163.com/library/nginx
    
    //-d:指定后台进程
    //-p:映射端口 (主机端口:容器端口)
    
    $netstat -na | grep 8080   //查看8080是否被占用
    
    $docker run -d -P hub.c.163.com/library/nginx
    //随机映射端口

    11。制作自己的镜像

    【1】。Dockerfile

    【2】。docker build

    【3】。Jpress

            http://jpress.io  //开源的java-web应用

    准备工作:

    1。javaWar包。

    2。java web依赖tomcat服务器,docker pull tomcat镜像

    3。vi Dockerfile     

    from tomcat镜像名     //tomcat作为基础镜像(tomcat包含jdk)
    
    MAINTAINER 所有者名 所有者联系方式   //所有者信息
    
    COPY jpress.war tomcat镜像webapp目录  //web应用放入镜像,运行自建javaweb程序

    4。docker build -t 镜像名字 目录(.表示当前目录)

    5。docker image ls //查看镜像

    6。运行自己的容器

    地址栏访问:http://localhost:8888/webappname 即可正常访问。 

    jpress项目需要mysql ,可在docker中安装一个mysql镜像即可.

    ……………………………………………………………………………………………………………………………………

    Eg1:以本地java打war包为例,构建一个镜像

    Step1:以tomcat镜像为基础镜像
    
    docker pull tomcat   //拉取tomcat镜像
    
    Step2:定制镜像
    
    touch Dockerfile   #新建Dockerfile文件
    
    vi Dockerfile   #编辑Dockerfile
    
    ##add content start
    
    FROM tomcat:latest
    
    MAINTAINER shiyufeng kaixinyufeng@sina.com
    
    COPY web-ssm-single.war /usr/local/tomcat/webapps
    
    ##add content end
    
    Step3:构建镜像
    
    docker build -t cfca-web:v1 .  //在当前目录,构建一个cfca-web的镜像,tag为v1的镜像
    
    Step4:run镜像为容器
    
    docker run -d -p 8089:8080 cfca-web:v1  //-d后台守护进程 -p映射端口宿主机:容器 镜像名
    
    地址栏访问:http://localhost:8089/web-ssm-single/即可。

    命令行访问:

    ZBMAC-C02VX5Y7H:myLearn shiyufeng$ curl http://localhost:8089/web-ssm-single

    ZBMAC-C02VX5Y7H:myLearn shiyufeng$ curl http://localhost:8089/web-ssm-single/

    <html>

    <body>

    <h2>Hello World!</h2>

    <h3><a href="/user/query">send request</a></h3>

    </body>

    </html>

    地址栏访问:http://localhost:8089/web-ssm-single/

    成功!!!

    Eg2:以nginx为例:

    //Step1:从远程仓库拉取镜像
    
    docker pull nginx   #未指定版本默认拉取最新镜像
    
    docker pull nginx:版本号  #指定版本号拉取
    
    //Step2:查看镜像
    
    docker image ls nginx
    
    //Step3:启动镜像-》容器
    
    docker run -d -p 8088:80 nginx:latest
    #-d指定后台守护进程 -p指定映射宿主机:容器端口号 nginx指定镜像名称
    
    //docker ps #查看当前运行的容器
    
    //以上相当于在本地8088端口开启了一个nginx服务。
    
    //地址栏访问:localhost:8088 即显示welcome to nginx
    
    //停止容器
    docker stop 容器id
    
    //重新启动容器
    docker ps -a   #查询所有容器
    docker start 容器id
    
    //在某一目录下新建index.html
    vi index.html
     <html><h1>yufeng learn docker!!!</h1></html>
    
    //拷备本地index.html文件到docker容器
    docker cp index.html 容器id://index.html文件所在容器路径
    docker cp index.html 容器id://usr/share/nginx/html
    
    //打开浏览器再次访问。页面显示新内容yufeng learn docker!!!
    
    //停止nginx容器 & 再重新运行nginx容器
    docker stop 容器id
    docker run -d -p 8088:80 nginx:latest
    
    //浏览器再次访问:localhost:8088,会出现welcome to nginx。而非新内容
    
    //说明:docker在容器内所做的改动都是暂时的,都是未被保存的。
    
    //保存自定义内容
    docker cp index.html 容器id://usr/share/nginx/html
    
    docker commit -m '备注信息' 容器id  名字
    
    上述会重新定制一个image
    
    docker run -d -p 8088:80 Repository

     注:上述用commit定制镜像不建议应用(命令无法找回)

    推建Dockerfile文件定制镜像。

    ……………………………………………………………………………………………………………………………………

    12。Volume:提供容器之外的持久化存储

    方法一:

    //docker run运行一个容器,通过-v挂载一个卷
    $docker run -d --name nginx -v /usr/share/nginx/html nginx
    
    //-d 守护进程  --name指定名称 -v挂载一个卷  nginx容器名称
    
    $docker inspect nginx  //检查

    核心位置:

    $ ls /var/lib/docker/volumes/c92d78d64d6be29847ec12583cced83015d5fd43b6e43b5379463d3cf3110165/_data
    
    //会报无该目录。原因是mac上多了一层虚拟层alpha
     screen ~/library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
    
    //应用上述命令即可进入

    //退出screen ctrl + a ,再按 d 键暂时退出终端

    方法二:volume本地目录挂载到容器目录中:

    $mkdir html
    $vi index.html
    ##content start 
    <html>
    <h1>docker volume学习!</h1>
    </html>
    ##content end
    
    $docker run -d -p 80:80 -v $PWD/html:/usr/share/nginx/html nginx
    
    //-d:后台守护进程   -p:端口映射(宿主机:容器)
    //-v:数据卷  (本机目录:容器目录)    nginx:镜像
    //$PWD:当前目录 
    
    //验证
    curl http://localhost
    
    //修改本机index.html内容。再将执行curl。则容器index.html随主机变化而变化。

    好处:只需要在本地修改,即可在容器中体现。

    方法三:volume挂载一个容器到另一容器

    //step1:创建一个目录叫data
    $mkdir data
    //step2:创建一个容器,该容器仅仅用于存储数据 docker create -v $PWD/data:/var/mydata --name data_container ubuntu // -v:volume $PWD:当前路径 // /var/mydata容器中路径,自定义 // -name指定容器名字 // ubuntu指定基础镜像 //Step3:运行并进入容器内部 $docker run -it --volumes-from data_container ubuntu /bin/bash //-it:交互式执行 /bin/bash //--volumes-from指定从另外一个容器挂载。 //ubuntu:基础镜像 //Step4: $ mount //Step5:进入容器该目录下 $ cd var/mydata //Step6:创建一个文件 $ vi volume.txt //Step7:退出 exit //Step8:查看本机data目录下,已经有volume.txt文件

    应用mount命令查看挂载目录

    进入容器目录,添加一个文件,在本地文件目录/data下即可看到刚在容器中创建的目录。

    好处:新创建的数据容器可以被多个其他容器挂载,达到数据共享. 

    13。Registry:镜像仓库(SAAS服务)

    术语:

    //搜索镜像
    docker search 镜像名(eg:redis)
    
    //拉取镜像
    docker pull XXX
    
    //推送镜像到远端仓库
    docker push XXX   //之前需要$ docker login

    国内一些仓库:daocloud/时速云/aliyun

    14。docker-compose:多容器app

    【1】安装docker-compose

    【2】实战

    Mac安装:

    https://docs.docker.com/docker-for-mac/edge-release-notes/#docker-community-edition-18050-ce-mac66-2018-05-17

  • 相关阅读:
    第三周助教总结
    第三周作业
    第二周助教总结
    参数和指针
    第二周作业
    第一周作业 2
    第一周作业 1
    第七周助教小结
    第六周助教小结
    第五周助教总结
  • 原文地址:https://www.cnblogs.com/kaixinyufeng/p/9247151.html
Copyright © 2011-2022 走看看