docker学习记录

一、概念

1.什么是容器?

答:容器是一种虚拟化的方案.

2.docker中文网站:www.docker-cn.com.

3.docker的架构图(三要素):

a.镜像(image):就是一个只读的模板,镜像可以创建docker实例,一个镜像可以创建很多容器,镜像就是类,容器就是镜像类的实例。

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

b.容器(container):利用容器独立运行的一个或一组应用,容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。可以把容器看作是一个建议版的linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一对层的统一视角,唯一区别在于容器的嘴上一层是可读可写的。

c.仓库(Repository)是集中存放镜像文件的场所。仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像共用户下载。国内的公开仓库包括阿里云、网易云等。

4.需要正确理解仓库/镜像/容器的概念。

docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎image镜像文件。只有用过个镜像文件才能生成docker容器。imag文件可以看作容器的模板。docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。

*image文件生成的容器实例,本身也是一个文件,成为镜像文件。

*一个容器运行一种福气,当我们需要的时候,就可以通过docker’客户端创建一个对应的运行实例,也就是我们的容器

*至于仓库,就是放了一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候从仓储中拉下来就可以了。

二、docker安装

1.linux系统(ubuntu0、):

a、安装前检查:内核版本:uname -a;检查Device Mapper:ls -l /sys/class/misc/device-mapper;必须满足以上两个条件。

b、安装ubuntu维护的版本:

命令如下:apt-get install docker.io,source /etc/bash_completion.d/docker.io

c、安装docker维护的版本(推荐):

命令如下:第一步检查APT的HTTPS支持 查看/usr/lib/apt/methods/https文件是否存在,如果不U你在使用apt-get update和apt-get install -y apt-transprot-https命令来安装;第二步添加docker的APT仓库,echo deb https://get.docker.com/ubuntu docker main > /etc/apt/source.list.d/docker.list;第三步是添加仓库的key,apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 — recv-keys36A1D7869245C8950F966E92D8576A8BA88D21E9;第四步安装 apt-get update和apt-get install -y lxc-docker;以上四部比较复杂。

简单安装在博客收藏中

d.添加为root用户使用docker方法:

sudo groupadd docker

gpasswd -a 需要添加的用户名 docker

sudo service docker restart

然后再注销再登陆即可。

 f.删除docker

apt-get remove docker-ce

apt autoremove docker-ce

重启docker服务的命令:systemctl restart docker

三、docker命令

1.帮助命令:docker version–查看docker的版本信息    docker info–查看docker的信息    dekcer –help — docker命令帮助(linux是man +指令)

2.docker镜像命令:

docker images–列出本地主机上的镜像,Repository–表示镜像的仓库源,TAG:镜像标签,Image ID–镜像ID,Created:镜像创建时间,SIze:镜像的大小。

注意:同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,使用repository:TAG定义不同的镜像。

参数选项-a:代表all,列出本地所有的镜像层,包括中间镜像层

-q:只显示当前镜像的ID

–digests:显示镜像的摘要信息

–no-trunc:显示完整的镜像信息

 docker search [OPTIONS] 镜像名字:搜索镜像的名字

OPTIONS说明:–no-trunc显示完整的镜像描述     -s 数字 列出收藏数(STARS)不小于指定值的镜像    –automated只列出automated build类型的镜像。

docker pull 某个镜像名字:下载镜像/docker pull 镜像名字[:TAG]例如:docker pull 镜像名:3.2为拉取镜像名的版本号,默认为lastest最新版本

docker rmi某个镜像名字ID:删除镜像 例如docker rmi -f 镜像名

一次删除多个镜像:docker rmi -f 镜像名1:TAG 镜像名2:TAG

删除全部镜像名:docker rmi -f $(dokcer images -qa) 

3.容器命令:

a.有镜像才能创建容器,需要先下载一个镜像

b.新建并启动容器

docker run [options]  image  [command]  [ARG….]

options(常用)说明:有些是一个减号,有些是两个减号

–name=”容器新名字”:为容器指定一个名称

-d:后台运行容器,并返回群容器ID,就是启动守护式容器

-i:以交互模式运行容器。通常与-t同时使用

