精华内容
下载资源
问答
  • docker入门(利用docker部署web应用)

    万次阅读 多人点赞 2019-05-26 10:44:15
    前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用 目录 第一章 什么是docker 1.1 docker的发展史 1.2 docker国内应用史 1.3 什么是Docker 第二章 了解docker 2.1 ...

    更新:随手写的一篇博客能收获这么多赞真是挺开心的,不过现在博主很忙,博主本人主要也是从事Java方向对docker暂时没有更深的理解了,写这个目的也是为了自己复习,恕不能对出现问题的同学进行答疑了,当然如果哪里写的有问题还是可以提一下。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------

    前言:本课程是在慕课网上学习 第一个docker化的java应用 课程时所做的笔记,供本人复习之用

    目录

    第一章 什么是docker

    1.1 docker的发展史

    1.2 docker国内应用史

    1.3 什么是Docker

    第二章 了解docker

    2.1 docker思想

    2.1.1 集装箱

    2.1.2 标准化

    2.1.3 隔离

    2.2 docker解决的问题

    2.2.1 系统环境不一致

    2.2.2 系统好卡,哪个哥们又写死循环了

    2.2.3 双11来了,服务器撑不住了

    第三章 走进docker

    3.1 镜像

    3.2 容器

    3.3 仓库

    第四章 centos下docker安装

    第五章 docker初体验

    5.1 docker基本命令

    5.2 docker运行镜像流程

    第六章 docker运行nginx

    6.1 运行nginx镜像

    6.2 docker网络

    6.2.1 网络介绍

    6.2.2 实际访问端口

    第七章 docker部署第一个java web应用

    7.1 制作自己的镜像

    7.2 运行自己的镜像


    第一章 什么是docker

    1.1 docker的发展史

    2010年几个年轻人成立了一个做PAAS平台的公司dotCloud.起初公司发展的不错,不但拿到过一些融资,还获得了美国著名孵化器YCombinator的支持,后来微软谷歌亚马逊这样的大厂商也纷纷加入PAAS平台,竞争十分激烈,dotCloud举步维艰.

    2013年可能是公司发展的不是很好,工程师又不想自己的努力付之东流,于是他们决定将他们的核心技术开源.这项技术就是docker.当时docker的功能就是将linux容器中的应用代码打包,可以轻松的在服务器之间进行迁移.

    无心插柳柳成荫,docker技术风靡全球,于是dotCloud公司改名为docker Inc,并全面投入到docker的开发之中.

    2014.6 Docker发布了第一个版本 Docker1.0

    2014.7 获得C轮融资 $4000W

    2015.4 获得D轮融资 $9500W

    至今已经发布到docker 

    1.2 docker国内应用史

     

     

     

    由此看出,不管开发测试还是运维,绝大多数人都应该会接触到docker.所以学docker还是很有必要的.

     

    1.3 什么是Docker

    docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中.

    官方解释:

     

    第二章 了解docker

    2.1 docker思想

    2.1.1 集装箱

    没有集装箱之前运输货物,东西零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西.

    2.1.2 标准化

    1. 运输方式

    docker运输东西有一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地去.对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去.

    2. 存储方式

    当我们把程序存储到笔记本上时,我们需要一个目录,且我们要记住这个目录,因为下次我们可能还要修改,有了docker之后我们就不用记住了程序在哪里了,我们使用的时候只需要一条命令就行了.

    3. API接口

    docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个启动停止查看删除等等,如当我们要启动tomcat时我们要执行startup命令,当我们要停止时要执行shutdown命令,如果不是tomcat,我们可能还需要一些别的命令.有了docker我们记docker的命令就可以对其进行操作.

    2.1.3 隔离

    我们在使用虚拟机时有自己的cpu,硬盘,内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒.最底层的技术时linux一种内核的限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术.最大效率的隔离了进程和资源.通过cgroup,namespace等限制,隔离进程组所使用的物理资源,比如CPU,MEMORY等等,这个机制在7,8年前已经加入到linux内核了,直到2013年docker出世的时候才火起来,大家可能奇怪为什么这么好的技术埋没这么多年都没人发现呢?英雄造时势,时势造英雄,如果没有云计算,敏捷开发,高频度的弹性伸缩需求,没有IT行业这么多年长足的发展,也就没有docker.

    2.2 docker解决的问题

    2.2.1 系统环境不一致

    开发:我本地没问题.运维:服务器没问题. 这个问题就变成了皮球.

    如果一个应用要正常的启动起来需要什么?比如java web应用.

    需要一个操作系统,操作系统之上要jdk,tomcat,我们的代码,配置文件.

    操作系统的改变可能会导致我们的应用开不起来,比如我们调用了某些系统命令.

    jdk版本也可能导致程序的运行失败.比如class文件需要1.7编译,我们装了个1.6的jdk.

    tomcat版本也能导致失败,比如旧的版本一些配置在新版本中不再支持.

    代码的话就比如应用了C盘,D盘的一个文件,或者是用了系统的一些环境编码.

    配置的话我们可能少了某个配置文件等等.

    下面docker来了,它把操作系统,jdk,tomcat,代码,配置全部放到集装箱里.再打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行.不会有任何的问题.一句话就是docker解决了运行环境不一致所带来的问题.

    2.2.2 系统好卡,哪个哥们又写死循环了

    如果有根别人共用服务器的同学可能有这样的体会,莫名其妙发现自己的程序挂了,一查原因要不是内存不够了,要不是硬盘满了,还有就是发现某个服务变慢了,甚至敲终端都比较卡,但是linux本身就是一个多用户的操作系统本身就可以供多个用户使用,docker的隔离性可以解决这个问题,就算别人的程序还是死循环疯狂吃CPU,还是封装疯狂打日志把硬盘占满,还是内存泄漏,把内存占满,都不会导致我们的程序运行错误.因为docker在启动的时候就限定好了,它最大使用的CPU硬盘,如果超过了,就会杀掉对应进程.

    2.2.3 双11来了,服务器撑不住了

    大部分系统业务量并不是每天都比较平均的,特别是一些电商系统,每天总有那么几天业务量是平时的几倍甚至几十倍,如果按双11的规模去准备服务器那么对于平时的规模来说又是极大的浪费,所以就在节日前临时扩展机器,过完节再把多余的节点下线,这就给运维带来了非常大的工作量,一到过节就在各个机器上部署各种各样的服务,我们启动程序需要java,tocmat等等,并且还可能起不来还要调试,这是非常恶心的工作,有了docker一切都变得美好了,只要点一下服务器就可以从10台变成100台甚至1000,1W台.都是分分钟的事情.

    为什么会这么快呢?都是用标准的方式把我们的程序运过来,下载过来,再用标准的方式把它运行起来,就可以做到只要在每台机器上都执行一两条命令,就可以让程序正常跑起来,并且不用担心有问题.


    第三章 走进docker

    镜像就是上面说的集装箱,仓库就是超级码头,容器就是我们运行程序的地方.docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器.

    build:构建,就是构建镜像.

    ship:运输,运输镜像,从仓库和主机运输.

    run:运行的镜像就是一个容器.

    build,ship,run和镜像,仓库,容器是一一对应的.

    3.1 镜像

    镜像的英文名交image.前面我们讲到了集装箱,鲸鱼拖着的所有集装箱就是一个镜像.

    从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件,既然是文件,那么是以什么样的格式在本地保存的呢?

    说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下.

    比如test1下有三个文件夹,test2下有两个文件夹,还有一个readme文件.联合文件系统就是可以在一个文件夹(test)中看到多个文件夹(test1,test2)中的内容.

    通过这种方式可以实现文件的分层,test1可以把它看作第一层,test2可以把它看作第二层,每一层有每一层自己的文件,docker就是利用了这种分层的概念实现了镜像存储.

    下图就是镜像的存储格式,这张图是分层的,最下面一层,上面也是一层层的好像集装箱罗列在一起.这就是镜像最直观的存储方式.下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件,如果是我们自己的程序,就可以是tomcat,jdk,再往上是应用代码,每一层是我们自己都可以控制得,最上面一层先忽略不看,因为这是和容器有关的.注意一点,docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统.docker的这种文件系统被称之为镜像.

    图1

     

    3.2 容器

    为了便于理解,大家可以把容器想象成虚拟机,每个虚拟机都有自己的文件系统,可以把图1整个一部分看成是文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的.为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统.

    在程序的运行过程中,如果要写镜像文件时,因为镜像的每一层都是只读的,它会把文件的每一层拷到文件的最上层,然后再对它进行修改,修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层.

    由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰.

    3.3 仓库

    我们的镜像是要在其它机器上运行,如何进行传输呢?

    这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程.

    谁提供了这样的仓库呢?docker自己提供了,hub.docker.com,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库.比较知名的是由网易蜂巢提供的 https://c.163yun.com/hub#/m/home/

     

    第四章 centos下docker安装

    因为我这里使用的是centos所以就在centos下安装.

    参考博客与网站:

    https://www.jb51.net/article/161580.htm

    https://blog.csdn.net/jsnhux/article/details/89847109

    https://docs.docker.com/install/linux/docker-ce/centos/

     

     

    1. Docker 要求 CentOS 系统的内核版本高于 3.10,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

    通过 uname -r 命令查看你当前的内核版本

    2.  如果安装过请先卸载

    yum remove docker \
               docker-client \
               docker-client-latest \
               docker-common \
               docker-latest \
               docker-latest-logrotate \
               docker-logrotate \
               docker-engine

    3.安装依赖设置yum仓库

    安装依赖:

    yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2

    设置仓库:

    yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    

    4. 安装docker

    yum install docker-ce docker-ce-cli containerd.io

    5. 启动并加入开机启动

    systemctl start docker
    systemctl enable docker

    6.验证是否安装成功

    docker version
    docker run hello-world

    显示如下即安装成功! 

    [root@iZ2ze68ge5c1uwlkmnb9ixZ zcapp]# docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    1b930d010525: Pull complete 
    Digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    


    第五章 docker初体验

    5.1 docker基本命令

    1.docker pull [options] NAME[:TAG]

    通过此命令可以docker远程仓库拉取镜像到本地.

    name是拉取镜像的名称,:TAG表示是可选的,如果不选表明时latest,如果选择表明是指定版本的.

    options是拉去的一些参数.

    当不加请求地址的时候回去docker的官网拉取镜像.

    2.docker images [options] [REPOSITORY[:TAG]]

    options是选项,后面是指定镜像的名称.这个用的不多,可能当本地镜像非常多的时候要指定查看某一个镜像.

    IMAGE ID 其实是一个64位的字符串,它可以唯一标识我们的镜像,这里只显示了16位,后面的被截掉了.

    3. docker run [options] IMAGE[:TAG] [COMMAND] [ARG..]

    IMAGE是镜像的名字

    COMMAND是运行起来的时候要执行什么命令.

    ARG表示这条命令运行需要的参数.

    5.2 docker运行镜像流程

    docker pull:首先docker pull向docker daemon发送了一条命令pull,告诉docker daemon要拉取某一个镜像,docker daemon会在本机检查镜像是否存在,如果存在且版本就是我们想要拉取的版本,它就不会做任何的操作.如果不存在下一步它会到docker的仓库中找我们要拉取的镜像名字,如果找到了就会有docker仓库传送到我们的本地,把我们要的镜像传送到我们的本地来.

    docker run:首先把命令发送到我们的docker daemon,docker daemon会先检查镜像在本机是否存在,如果不存在相当于执行了一个docker pull的过程,下载回来之后会以一定方式把镜像运行起来变成docker容器.


    第六章 docker运行nginx

    6.1 运行nginx镜像

    我们打开网易蜂巢镜像中心 https://c.163yun.com/hub#/m/home/

    搜索nginx,可以看到有两个nginx,他们的名字和头上和图标都不一样,一个是鲸鱼,一个是两个球.

    带有鲸鱼的镜像表示这个镜像是从官网的镜像中心复制过来的.这个镜像与docker的镜像是一摸一样的.我们使用此镜像.

    点进去,会有下载地址,复制里面的地址,然后拉取镜像.

    复制到系统中运行.

    运行完后可以查看镜像状态

    在前台运行容器命令如下,输入后容器就会运行,按ctrl+c可以终止容器的运行.

    docker run hub.c.163.com/library/nginx

    在后台运行容器:

    docker run -d hub.c.163.com/library/nginx

    查看运行的容器:

    docker ps

    更多关于运行的命令:

    docker run --help

    因为我们在平时运行的时候需要调试容器内部的设置、查看一下日志等等.我们可以通过如下命令进入容器内部:

    命令的大体内容:

    命令具体内容: 

    docker exec -it 02963d2002b bash

     -i保证我们的输入有效,即使在没有detach的情况下也能运行.

    -t表示将分配给我们一个伪终端.我们将在伪终端输入我们的内容.

    后面跟着的是容器的id,即我们上面用ps查询出来的id,这个id可以少写几位,它会自动识别.

    可输入如下命令了解更多:

    docker exec --help

    输入命令后发现我们前面的标识也变了,相当于进入了一个新的电脑.

    可以查询一下nginx在什么位置

    which nginx

    打开ps查看一下当前运行的进程.我这里提示没有ps命令.我从网上查了一下发现是因为当前系统没有安装这个命令,然后我安装了一下.从命令可以看出,这个nginx容器附带的系统应该是ubuntu不是centos.

    安装ps命令:

    apt-get update
    
    apt-get install procps
    

    利用ps命令查看进程,可以发现nginx已经在运行了.

    ps -ef

    输入 exit即可退出返回原来的系统. 

    6.2 docker网络

    6.2.1 网络介绍

    上面我们只运行了nginx,并没有用浏览器进行访问,这里我们尝试用浏览器访问,但是之前我们要了解一下docker网络.

    我们直到docker的隔离性,网络也是个隔离性的一部分,linux使用了命名空间来进行资源的隔离,比如pid namespace就是用来隔离进程的,mount namespace是用来隔离文件系统的,network namespace 是用来隔离网络的.每一个network namespace都提供了一个独立的网络环境,包括网卡路由iptable规则等等,都是与以其它的network space隔离的.

    1. docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式.

    在使用Bridge时就涉及到了一个问题,既然它有独立的namesapce,这就需要一种技术使容器内的端口可以在主机上访问到,这种技术就是端口映射,docker可以指定你想把容器内的某一个端口可以在容器所在主机上的某一个端口它俩之间做一个映射,当你在访问主机上的端口时,其实就是访问容器里面的端口.

    2. 还有一种类型是Host模式,如果在启动容器的时候指定使用Host模式,那么这个容器将不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器将不会虚拟出自己的网卡,配置出自己的ip.而是使用宿主机上的ip和端口.也就是说在docker上使用网络和在主机上使用网络是一样的.

    3. 还有一种网络类型是None.也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯.

    6.2.2 实际访问端口

    刚才我们在运行nginx镜像的时候并没有指定端口映射,所以我们这里停掉nginx容器.

    docker stop containerId

    1. -p(小写)是开放一个容器的端口到主机上

    在后台运行,开放主机8080端口映射到容器的80端口上.

    docker run -d -p 8080:80 hub.c.163.com/library/nginx

    查看主机8080端口是否开启

    netstat -na |grep 8080

     

    是开启的那么访问 主机ip:8080 即可访问到nginx.

     

    2. -P(大写)是开放容器所有的端口到主机上一个随机的端口.

    停掉刚才的docker服务.

    使用大P

    docker run -d -P hub.c.163.com/library/nginx

    可以看到随机给我的端口是32768 

    然后用 ip:32768去访问即可访问到nginx. 


    第七章 docker部署第一个java web应用

    我们还需要学习Dockerfile,它告诉docker我们怎样制作我们的镜像,我们镜像的每一步操作分别是什么,写好Dockerfile后我们使用docker build命令执行Dockerfile里面的每一件事情.最终会把Dockerfile构建出来.

    在这里因为是做一个演示,所以我们使用了一个开源的java web应用Jpress.

    7.1 制作自己的镜像

    1. 从网易的镜像中心找一个tomcat的镜像

    docker pull hub.c.163.com/library/tomcat:latest

    因为tomat镜像肯定有jdk,所以我们就不用单独再装jdk了.

     

    2.编写dockerfile

    我们需要建立一个dockerfile告诉docker需要做什么,这里我建立了Dockerfile,并将我们的web文件放到了和它同一个目录下.

    首先我们的镜像是要运行在tomcat中的,所以填写 from tomcat,以tomcat为基础.maintainer是所有者的意思.因为war包是要放在webapps中的,所以我们使用copy命令复制到tomcat的webapps.

    为什么webapps在local中?我们可以去下载镜像的网站查询,向下拉就好了.具体网址 : https://c.163yun.com/hub#/m/repository/?repoId=2955

    这里说一个个人猜想,每个容器都包含一个自己的系统,所以这里的/usr/local/tomcat/webapps指的是tomcat容器中的位置,那么哪里指定是tomcat容器呢?就是在一开始的from指定的.

    from hub.c.163.com/library/tomcat
    
    maintainer zhangchen 61037@qq.com
    
    COPY jpress.war /usr/local/tomcat/webapps

    3.构建容器

    注意这里是有个点的,点标明是在根据当前目录构建

    docker build .

    可以使用docker images查看镜像是否build成功

    发现一个none,表明构建成功了.

    可以重新构建给它起个名字 -t是给镜像指定一个tag

    docker build -t jpress:latest .
    

    更多的参数查询:

    docker build --help

     

    7.2 运行自己的镜像

    运行我们制作的镜像并指定端口

    docker run -d -p  8080:8080 jpress

    访问我们的网站,发现网站已经可以正常访问了.

    然后发现它要求我们安装自己的数据库,所以我们利用docker安装mysql.

    在镜像中心搜索并拉取mysql

     docker pull hub.c.163.com/library/mysql:latest

    在镜像中心查看配置,并配置root用户密码

    docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 hub.c.163.com/library/mysql

     发现我们没有创建数据库,于是停止这个容器的运行,并在与剧中创建jpress数据库.

    docker stop 4be94fb2df1d3a28c1
    ocker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql

    这样我们的数据库就建立成功了.

    进入网站后要输入网站信息,输入数据库地址时,注意不要输入localhost,因为我们jpress是运行在容器内的,我们会访问tomcat容器内的3306,我们应该用ifconfig查询我们本机的ip地址.我这里的内网ip是172.17.10.68

     

    以上都做完后,我们的网站就可以跑起来了.

    http://59.110.164.62:8080/jpress/

     

     

     

     

     

     

     

     

     

    展开全文
  • Docker入门

    万次阅读 多人点赞 2020-12-14 13:33:28
    文章目录1 Docker简介1.1 什么是虚拟化-VT1.2 什么是DockerDocker的优势1.3 Docker容器与虚拟机比较1.4 Docker 组件1.4.1 Docker服务器与客户端1.4.2 Docker镜像与容器1.4.3 Registry(注册中心)2 Docker安装与启动...

    1 Docker简介

    1.1 什么是虚拟化-VT

      在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

      VT,就是虚拟化技术(VirtualizationTechnology)的缩写。
      Intel VT就是指Intel的虚拟化技术。这种技术简单来说就是让可以让一个CPU工作起来就像多个CPU并行运行,从而使得在一台电脑内可以同时运行多个操作系统
      在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用

      虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。

    虚拟化的意义:最大化的利用物理硬件 对资源充分利用


    1.2 什么是Docker

       Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现的轻量级的操作系统虚拟化解决方案。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议。
    Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。

    项目代码在GitHub地址: https://github.com/docker/docker 上进行维护。
    docker

      Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

      Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术

      在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

    Docker的优势

    (1)上手快

      用户只需要几分钟,就可以把自己的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改”的境界。

       随后,就可以创建容器来运行应用程序了。大多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户尽可能的充分利用系统资源。

    (2)职责的逻辑分类

       使用Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”

    (3)快速高效的开发生命周期

       Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)

    (4)鼓励使用面向服务的架构

       Docker还鼓励面向服务的体系结构和微服务架构。Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程序)


    1.3 Docker容器与虚拟机比较

    在这里插入图片描述
       上图比较了 Docker 和传统虚拟化方式的不同之处,区别在于:
    (1)容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
    (2)与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。


    1.4 Docker 组件

    1.4.1 Docker服务器与客户端

    (1) Docker 是一个客户端-服务器(C/S)架构程序。
      Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具 Docker 以及一整套 RESTful API 。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

    在这里插入图片描述


    1.4.2 Docker镜像与容器

       镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的 “构建” 部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来
    例如:

    • 添加一个文件
    • 执行一个命令
    • 打开一个窗口等

       也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

       Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是 Docker 生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段
       容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务

    所以Docker容器可以说就是:

    • 一个镜像格式;
    • 一些列标准操作;
    • 一个执行环境。

    ​   Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。

       和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。

       Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。

    docker的三个核心:镜像,容器和仓库

    • 镜像可以用来构建容器-- 使用类创建对象
    • 仓库可以存取多个镜像-- 类似代码仓库

    1.4.3 Registry(注册中心)

    ​ Docker用 Registry保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像

    官方地址:https://hub.docker.com/

    (注意:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。



    2 Docker安装与启动

    2.1 安装Docker

      Docker官方建议在 Ubuntu 中安装,因为Docker是基于 Ubuntu 发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的 CentOS 中是不支持更新最新的一些补丁包的。

      这里我使用的环境是CentOS,因此这里将Docker安装到CentOS上使用。
      【注意】使用CentOS的话,建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。

    挂载课程配套的Centos7.x镜像

    (1)yum 包更新到最新命令

    sudo yum update
    

    (2)安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    

    (3)设置yum源为阿里云

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

    (4)安装docker

    sudo yum install docker-ce
    

    (5)安装后查看docker版本

    docker -v
    

    2.2 设置 ustc 的镜像

       ustc 是老牌的linux镜像服务提供者,还在遥远的 ubuntu 5.04 版本的时候就在用。ustc 的 docker 镜像加速器速度很快。 ustc docker mirror 的优势之一就是不需要注册,是真正的公共服务
    帮助文档:https://mirrors.ustc.edu.cn/help/

    https://lug.ustc.edu.cn/wiki/mirrors/help/docker

    编辑该文件:

    vi /etc/docker/daemon.json  
    

    在该文件中输入如下内容:

    {
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    

    2.3 Docker的启动与停止

    systemctl 命令是系统服务管理器指令。

    启动docker:

    systemctl start docker
    

    停止docker:

    systemctl stop docker
    

    重启docker:

    systemctl restart docker
    

    查看docker状态:

    systemctl status docker
    

    开机启动:

    systemctl enable docker
    

    查看docker概要信息

    docker info
    

    查看docker帮助文档

    docker --help
    

    3 常用命令

    3.1 镜像相关命令

    3.1.1 查看镜像

    docker images
    

    后面加以下内容:

    • REPOSITORY:镜像名称
    • TAG:镜像标签
    • IMAGE ID:镜像ID
    • CREATED:镜像的创建日期(不是获取该镜像的日期)
    • SIZE:镜像大小

    这些镜像都是存储在Docker宿主机的 /var/lib/docker 目录下。


    3.1.2 搜索镜像

    如果你需要从网络中查找需要的镜像,可以通过以下命令搜索:

    docker search 镜像名称
    

    后面加以下内容:

    • NAME:仓库名称
    • DESCRIPTION:镜像描述
    • STARS:用户评价,反应一个镜像的受欢迎程度
    • OFFICIAL:是否官方
    • AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

    3.1.3 拉取镜像

    拉取镜像就是从中央仓库中下载镜像到本地

    docker pull 镜像名称
    

    例如:下载centos7镜像

    docker pull centos:7
    

    3.1.4 删除镜像

    按镜像ID删除镜像

    docker rmi 镜像ID
    

    删除所有镜像

    docker rmi `docker images -q`
    

    3.2 容器相关命令

    3.2.1 查看容器

    查看正在运行的容器

    docker ps
    

    查看所有容器

    docker ps –a
    

    查看最后一次运行的容器

    docker ps –l
    

    查看停止的容器

    docker ps -f status=exited
    

    3.2.2 创建与启动容器

    创建容器常用的参数说明

    创建容器命令:

    docker run
    

    后面加以下选择:

    • -i:表示运行容器
    • -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    • --name:为创建的容器命名。
    • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
    • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
    • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

    (1)交互式方式创建容器

    docker run -it --name=容器名称 镜像名称:标签 /bin/bash
    

    创建容器之后,我们可用通过 ps 命令查看,发现可以看到启动的容器,状态为启动状态

    退出当前容器命令

    exit
    

    (2)守护式方式创建容器

    docker run -di --name=容器名称 镜像名称:标签
    

    登录守护式容器方式

    docker exec -it 容器名称 (或者容器ID)  /bin/bash
    

    3.2.3 停止与启动容器

    停止容器

    docker stop 容器名称(或者容器ID)
    

    启动容器

    docker start 容器名称(或者容器ID)
    

    3.2.4 文件拷贝

    将文件拷贝到容器内可以使用cp命令

    docker cp 需要拷贝的文件或目录 容器名称:容器目录
    

    将文件从容器内拷贝出来

    docker cp 容器名称:容器目录 需要拷贝的文件或目录
    

    3.2.5 目录挂载

      我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
    创建容器 添加-v参数 后边为 宿主机目录:容器目录
    例如:

    docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
    

      如果你共享的是多级的目录,可能会出现权限不足的提示。
      这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题


    3.2.6 查看容器IP地址

    可以通过以下命令查看容器运行的各种数据

    docker inspect 容器名称(容器ID) 
    

    也可以直接执行下面的命令直接输出IP地址

    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
    

    3.2.7 删除容器

    删除指定ID的容器:

    docker rm 容器名称(容器ID)
    


    4 应用部署

    4.1 MySQL部署

    (1)拉取mysql镜像

    docker pull centos/mysql-57-centos7
    

    (2)创建容器

    docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
    
    • -p: 代表端口映射,格式为宿主机映射端口:容器运行端口

    • -e :代表添加环境变量 MYSQL_ROOT_PASSWORDroot用户的登录密码

    (3)远程登录mysql

    使用MySql工具,连接宿主机的IP,指定端口为33306。


    4.2 tomcat 部署

    (1)拉取镜像

    docker pull tomcat:7-jre7
    

    (2)创建容器

    docker run -di --name=mytomcat -p 9000:8080 
    -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
    

    -p 表示地址映射

    4.3 Nginx部署

    (1)拉取镜像

    docker pull nginx
    

    (2)创建Nginx容器

    docker run -di --name=mynginx -p 80:80 nginx
    

    4.4 Redis部署

    (1)拉取镜像

    docker pull redis
    

    (2)创建容器

    docker run -di --name=myredis -p 6379:6379 redis
    


    5 迁移与备份

    5.1 容器保存为镜像

    可以通过以下命令将容器保存为镜像

    docker commit mynginx mynginx_i
    

    5.2 镜像备份

    可以通过以下命令将镜像保存为 tar 文件

    docker  save -o mynginx.tar mynginx_i
    

    5.3 镜像恢复与迁移

    首先删除掉 mynginx_img 镜像 然后执行此命令进行恢复

    docker load -i mynginx.tar
    

    -i : 输入的文件

    执行后再次查看镜像,可以看到镜像已经恢复。



    6 Dockerfile

    6.1 什么是Dockerfile

      Dockerfile由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

    • 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
    • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
    • 对于运维人员:在部署时,可以实现应用的无缝移植。

    6.2 常用命令

    命令 作用
    FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
    MAINTAINER user_name 声明镜像的创建者
    ENV key value 设置环境变量 (可以写多条)
    RUN command 是Dockerfile的核心部分(可以写多条)
    ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
    COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
    WORKDIR path_dir 设置工作目录

    6.3 使用脚本创建镜像

    (1)创建目录

    mkdir –p /usr/local/dockerjdk8
    

    (2)下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录

    (3)创建文件Dockerfile vi Dockerfile

    # 依赖镜像名称和ID
    FROM centos:7
    # 指定镜像创建者信息
    MAINTAINER ITCAST
    # 切换工作目录
    WORKDIR /usr
    RUN mkdir  /usr/local/java
    # ADD 是相对路径jar,把java添加到容器中
    ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
    
    # 配置java环境变量
    ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
    ENV JRE_HOME $JAVA_HOME/jre
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
    ENV PATH $JAVA_HOME/bin:$PATH
    

    (4)执行命令构建镜像

    docker build -t='jdk1.8' .
    

    【注意】最后边的空格和点.,不要省略

    (5)查看镜像是否建立完成

    docker images
    


    7 Docker私有仓库

    7.1 私有仓库搭建与配置

    (1)拉取私有仓库镜像

    docker pull registry
    

    (2)启动私有仓库容器

    docker run -di --name=registry -p 5000:5000 registry
    

    (3)打开浏览器,输入地址http://192.168.184.141:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空

    (4)修改daemon.json

    vi /etc/docker/daemon.json
    

    添加以下json数据内容,保存退出。

    {"insecure-registries":["192.168.184.141:5000"]} 
    

    此步用于让 docker信任私有仓库地址

    (5)重启docker 服务

    systemctl restart docker
    

    7.2 镜像上传至私有仓库

    (1)标记此镜像为私有仓库的镜像

    docker tag jdk1.8 192.168.184.141:5000/jdk1.8
    

    (2)再次启动私服容器

    docker start registry
    

    (3)上传标记的镜像

    docker push 192.168.184.141:5000/jdk1.8
    
    展开全文
  • Docker 入门

    2018-12-28 17:15:26
  • docker入门

    2018-12-25 11:45:30

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,345
精华内容 9,338
关键字:

docker入门