精华内容
下载资源
问答
  • Docker集群管理三剑客

    万人学习 2015-09-06 15:21:09
    Docker集群管理视频教程,该课程主要分享Docker集群管理工具,主要包括Docker Machine、Docker Compose、Docker Swarm。Docker Machine为本地,私有数据中心及公有云平台提供Docker引擎,实现从零到Docker的一键部署...
  • 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

    千次下载 热门讨论 2014-12-22 17:11:25
    本期赠送书籍为《第一本Docker书》,本书由Docker公司前服务与支持副总裁James Turnbull编写,是权威的Docker开发指南,被誉为“对开发者影响很大的一本书”,在容器开发、系统管理、运维领域很有说服力。
  • 菜鸟入门Docker

    万次阅读 多人点赞 2020-05-07 12:38:44
    菜鸟入门Docker说明一、什么是Docker(1)虚拟机和Linux容器二、Docker用途三、Docker安装(1)设置仓库(2)安装 Docker Engine-Community(3)验证安装成功四、Docker启动与停止(1)启动docker(2)停止docker(3...


    更新时间:2021/2/13 01:15

    说明

    最近在学习docker时,发现网上很多教程都是很老的教程,导致本人在学习时遇到各种各样的坑,为了方便以后查看,现将学习相关笔记记录在这里。
    本文仅为记录学习轨迹,如有侵权,联系删除

    一、什么是Docker

    在学习docker时,在网上看到一篇博文讲得很好,自己总结一下就是,Docker 将应用程序与该程序的依赖,打包在一个文件里面,改文件包括了所有打包得应用程序的所有依赖,像数据库等;直接运行改文件,就可以让程序跑起来,从而不用再去考虑环境问题。

    (1)虚拟机和Linux容器

    • 说到Docker就必须了解虚拟机和Linux容器,虚拟机可以实现在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统等,而且不会对实际的电脑产生影响,不想用时将虚拟机相关文件删掉即可,用户可以通过虚拟机还原软件的原始环境,实际上就是解决了配置环境的问题。尽管它有资源占用多,启动慢等缺点。

    • Linux容器是为了解决虚拟机的确缺点而生的,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机有很多优势。像启动快、资源占用少等

    • 而Docker 就是属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。就像一开始说的,Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题

    二、Docker用途

    这里引用网上某博主的部分内容,Docker 的主要用途,目前有三大类。

    (1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

    (2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

    (3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

    三、Docker安装

    说明:由于Docker需要Linux内核的支持,所以本人在自己的电脑(window10)安装了VMware虚拟机,在虚拟机里面安装了一个ubuntu系统,在这基础上进行Docker的安装,安装参考了菜鸟教程,链接:https://www.runoob.com/docker/ubuntu-docker-install.html

    (1)设置仓库

    卸载旧版本

    $ sudo apt-get remove docker docker-engine docker.io containerd runc
    

    更新 apt 包索引

    $ sudo apt-get update
    

    安装 apt 依赖包,用于通过HTTPS来获取仓库

    $ sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
    

    添加 Docker 的官方 GPG 密钥

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    

    9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。

    $ sudo apt-key fingerprint 0EBFCD88
    

    使用以下指令设置稳定版仓库

    $ sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) \
      stable"
    

    (2)安装 Docker Engine-Community

    更新 apt 包索引

    $ sudo apt-get update
    

    安装最新版本的 Docker Engine-Community 和 containerd

    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
    

    (3)验证安装成功

    输入命令:docker,出现以下命令即安装成功
    在这里插入图片描述

    四、Docker启动与停止

    (1)启动docker

    sudo service docker start
    

    (2)停止docker

    sudo service docker stop
    

    (3)重启docker

    sudo service docker restart
    

    五、Docker配置

    (1)将用户加入 Docker 用户组

    Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,建议将用户加入Docker用户组

    • 添加docker用户组
      sudo groupadd docker
    • 将当前用户加入到docker用户组
      sudo gpasswd -a ${USER} docker
    • 重启docker服务
      sudo service docker restart
    • 退出当前用户重登一下

    (2)配置daemon.json

    本人一开始安装完Docker后,启动docker服务,直接拉取 image文件(注意:不是图片,后面有讲到image文件)后直接报错,显示超时,因为默认网址是国外的,需要配置国内镜像

    • 进入root权限
      su root
      在这里插入图片描述
    • 进入docker文件
      查看改文件下只有一个key.json,新建一个daemon.json文件
      查看文件夹命令:ls
      新建文件夹命令:vim daemon.json
      在这里插入图片描述
    • 编辑docker.json文件
      输入以下内容:
      { "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"] }
      在这里插入图片描述
      保存退出,重启docker服务

    六、image 文件

    Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
    简单理解就是,将程序打包在image文件(也叫image仓库)里面,运行image文件,生成一个容器生例,容器里面跑程序(已将mysql之类的依赖都打包在里面了,不用去配置数据库等环境)
    也就是说,别人的程序打包在image里面,自己直接拿过来后不用配置环境就可以直接跑(很神奇)

    # 列出本机的所有 image 文件。
    $ docker image ls
    
    # 删除 image 文件
    $ docker image rm [imageName]
    

    在这里插入图片描述
    hello-world是自己手动下载的image仓库

    七、安装Hello-world实例

    命令行直接输入

    命令:docker image pull library/hello-world
    
    命令解析:
    	docker image pull:抓取 image 文件
    	library:image 文件所在的组
    	hello-world:image 文件的名字
    	注意:后期需要的image文件都可以通过这样的方式拉取,像mysql数据库,ubuntu系统等
    

    其中Docker 官方提供的 image 文件,都默认放在library组里面,因此,上面的命令可以写成下面这样。

    docker image pull hello-world
    

    运行该实例

    命令:docker container run hello-world
    
    命令解析:
    	docker container run:自动抓取 image 文件
    	注意:如果发现本地没有指定的 image 文件,就会从仓库自动抓取
    

    运行结果
    在这里插入图片描述
    注意:输出这段提示以后,hello world就会停止运行,容器自动终止。对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。

    $ docker container kill [containID]
    

    八、容器文件

    image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。

    # 列出本机正在运行的容器
    $ docker container ls
    
    # 列出本机所有容器,包括终止运行的容器
    $ docker container ls --all
    

    上面命令的输出结果之中,包括容器的 ID。很多地方都需要提供这个 ID,比如上一节终止容器运行的docker container kill命令。

    终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm命令删除。

    $ docker container rm [containerID]
    

    运行上面的命令之后,再使用docker container ls --all命令,就会发现被删除的容器文件已经消失了。

    九、配置阿里镜像

    这个是额外补充的,当前面配置了各种加速镜像都没有的情况下,用这个方式
    https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

    命令:vi /etc/docker/daemon.json
    注意:daemon.json该文件可能不存在,这个时候正常创建即可

    加入如下内容:

    {
      "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
    }
    

    例如
    在这里插入图片描述
    配置完重启服务即可
    命令1:sudo systemctl daemon-reload
    命令2:sudo systemctl restart docker

    十一、docker的另一种安装方式

    1. 下载docker-ce的repo
    curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
    2. 安装依赖
    yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
    3. 安装docker-ce
    dnf -y  install docker-ce  docker-ce-cli --nobest
    4.启动 docker
    systemctl start docker
    5.查看 docker 版本信息
    docker -v
    6.设置开机自动启动
    systemctl enable --now docker
    
    

    本人用centos 8亲测可以,就是有一个安装102M的过程有点久,只有不到100k/s的速率,不过也是可以安装成功的

    至此,Docker基本入门结束,该博文参考了网上大多Docker教程

    展开全文
  • Docker——入门实战

    万次阅读 多人点赞 2018-07-14 15:35:24
    Docker 简介 Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。不过,Docker 跟传统的虚拟化方式相比具有众多的优势。我也将Docker类比于Python虚拟环境,可以有效的配置各个版本的开发环境,...

    I. Docker

    简介

    Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。不过,Docker 跟传统的虚拟化方式相比具有众多的优势。我也将Docker类比于Python虚拟环境,可以有效的配置各个版本的开发环境,比如深度学习与Java环境。

    其他的Docker简介也不需要过多介绍,可以参考很流行的《Docker — 从入门到实践》。关于博客,文末列出了最近在掘金上看到的一些入门类型文章。

    优势

    本人主要想用来配置开发环境,由于实验室机器系统环境版本等冲突的问题。

    先用一张Docker — 从入门到实践里的图整体感受一下其独特的优势:

    对比传统虚拟机

    由于本人才疏学浅,这里便再节选一些原文中话具体描述Docker强大所在。个人感觉在入门完Docker再回头重新认识一下下面所述的五个优势相关解释,会对Docker的认识有更深的理解。

    • 更高效的利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
    • 更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
    • 一致的运行环境:开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一
      致,导致有些bug 并未在开发过程中被发现。而Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现「这段代码在我机器上没问题啊」这类问题。
    • 持续交付和部署:Docker是build once,run everywhere. 使用Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile 来进行镜像构建,并结合持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
    • 更轻松的迁移:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。使用Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

    II. Docker中基本概念

    镜像(Image)

    镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

    容器(Container)

    容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

    仓库(Repository)

    仓库,从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

    Docker版本

    Docker 划分为CE 和EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。Docker在1.13 版本之后,从2017年的3月1日开始,版本命名规则变为如下:

    项目说明
    版本格式YY.MM
    Stable版本每个季度发行
    Edge版本每个月发型

    Docker CE 每月发布一个Edge 版本(17.03, 17.04, 17.05…),每三个月发布一个Stable 版本(17.03, 17.06, 17.09…),Docker EE 和Stable 版本号保持一致,但每个版本提供一年维护。

    分层存储

    因为镜像包含操作系统完整的root 文件系统,其体积往往是庞大的,因此在Docker设计时,就充分利用Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成

    镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

    分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

    III. 安装Docker

    Win10

    下载:https://docs.docker.com/docker-for-windows/install/

    Docker支持64 位版本的Windows 10 Pro,且必须开启Hyper-V。开启方式为:打开“控制面板”->“程序”-> “启动或关闭Windows功能”,找到Hyper-V并勾选,确定重启电脑。

    开启Hyper-V

    安装下载好的Docker for Windows Installer.exe,如下:

    安装完毕

    鉴于国内网络问题,后续拉取Docker镜像十分缓慢,需要配置国内镜像加速,在系统右下角托盘Docker 图标内右键菜单选择Settings,打开配置窗口后左侧导航菜单选择Daemon,在Registry mirrors 一栏中填写加速器地址
    https://registry.docker-cn.com ,之后点击Apply保存后Docker就会重启并应用配置的镜像地址了。

    配置镜像加速

    Ubuntu16.04+

    在Ubuntu系统中安装较为简单,官方提供了脚本供我们进行安装。

    sudo apt install curl
    curl -fsSL get.docker.com -o get-docker.sh
    sudo sh get-docker.sh --mirror Aliyun

    执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker CE 的Edge版本安装在系统中。

    启动Docker CE

    sudo systemctl enable docker
    sudo systemctl start docker

    建立docker 用户组

    默认情况下,docker 命令会使用Unix socket 与Docker 引擎通讯。而只有root 用户和docker 组的用户才可以访问Docker 引擎的Unix socket。出于安全考虑,一般Ubuntu系统上不会直接使用root 用户。因此,更好地做法是将需要使用docker 的用户加入docker用户组。

    # 建立docker组
    sudo groupadd docker
    # 将当前用户加入docker组
    sudo usermod -aG docker $USER

    注销当前用户,重新登录Ubuntu,输入docker info,此时可以直接出现信息。

    docker info

    配置国内镜像加速

    在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

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

    重新启动服务

    sudo systemctl daemon-reload
    sudo systemctl restart docker

    IV. Docker的C/S模式

    Docker 采用了C/S 架构,包括客户端和服务端。Docker 守护进程(Daemon)作为服务端
    接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。

    Docker基本架构

    Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息;Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker 守护进程交互。我们之前在Win10的命令行中便是最主要的客户端:

    Docker也为我们提供了Remote API来操作Docker的守护进程,也意味着我们可以通过自己的程序来控制Docker的运行。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTful API 来进行通信:

    至于Docker的客户端与守护进程之间的通信,其连接方式为socket连接。主要有三种socket连接方式:

    • unix:///var/run/docker.sock
    • tcp://host:port
    • fd://socketfd

    完整的Docker的C/S连接方式的本质可以一般表示为如下:

    V. 使用Docker

    容器的基操

    • 启动一次操作容器docker run IMAGE_NAME [COMMAND] [ARG…]

      例如,启动一个容器输出hello world。由于刚装上Docker,没有任何镜像,所以会先下载一个最新的ubuntu18.04的docker镜像。一次操作容器在处理完操作后会立即关闭容器。

      docker run ubuntu echo 'hello world'

      启动一次操作容器

    • 启动交互式容器docker run -t -i –name=自定义名称 IMAGE_NAME /bin/bash

      -i –interactive=true | false,默认是false

      -t –tty=true | false,默认是false

      –name 给启动的容器自定义名称,方便后续的容器选择操作

      启动交互式的容器,就是类似虚拟机、云主机的操作方式,操作完一个命令后仍然可以继续

      docker run -i -t ubuntu /bin/bash

      启动交互式容器

    • 查看容器docker ps [-a] [-l]

      省略 列出正在运行的容器

      -a all 列出所有容器

      -l latest 列出最近的容器

      查看所有容器

    • 查看指定容器docker inspect name | id

      name指代具体的容器名称,id则是容器的唯一id标识。inspect命令可以详细的展示出容器的具体信息。

      docker inspect haha

      查看指定容器

    • 重新启动停止的容器docker start [-i] 容器名

      实际使用时,没必要每次都重新启动一个新的容器,我们可以重新启动之前创建的容器,现实情况也需要我们这样使用。

      docker start -i haha

      重启停止的容器

    • 删除停止的容器docker rm name | id

      docker rm thirsty_kepler
      docker rm upbeat_albattani

      删除停止的容器

    守护式容器

    交互式容器在运行完命令退出后即停止,而实际中我们常常需要能够长时间运行,即使退出也能后台运行的容器,而守护式容器具备这一功能。守护式容器具有:

    1. 能够长期运行;
    2. 没有交互式会话;
    3. 适合于运行应用程序和服务。

    以守护形式运行容器

    我们执行完需要的操作退出容器时,不要使用exit退出,可以利用Ctrl+P Ctrl+Q代替,以守护式形式推出容器。

    守护形式运行容器

    附加到运行中的容器

    退出正在运行的容器,想要再次进入,需要使用attach命令:docker attach name | id

    docker attach haha

    启动守护式容器

    启动守护式容器,可以在后台为我们执行操作:docker run -d IMAGE_NAME [COMMAND] [ARG…]

    当命令在后台执行完毕,容器还是会关闭。这里防止容器立刻退出,写一个脚本循环输出“hello world”。

    docker run --name hiahia -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

    启动守护式容器

    查看容器日志

    当守护式容器在后台运行时,我们可以利用docker的日志命令查看其输出:docker logs [-f] [-t] [–tail] IMAGE_NAME

    -f –follows=true | false,默认是false,显示更新

    -t –timestamps=true | false,默认是false,显示时间戳

    –tail=“all” | 行数,显示最新行数的日志

    查看容器日志

    查看容器内进程

    对运行的容器查看其进程:docker top IMAGE_NAME

    查看容器内进程

    运行中容器启动新进程

    Docker的理念是一个容器运行一个服务,但是往往需要对一个服务进行监控,所以也需要在已经运行服务的容器启动新的进程:docker exec [-d] [-i] [-t] IMAGE_NAME [COMMAND] [ARG…]

    docker exec -i -t hiahia /bin/bash

    启动新进程

    停止守护式容器

    发送信号停止容器:docker stop 容器名

    强制停止:docker kill 容器名

    VI. 案例:在容器中部署静态网站

    容器的端口映射

    命令run [-P] [-p]

    -P,–publish-all=true | false,大写的P表示为容器暴露的所有端口进行映射;

    -p,–publish=[],小写的p表示为容器指定的端口进行映射,有四种形式:

    • containerPort:只指定容器的端口,宿主机端口随机映射;
    • hostPort:containerPort:同时指定容器与宿主机端口一一映射;
    • ip::containerPort:指定ip和容器的端口;
    • ip:hostPort:containerPort:指定ip、宿主机端口以及容器端口。

    例如:

    docker run -p 80 -i -t ubuntu /bin/bash
    docker run -p 8080:80 -i -t ubuntu /bin/bash
    docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash
    docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

    容器中部署Nginx服务

    准备环境:

    # 1. 创建映射80端口的交互式容器
    docker run -p 80 --name web -i -t ubuntu /bin/bash
    # 2. 更新源
    apt-get update
    # 3. 安装Nginx
    apt-get install -y nginx
    # 4. 安装Vim
    apt-get install -y vim

    创建静态页面:

    mkdir -p /var/www/html
    cd /var/www/html
    vim index.html

    index.html

    修改Nginx配置文件:

    # 查看Nginx安装位置
    whereis nginx
    # 修改配置文件
    vim /etc/nginx/sites-enabled/default

    修改Nginx配置文件

    运行Nginx:

    # 启动nginx
    nginx
    # 查看进程
    ps -ef

    运行Nginx

    验证网站访问:

    # 退出容器
    Ctrl+P Ctrl+Q
    # 查看容器进程
    docker top web
    # 查看容器端口映射情况
    docker port web

    查看进程和端口

    通过宿主机地址加映射端口访问:

    访问网站

    VII. 镜像基操

    查看删除镜像

    • 列出镜像docker images [OPTIONS] [REPOSITORY]

      -a,–all=false,显示所有镜像

      -f,–filter=[],显示时过滤条件

      –no-trunc=false,指定不使用截断的形式显示数据

      -q,–quiet=false,只显示镜像的唯一id

      查看镜像

    • 查看镜像docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]

      -f,–format=“”

      查看镜像

    • 删除镜像docker rmi [OPTIONS] IMAGE [IMAGE]

      -f,–force=false,强制删除镜像

      –no-prune=false,保留未打标签的父镜像

    • 虚悬镜像:既没有仓库名,也没有标签,均为\

    获取推送镜像

    • 查找镜像docker search [OPTIONS] TEAM

      –automated=false,仅显示自动化构建的镜像

      –no-trunc=false,不以截断的方式输出

      –filter,添加过滤条件

      查找ubuntu镜像

    • 拉取镜像docker pull [OPTIONS] NAME [:TAG]

      -a,–all-tags=false,下载所有的镜像(包含所有TAG)

      拉取镜像

    • 推送镜像:docker push NAME [:TAG]

      Docker允许上传我们自己构建的镜像,需要注册DockerHub的账户。也可以上传到阿里云,地址:https://cr.console.aliyun.com/#/namespace/index

    构建镜像

    构建Docker镜像,可以保存对容器的修改,并且再次使用。构建镜像提供了自定义镜像的能力,以软件的形式打包并分发服务及其运行环境。Docker中提供了两种方式来构建镜像:

    • 通过容器构建:docker commit
    • 通过Dockerfile:docker build

    使用commit命令构建镜像

    命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    参数:-a,–author=“”,指定镜像的作者信息

    ​ -m,–message=“”,提交信息

    ​ -p,–pause=true,commit时是否暂停容器

    commit命令构建镜像

    使用Dockerfile文件构建镜像

    Docker允许我们利用一个类似配置文件的形式来进行构建自定义镜像,在文件中可以指定原始的镜像,自定义镜像的维护人信息,对原始镜像采取的操作以及暴露的端口等信息。比如:

    # Sample Dockerfile
    FROM ubuntu:16.04
    MAINTAINER wgp "Kingdompin@163.com"
    RUN apt-get update
    RUN apt-get install -y nginx
    EXPOSE 80

    命令:docker build [OPTIONS] DockerFile_PATH | URL | -

    参数:–force-rm=false

    ​ –no-cache=false

    ​ –pull=false

    ​ -q,quite=false,构建时不输出信息

    ​ –rm=true

    ​ -t,tag=“”,指定输出的镜像名称信息

    Dockerfile文件构建镜像

    VIII. 镜像迁移

    我们制作好的镜像,一般会迁移或分享给其他需要的人。Docker提供了几种将我们的镜像迁移、分享给其他人的方式。推荐镜像迁移应该直接使用Docker Registry,无论是直接使用Docker Hub还是使用内网私有Registry都可以。使用镜像频率不高,镜像数量不多的情况下,我们可以选择以下两种方式。

    上传Docker Hub

    首先,需要在Docker Hub上申请注册一个帐号(人机验证时需要科学上网)。然后我们需要创建仓库,指定仓库名称。

    新建仓库

    在终端中登录你的Docker Hub账户,输入docker login,输入用户名密码即可登录成功。

    登录docker账户

    查看需要上传的镜像,并将选择的镜像打上标签,标签名需和Docker Hub上新建的仓库名称一致,否则上传失败。给镜像打标签的命令如下。

    docker tag <existing-image> <hub-user>/<repo-name>[:<tag>]

    其中existing-image代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]则是为上传更改的标签名,tag不指定则为latest。

    打上标签

    可以看到,我们重新为ubuntu:16.04的镜像打上标签,观察IMAGE ID可知,同一镜像可以拥有不同的标签名。接下来,我们利用push命令直接上传镜像。

    docker push <hub-user>/<repo-name>:<tag>

    如图,我们已经上传成功。由于之前介绍的分层存储系统,我们这里是直接对已有的ubuntu镜像进行上传,只是重新打了标签,所以真正上传的只是变化的部分。

    上传成功

    Hub查看

    导出文件互传

    Docker 还提供了 docker loaddocker save 命令,用以将镜像保存为一个tar文件。比如这次我们将ubuntu:latest这个镜像保存为tar文件。

    docker save

    查看本地磁盘,即可看见名为ubuntu18.04的tar包。我们可以将其拷贝给其他PC,利用load命令重新导入。

    重新导入镜像

    推荐阅读

    展开全文
  • Docker的那些事

    千人学习 2019-06-06 21:33:34
    Docker的系统架构讲解 Docker的界面管理工具portainer使用 docker底层使用哪些技术 Dockerfile中命令讲解 Docker镜像、容器管理 Docker常用命令讲解 Docker在项目中的运用 Docker-compose文件在项目中运用
  • 本博客主要解决在Windows环境下,快速上手使用Docker的问题,主要会介绍在Windows系统下Docker Desktop的安装,Docker 基础命令,比如说下载镜像、启动镜像、使用镜像、关闭镜像、删除镜像、使用仓库、创建镜像等模块的...

    Docker简介和安装和基础配置

    Docker简介

    • Docker 就像一个盒子,里面可以装很多物件,如果需要某些物件,可以直接将该盒子拿走,而不需要从该盒子中一件一件的取。

    • Docker中文社区Docker中文文档

    Docker 包括三个基本概念:

    • 镜像(Image)

      • Docker的镜像概念类似于虚拟机里的镜像(比如.IOS文件),是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
      • 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了MySQL或用户需要的其它应用程序。
      • 这里的镜像就如下方虚拟机创建时候使用的镜像类似。这个镜像便于移动,并且这个镜像我们可以交给任何人使用,其他人使用的时候也很方便,只需要将其实例化即可。
        在这里插入图片描述
    • 容器(Container)

      • Docker容器是由Docker镜像创建的运行实例,类似VM虚拟机,支持启动,停止,删除等。
      • 每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。
      • 容器就类似与虚拟机中我们创建好的虚拟机系统,之后我们所有的操作都是在容器中进行的,我们的程序也是运行在容器中。
        在这里插入图片描述
    • 仓库(Repository)

      • 镜像便于传播,而仓库就是专门用来传播这些镜像的地方,他有点类似与Github,或者你可以把他看成一个存放各种镜像的镜像商店
      • Docker官方的仓库: 他的服务器处于国外,所以下载速度较慢,不过我们可以通过换源解决。
      • daocloud国内仓库: 国内也有一些优秀的商店,他和Docker官方的仓库的区别类似与Github和Gitee的区别。
      • 网易云镜像中心

    本博客主要解决在Windows环境下,快速上手使用Docker的问题,主要会介绍在Windows系统下Docker Desktop的安装,Docker 基础命令,比如说下载镜像、实例化镜像、使用容器、关闭容器、删除容器\镜像、使用仓库、创建镜像等模块的使用。其他系统应该除了安装外其他操作都可以通用。

    安装Docker Desktop

    1. 我们先去官网下载安装包
      在这里插入图片描述

    2. 打开安装包加载一会后一般会弹出两个选项,在较旧的Windows10或之前的系统会出现如下所示的相关提示。我们把第一个选上,第二个根据需求选择即可。
      在这里插入图片描述
      而较新的Windows则会出现一个使用wsl2的提示(最少是1903以上,推荐为2004或更高版本),如果使用wsl2则docker的性能会发挥更好。如下图,这里推荐使用WSL2,如果之后安装完成后发生报错可能是WSL2版本比较老,需要更新导致的。(可以看我的另一篇博客来尝试解决)
      在这里插入图片描述

    换源

    首先,我们打开Docker的设置
    在这里插入图片描述
    选择Docker Engine,在其中输入(这里使用的是163的源,如果想要使用其他源可以自行设置,github上有个项目:docker_mirror可以自动检测在你的网络环境下那个源是最快的)

    {
      "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
      ],
      "insecure-registries": [],
      "debug": true,
      "experimental": false
    }
    

    在这里插入图片描述

    Docker基础使用

    首先我们输入docker run hello-world是否会出现下图所示的提示,如果出现报错,这环境配置可能出现了问题。
    ps:这行命令会让docker从官方仓库中拉去hello-world的镜像到本地,并且自动将其实例化成容器。
    在这里插入图片描述

    对Docker操作

    安装完成Docker后,默认每次开机的时候都会自动启动,但我们也可以手动启动,关闭或者重启Docker

    # 启动docker
    sudo service docker start
    # 重启docker
    sudo service docker restart
    # 停止docker
    sudo service docker stop
    

    对镜像的基础操作

    获取当时所有镜像(docker images)

    docker image ls
    # 或者
    docker images
    
    标签含义
    REPOSITORY镜像所在的仓库名称
    TAG镜像标签
    IMAGEID镜像ID
    CREATED镜像的创建日期(不是获取该镜像的日期)
    SIZE镜像大小

    拉去镜像(docker pull)

    除了使用官方的镜像外,我们还可以在仓库中申请一个自己的账号,保存自己制作的进行,或者拉去使用他人的镜像。

    # 官方镜像
    docker image pull 镜像名称 
    # 或简写为 
    docker pull 镜像名称
    # 比如
    docker pull ubuntu
    docker pull ubuntu:16.04
    
    # 个人镜像
    docker pull 仓库名称/镜像名称
    docker pull xunmi/django
    
    # 第三方仓库拉去
    docker pull 第三方仓库地址/仓库名称/镜像名称
    docker pull hub.c.163.com/library/mysql:latest
    (默认仓库名为library,所有从官方获取镜像相当于`sudo docker image pull library/镜像名称`)
    

    在这里插入图片描述

    删除镜像(docker rmi)

    docker image rm 镜像名或镜像ID 或 docker rmi 镜像名或镜像ID
    docker image rm hello-world
    docker rmi 9e64176cd8a2
    

    删除镜像的前提是没有使用这个镜像的容器,如果有需要先删除容器(报错:Error response from daemon: conflict: unable to delete 镜像ID (must be forced) - image is being used by stopped container 容器ID则代表有容器使用了此镜像。)可以尝试先执行docker rm 容器ID删除容器,如果还报错,可以看我下方删除容器的具体方法。
    几条删除命令的区别

    • docker rm: 删除一个或多个 容器
    • docker rmi: 删除一个或多个 镜像
    • docker prune: 用来删除不再使用的 docker 对象

    具体区别可以看下此博客

    加载镜像(docker run)

    上面我们说过,镜像只是一个只读类型的文件,而我们的环境不可能只是一个这样的文件,所以我们需要把这个镜像加载成我们的环境,也就是让他变成容器。

    docker run [可选参数] 镜像名 [向启动容器中传入的命令]
    
    常用可选参数作用
    -i表示以《交互模式》运行容器。
    -d会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
    -t表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    –name为创建的容器命名。(默认会随机给名字,不支持中文字符!!!)
    -v表示目录映射关系,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
    -p表示端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80 就是将容器中的80端口,映射到主机中的8080端口
    –network=host表示将主机的网络环境映射到容器中,使容器的网络与主机相同。每个 Docker 容器都有自己的网络连接空间连接到虚拟 LAN。使用此命令则会让容器和主机共享一个网络空间。

    可以启动一个系统docker run -i -d -t --name=kali-test kalilinux/kali-rolling(这里我使用linux的一个发行版kali作为介绍)
    或可以简写为docker run -idt --name=kali-test kalilinux/kali-rolling
    PS: 如果加载一个我们没有的镜像,docker会自动从官方仓库中进行拉去。
    在这里插入图片描述
    或者我们可以启动一个网站docker run -dp 8080:80 --name docker-test docker/getting-started
    在这里插入图片描述
    如果你没有下载docker/getting-started的进行,这里会自动帮你下载
    成功启动后,可以在浏览器中输入http://localhost:8080/即可看到如下页面
    在这里插入图片描述

    使用交互式容器

    上面我们成功将镜像变成了容器,但上述的命令中我们都加入了-d,让容器在后台运行了。下面我们就来讲如何和正在运行的容器进行交互。

    查看容器(docker ps)

    查看容器主要会用到ps命令

    # 查看当前所有正在运行的容器
    docker ps
    # 查看当前所有的容器
    docker ps -a
    # 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等)
    docker ps -f name=指定的名字
    # 显示2个上次创建的容器(2可以改变)
    docker ps -n 2
    # 显示最新创建的容器(包括所有状态)
    docker ps -l
    # 仅显示ip
    docker ps -q
     # 显示容器大小
    docker ps -s
    
    标签含义
    CONTAINER ID镜像ID
    IMAGE创建容器的镜像名称
    COMMAND默认启动命令(启动时会自动执行)
    CREATED创建容器的日期
    STATUS当前的状态(启动了多久,多久之前退出等)
    PORTS映射的端口
    NAMES容器的名称
    SIZE容器大小(使用-s命令参数时才能看到)

    在这里插入图片描述

    启动和关闭容器

    # 停止容器
    docker container stop 容器名或容器id
    # 或可简写为
    docker stop 容器名或容器id
    
    # 强制关闭容器
    docker container kill 容器名或容器id
    # 或可简写为
    docker kill 容器名或容器id
    
    # 启动容器
    docker container start 容器名或容器id
    # 或可简写为
    docker start 容器名或容器id
    
    • 如果我们成功启动或者关闭一个容器的话,会返回容器名或者容器id
    • stop和kill的区别: stop是比较优雅的关掉一个容器,类似我们正常退出一个软件,而kill是当一个进程出现意外无法正常关闭的时候,我们强行进行关闭,有点像我们使用任务管理器进行结束进程操作
      在这里插入图片描述

    操作后台容器

    之前我们下过一个kali并且放在了后台运行,如果没有下载可以执行下列命令(docker run -i -d -t --name=kali-test kalilinux/kali-rolling),下面我们就用下面的命令开启kali(如果你下的是其他系统,比如ubuntu也可以举一反三一下)
    首先我们确保我们要进入的容器是开启状态的,使用docker ps -a查看其中的STATUS属性是否是Up开头,如果不是先照着上面启动容器的方法开启容器
    我们开启容器后,如果需要在容器内执行命令,可以将后台切换到前台,也可能使用docker命令将我们需要执行的命令传入。
    操作方法有很多种,这里我们介绍一些比较常用的方法

    # 如果我只需要执行简单的一两条命令可以使用docker exec
    # 执行单条命令 (-i: 启动并且保留交互式命令行; -t:作用是分配一个虚拟的终端; docker run )
    docker exec -it 容器名或容器id 执行的命令
    # 比如
    docker exec -it kali-test whoami
    # 用这种方法,我们还可以启动命令行,根据Linux的特性,系统程序会在/bin中,linux中常用的Shell有多个,其中大部分用的Linux默认的为bash
    # 所以我们启动命令可以自行如下命令(除了/bin/bash外,linux一般还会带/bin/sh、/bin/rbash、/bin/dash等,具体区别可以自行百度)
    docker exec -it 容器名或容器id /bin/bash
    # 比如
    docker exec -it kali-test /bin/bash
    # 除了exec外还有attach可以使用,但它有个弊端,多终端启动attach后,都会会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
    docker attach 容器名或容器id
    # 比如
    docker attach kali-test
    
    exec可选参数作用
    -d会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
    -e设置环境变量
    -i表示以《交互模式》运行容器。
    -t表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
    -u设置用户名和UID。
    -w设置容器内的工作目录。

    在这里插入图片描述
    除了上述方法外,在进入容器后,我们还可以尝试安装SSH或者nsenter尝试登陆,不过这两种方法都先进入容器安装后才能使用
    但并不建议在 Docker 容器中运行 sshd

    # nsenter安装步骤
    wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz  
    tar -xzvf util-linux-2.24.tar.gz  
    cd util-linux-2.24/  
    ./configure --without-ncurses  
    make nsenter  
    sudo cp nsenter /usr/local/bin  
    

    删除容器(docker rm)

    如我我们需要删除一个容器,首先需要确保这个容器已经停止了,因为正在运行的容器是无法直接删除。
    我们可以运行一下docker ps -a,如果发现没有停止,可以使用docker stop停止(STATUS下已Exited开头则是停止的)
    在这里插入图片描述

    # 使用rm删除容器
    docker rm 容器名或容器id
    # 列如
    docker rm docker-test
    

    如果报错Error response from daemon: You cannot remove a running container 容器ID. Stop the container before attempting removal or force remove则代表这个容器已经启动,需要执行 docker stop 容器id,停止此容器。

    容器制作成镜像

    我们为什么要把容器制作成镜像?

    • 镜像可以看作为是一种备份,如果我们后期环境出现了问题,可以还原到早期镜像。
    • 镜像便于传播,可以让自己的其他设备或他人的重复利用变得更加简单容易。
    # 将容器制作成镜像
    docker commit 容器名 镜像名
    # 镜像打包备份(打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,可以加.tar后缀)
    docker save -o 保存的文件名 镜像名
    # 镜像解压
    docker load -i 文件路径/备份文件
    

    我们将打包备份的镜像可以通过网络发送到其他设备上,使用docker镜像解压即可直接使用你的环境。

    Docker Dashboard(Docker 仪表板)

    Docker 仪表板的主要作用为:快速访问容器日志,启动容器的 shell,并轻松管理容器生命周期(停止、删除等)。
    在这里插入图片描述
    点击小鲸鱼图标后,选择Dashboard
    在这里插入图片描述
    直接点击一个容器,我们可以进入容器的交互界面,其中能看到容器的log,参数,使用状况等
    在这里插入图片描述

    展开全文
  • docker

    万次阅读 2021-08-25 20:17:02
    docker
  • 第一本Docker书 PDF电子书下载 带书签目录 完整版
  • Docker入门与进阶实战(上)

    千人学习 2017-09-28 21:14:50
  • docker的/var/run/docker.sock参数

    万次阅读 多人点赞 2019-06-22 20:24:13
    /var/run/docker.sock是运行docker容器时常用的数据卷参数,本文就来学习这个参数的用处,揭示背后的原理。
  • Docker】在CentOS上安装Docker Engine

    千次阅读 2020-09-22 10:54:36
    前提条件 操作系统要求 要安装Docker Engine,您需要CentOS 7的维护版本。...较旧的Docker版本称为dockerdocker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。 $ sudo yum remove docker \ do.
  • Ubuntu 20.04 安装 docker 详解

    千次阅读 2021-02-25 15:37:35
    首先登录官网观摩观摩:docker 安装 步骤 1. 干净的卸载掉你系统中的 docker,不要问我为什么知道。 1)删除步骤1,官网给出的两条命令,当然为了确保你删的干净点,请看第二条 $ sudo apt-get purge docker-...
  • dind(docker in docker)学习

    千次阅读 2019-08-30 17:19:17
    docker in docker 说白了,就是在docker容器内启动一个docker daemon,对外提供服务。 优点在于: 镜像和容器都在一个隔离的环境,保持操作者的干净环境。 想到了再补充 :) 一:低版本启动及访问 启动1.12.6-...
  • docker save与docker export的区别

    万次阅读 多人点赞 2017-09-25 20:29:36
    缘起 docker save和docker export都能导出镜像包,咋看起来区别似乎不大。本文就针对这个问题,试图搞清楚docker save和docker export的功能是什么?...本文的测试的Docker版本如下,不保证所有版本的docker
  • Docker in docker 实现

    万次阅读 2020-11-06 11:34:44
    Docker in docker 文章目录Docker in docker原理实现(centos7)常见问题参考 在docker容器内运行docker一般是不被倡导的。但有些场景和业务上,需要在容器内使用docker对组件进行编译构建,不同的组件所需的依赖有...
  • Docker官方网址: https://docs.docker.com/ 英文地址 Docker中文网址: http://www.docker.org.cn/ ...Docker 自开源后受到广泛的关注和讨论,目前已有多个相关项目,逐断形成了围Docker的生态体系。...
  • docker命令

    千次阅读 2019-03-24 23:27:48
    1、service docker status 查看docker守护进程运行的状态 2、service docker start 启动docker的守护进程 3、service docker stop 关闭docker的守护进程 4、docker info 返回所有容器和镜像的数量、docker...
  • 阿里云CentOS环境之docker安装,启动,加速器(十四) 阿里云CentOS环境之docker安装,启动,加速器(十四) 介绍 前提条件 安装 1.卸载(可选) 2.安装yum-utils device-mapper-persistent-data lvm2...
  • 这可能是最为详细的Docker入门吐血总结

    万次阅读 多人点赞 2019-01-15 15:21:55
    Docker是什么? 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项,不信的话看看下面这张图。 这是我在某...
  • 终于有人把 Docker 讲清楚了

    万次阅读 多人点赞 2020-05-10 10:08:15
    1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统...
  • 正确卸载和重装docker的方式

    万次阅读 2020-03-09 13:34:53
    文章目录查看已安装的版本卸载查看可安装的版本重装19.03.7查看安装后的版本 ...[root@master custom-wordpress-php-gd-freetype]# yum list installed|grep docker containerd.io.x86_64 1.2.13-3.1.el7 @do...
  • Centos7下安装Docker(详细安装教程)

    万次阅读 多人点赞 2019-09-04 09:42:47
    一,Docker简介 百科说:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间...
  • Docker 零基础从入门到使用

    万次阅读 多人点赞 2019-09-23 20:00:13
    诺!这只可爱的小鲸鱼就是docker了! Docker 是什么? Docker 是一个开源的应用容器引擎,让开发者...在讲 Docker 能干什么之前,我们不妨先看看没有 Docker 和有Docker分别是个什么样子的? 场景一 某公司需要开发...
  • Win10中docker的安装与使用

    万次阅读 多人点赞 2019-06-06 22:28:53
    WIN10中DOCKER的安装与使用 WIN10中DOCKER的安装与使用 1.docker的安装 环境准备 下载安装 2.docker的入门 开始使用 3.docker的常用配置 在PowerShell中设置 tab键自动补全(其实用的都是cmd.exe) Settings ...
  • Docker系列之二:离线安装docker

    千次阅读 2020-12-15 14:41:46
    4 离线安装docker 在Linux系统中安装docker,可通过在线安装(centos的yum,ubuntu的apt-get等)、离线rpm包安装、二进制文件安装等。基于一些环境因素的限制,不能通过在线安装,或者有rpm离线安装包依赖的问题。 ...
  • 在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法。Docker In Docker的用处 dockerIndocker的一个潜在用处是CI管道,在代码成功构建后...
  • Docker的网络配置 6 docker-proxy

    千次阅读 2020-05-04 16:21:28
    文章目录开启docker-proxydocker-proxy与iptables natdocker-proxy如何工作docker-proxy是否有必要存在 我们在上个章节 Docker的网络配置 5 将容器与外部世界连接 首次提到docker-proxy作用是提供端口映射,以便外部...
  • K8S 弃用 Docker 了?Docker 不能用了?别逗了!

    万次阅读 多人点赞 2020-12-08 20:13:21
    Docker 大概没想到,2020 年,它在技术圈内的两次成为(舆论的)焦点,竟然都是因为信息差(说是“标题党”也不为过)。概览2013 年Docker 是在 2013 年的 PyCon...
  • Docker源码分析(一):Docker架构

    万次阅读 多人点赞 2018-11-23 11:35:04
    DockerDocker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。目前,Docker可以在容器内部快速自动化部署应用,并可以通过内核虚拟化技术(namespaces及cgroups...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 885,354
精华内容 354,141
关键字:

doker