-t:为容器重新分配一个伪输入终端,通常与-i同时使用

-P:随机端口映射

-p:指定端口映射,有以下四种格式

ip:hostPort:containerPort

ip::containerPort

hostPort:containerPort

containerPort

列出当前所有运行的docker:

命令:docker ps [options]

options:

-a:列出当前所有正在运行的容器+历史上运行过的

-l:显示最近创建的容器。

-n:显示最近n个创建的容器。

-q:静默模式,是显示容器编号。

–no-trunc:不截断输出

退出容器:1.exit–容器停止退出;2.ctr+P+Q–容器不停止退出

启动容器:docker start 容器id或者容器名

重启容器:docker restart 容器id或者容器名

停止容器:docker stop容器id或者容器名

强制停止容器:docker kill容器id或者容器名

删除已经停止的容器:docker rm 容器id或者容器名,一次性删除多个容器:docker rm -f$(docker ps -a -q);docker ps -a -q | xargs docker rm

重要:

1.启动守护式容器———-docker run -d 容器名,如果容器没有任何被执行,则一启动就会自杀

查看容器日志:docker logs -f -t –tail 容器ID,-t:是加入时间戳,-f:跟随最近的日志打印,–tail数字显示最后多少条

查看容器内运行的进程:docker top 容器ID

查看容器内部细节:docker inspect 容器ID(以josn字符串的形式查看容器的信息)

进入正在运行的容器并以命令行交互:a.docker exec -it 容器ID /bash/shell;b.重新进入docker attach 容器ID;以上两个区别attach直接进入容器启动命令的终端,不会启动新的进程;exec是在容器中打开新的终端,并且可以启动新的进程。

从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径

四、Docker镜像

 1、镜像是什么?

Unions(联合文件系统)、Docker镜像加载原理、分层的镜像

联合文件系统:是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个年系统,但从外面看起来,只能看到一个文件系统,连个加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫做“镜像层”。

Docker镜像commit操作补充:

docker commit提交容器副本使之成为一个新的镜像;docker commit -m=“提交的描述信息”-a=“作者”容器ID要创建的目标镜像名:[标签名]

五、容器数据卷

是什么:主要干数据共享和数据持久化的工作

能干什么:容器持久化+容器间继承+数据共享

 特点:

1、数据卷可在容器之间共享或重用数据

2、卷中的更改可以直接生效

3、数据卷中的更改不会包含在镜像的更新中

4、数据卷的生命周期一直持续到没有容器使用它为止

数据卷:

1、容器内添加:

直接命令添加:

a.命令:docker run -it -v /宿主机绝对路径目录:/容器内目录: 镜像名。

b.查看数据挂载是否成功:docker inspect 容器ID

c.容器和宿主机之间数据共享

d.容器停止退出后,主机修改后数据完全同步,需要启动之前启动的container

f.命令(带权限):docker run -it -v /宿主机绝对路径目录:/容器内目录 : ro 镜像名,ro为readonly的意思,只读

2、dockerfile添加

a.根目录下新建mydocker文件夹并进入,并建立Dockerfile脚本

例如:

# volume test
FROM centos
VOLUME [“/dataVolumeCOntainer1″,”/dataVolumeContainer2”]    #此行命令就是构建共享文件夹绝对路径
CMD echo “finished,———-success1”
CMD /bin/bash

b.可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

c.Dokcerfile的构建(在mydocker文件夹里面构建Dockerfile文件,编写一个可执行的shell脚本)

d.build后生成镜像(可执行的镜像)—–获得一个新镜像zzyy/centos

命令:docker build -f(f是file的意思)/mydocker/dockerfile2(DOckerfile在哪) -t zzyy(命名空间)/cnetos(镜像名字) . 

e.run容器

f.通过上述步骤,容器内的卷目录地址已经知道

g.主机对应默认地址

数数据卷容器:

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

总体介绍:

容器间传递共享(–volumes-from)步骤:

a.先启动一个父容器dc01——-在dataVolumeContainer2新增内容

dc02/dc03继承自dc01:–volumes-from    命令:docker run -it –name dc02 –volumes-from dc01 容器名字

dc02/dc03分别在dataVolumeContainer2各自新增内容

回到dc01可以看到02/03各自添加的都能共享了

删除dc01后2和3的数据仍然存在

删除dc01,dc02修改后dc03可否访问,可以访问

删除dc02后dc03可否访问

新建dc04继承dc03可否访问

新建dc04继承dc03后在删除dc03

结论:容器之间配置信息的传递,数据卷的生命周期一致持续到没有容器使用它为止

b.dc02/dc03可以看到02/03各自添加的都能共享

 六.Dockerfile解析

1.手动编写一个dockerfile文件,必须要符合file的规范

2.有这个文件后,直接dockee build 命令执行,获得一个自定义的镜像

3.run

以上三部是构建三步骤

4.是什么:Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构建的脚本

5.dockerfile的解析过程:

a.每条保留字指令都必须为大写字母且后面要跟随至少一个参数

b.指令按照从上到下,顺序执行

c.#表示注释

d.每条指令都会创建一个新的镜像层,并对镜像进行提交

6.docker执行的Dockerfile的大致流程:

a.docker从基础镜像运行一个容器

b.执行一条指令并对容器做出修改

c.执行类似docker commit的操作提交一个新的镜像层

d.docker再基于刚提交的镜像运行一个新的容器

f.执行dockerfile中的下一条指令直到所有指令都执行完成

总结:Dokcerfile是软件的原材料

Docker镜像是软件的交付品

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合理充当Dokcer体系的基石。

a.Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及内容包括执行代码或者是文件、环境、变量、依赖包、运行时环境、动态链接库、操作系统的发展、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道。这时需要考虑如何设计namespace的权限控制)等等

b.Docker镜像,在用Dockerfile定义一个文件后,docker build时会产生一个Docker镜像,当运行Docker镜像时,回真正开始提供服务

c.Docker容器,容器是直接提供服务的。

Dockerfile保留字指令:

 FROM——基础镜像,当前新镜像是基于哪个镜像的(继承于哪个镜像)

 MAINTAINER——镜像维护者的名字和邮箱,就是作者信息

RUN——容器构建时需要运行的命令(程序运行到这一行需要执行的额外命令)

EXPOSE—–当前容器对外暴露出的端口号

WORKDIR—-指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

ENV—-用来在构建镜像过程中设置环境变量

ADD—-将宿主机目录下的文件拷贝进镜像且ADD命令回自动处理URL和解压tar压缩包

COPY—-类似ADD,拷贝文件和目录到镜像中。将从构建上下目录中<源路径>的文件/目录赋值到新的一层的镜像内的<目标路径>位置

VOLUME—-容器数据全,用一数据保存和持久化工作

CMD—-指定(1)容器启动时要运行的命令;(2)Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换;(3)CMD指令的格式和RUN相似,也是两种格式:a.shell格式,CMD<命令>;b.exec格式:CMD[“可执行文件”,“参数1”,“参数2”….];c.参数列表格式:CMD[“参数1″,“参数2”…],在指定了ENTRYPIONT指令后,用CMD指定具体的参数。

ENTRYPOINT—- (1).指定一个容器时要运行的命令;(2)ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数;(3)docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合

ONBUILD—–当否见一个被继续的Dockerfile时运行命令,父镜像在被子继承后父镜像的nobuild被触发

案例:

a.Base镜像(scratch)—-Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

b自定义镜像mycentos:

  1.编写:

    (1).编写:Hub默认Centos镜像什么情况

    (2).编写Dockerfile文件

    (3).myCentos内容Dockerfile

        FROM Centos

        MAINTAINER xqj

        ENV MYPATH /usr/local

        WORKDIR $MYPATH

        RUN yum -y vim

        RUN yum -y net-tools

        EXPOSE 80

        CMD /bin/bash

  2.构建:docker build -t 新镜像名字:TAG     例如:docker build -f /mydocker/Dockerfiles2 -t mycentos:1.3 .

  3.运行:docker run -it 新镜像名字:TAG

  4.列出镜像的变更历史:docker history 新镜ID

 

    原文作者:yoshar511462
    原文地址: https://www.cnblogs.com/yoshar511462/p/11169504.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