浅谈docker

前言

在工作的过程中,慢慢发现自己的不足,借此机会,学习了解一下docker。


一、docker是什么?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

沙盒也叫沙箱(sandbox)。在计算机领域指一种虚拟技术,而且多用于计算机安全技术。安全软件可以让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。

网址:
docker官网:https://www.docker.com
docker中文库:https://www.docker.org.cn/

docker架构图:
在这里插入图片描述
通过架构图我们可以知道:
1.通过dockerfile文件可以创建镜像;
2.镜像通过执行(run)就产生了容器containers;
3.容器可以启动、停止、重启,容器通过提交得到新的镜像;
4.我们可以从仓库registry里面拉取pull镜像,同时可以把镜像推送push到仓库。

Docker核心技术:
1、Namespace : 实现Container的进程、网络、消息、文件系统和主机名的隔离。
2、Cgroup :实现对资源的配额和调度。
注意:Cgroup的配额,可以指定实例使用的CPU个数,内存大小等。

二、docker安装?

1.安装docker依赖环境:

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

2.配置国内docker-ce的yum源(这里采用的是阿里云):

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

yum-config-manager命令作用是添加yum源。
敲完命令之后大家执行一下命令去看一下有没有配置成功。

cd /etc/yum.repos.d
ls

3.安装docker:

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

4.启动docker:

systemctl start docker && systemctl enable docker

5.自己独立的阿里云镜像加速地址:
地址:https://cr.console.aliyun.com的控制台,使用支付宝账号登录。
可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。

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

systemctl daemon-reload  #启动配置
systemctl restart docker  #重启docker服务

三、docker命令?

1.基础命令:

docker version #查看docker版本
docker info  #查看docker基本信息
docker search centos #从docker hub中搜索docker名为centos的镜像
docker pull centos   #拉去镜像
docker images  #查看已下载镜像。
docker --help     #docker帮助命令手册

2.镜像命令:

docker images  #查看所有本地主机的镜像
docker search 镜像名           #搜索镜像
docker pull 镜像名 [标签]      #下载镜像(如果不写tag,默认是latest)
docker rmi 镜像名 [标签]       #删除镜像    docker rmi -f $(docker images -aq)  删除全部镜像
docker tag  镜像名:版本   新镜像名:版本    #复制镜像并且修改名称
docker commit  -a "xxx"  -c "xxx" 镜像ID 名字:版本   #提交镜像 
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;

docker load -i    /xxx/xxx.tar         #导入镜像
docker save -o   /xxx/xxx.tar          #保存一个镜像为一个tar包

3.容器命令:

docker run [可选参数] image 命令 #启动容器(无镜像会先下载镜像)
#参数说明
	--name = "Name"   容器名字
	-c   后面跟待完成的命令
	-d   以后台方式运行并且返回ID,启动守护进程式容器
	-i   使用交互方式运行容器,通常与t同时使用
	-t   为容器重新分配一个伪输入终端。也即启动交互式容器
	-p   指定容器端口    -p 容器端口:物理机端口  映射端口
	-P   随机指定端口
	-v   给容器挂载存储卷

docker build  #创建镜像        -f:指定dockerfile文件路径   -t:镜像名字以及标签
docker logs 容器实例的ID          #查看容器日志
docker rename 旧名字  新名字      # 给容器重新命名
docker top    容器实例的ID                  #查看容器内进程
docker ps -a                    #列出所有容器(不加-a就是在运行的)
docker rm      容器实例的ID                 #删除容器(正在运行容器不能删除,除非加-f选项)
docker kill  容器实例的ID        #杀掉容器
docker history   容器实例的ID    #查看docker镜像的变更历史
docker start 容器实例的ID        #启动容器
docker restart 容器实例的ID       #重启容器
docker stop 容器实例的ID         #停止正在运行的容器
docker attach /docker exec  容器实例的ID   #同为进入容器命令,不同的是attach连接终止会让容器退出后台运行,而exec不会。并且,docker attach是进入正在执行的终端,不会情动新的进程,而docker exec则会开启一个新的终端,可以在里面操作。
docker image inspect  容器名称:容器标签       #查看容器内源数据
docker cp  容器id:容器内路径   目的主机路径           #从容器内拷贝文件到主机(常用)或者从主机拷贝到容器(一般用挂载)
exit                           #直接退出容器 
crlt + P + Q                   #退出容器但是不终止运行

3.关于/bin/bash:

docker run [可选参数] image 命令 #启动容器(无镜像会先下载镜像)
	#参数说明
	--name = "Name"   容器名字
	-c   后面跟待完成的命令
	-d   以后台方式运行并且返回ID,启动守护进程式容器
	-i   使用交互方式运行容器,通常与t同时使用
	-t   为容器重新分配一个伪输入终端。也即启动交互式容器
	-p   指定容器端口    -p 容器端口:物理机端口  映射端口
	-P   随机指定端口
	-v   给容器挂载存储卷
	
#两种运行容器的命令模式:	
#第一种:交互方式创建容器,退出后容器关闭。
docker run -it 镜像名称:标签 /bin/bash

#第二种:守护进程方式创建容器。
docker run -id 镜像名称:标签
#通过这种方式创建的容器,我们不会直接进入到容器界面,而是在后台运行了容器,
#如果我们需要进去,则还需要一个命令。
docker exec -it  镜像名称:标签  /bin/bash
#通过这种方式运行的容器,就不会自动退出了。

四、镜像理解?

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

2.镜像分层理解:
docker为什么会使用这种方法呢?最大的好处,就是资源共享。比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有容器提供服务了,而且镜像的每一层都可以被共享。

举例:
所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像之上创建第二个镜像层;如果继续添加安全补丁,就会创建第三个镜像层。
在这里插入图片描述
在添加额外的镜像的同时,镜像始终是当前所有镜像的组合。比如我们在添加第三层安全补丁的时候,Ubuntu和Python视为一个镜像层,在此基础上再添加安全补丁镜像层。
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是我们所说的容器层,容器之下都叫镜像层。

3.镜像的提交:

docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息"  -a="作者"  容器id  目标镜像名:[TAG]
docker commit -a=“my create tomcat” -m=“add webapps app” 81 tomcat03:1.0

五、Dockerfile?

1.什么是dockerfile:
Dockerfile是一个创建镜像所有命令的文本文件,包含了一条条指令和说明, 每条指令构建一层,,通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建。有了Dockefile,,就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令,,就可生成docker 镜像。

2.dockerfile构建过程:
dockerfile的关键字建议使用大写,它是从上往下按照循序执行的,在dockerfile中,#代表注释。我们可以通过这个脚本来生成镜像,脚本中的每一个命令,都是一层镜像。

3.容器、镜像、容器的关系:
dockerfile是面向开发的,发布项目做镜像的时候就要编写dockerfile文件。
dockerfile:构建文件,定义了一切的步骤,源代码。
dockerImanges:通过dockerfile构建生成的镜像,最终发布和运行的产品。
docker容器:容器就是镜像运行起来提供服务的。

4.dockerfile指令选项:

Dockerfile 指令选项:

FROM                  #基础镜像 。 (centos)
MAINTAINER            #镜像的作者和邮箱。(已被弃用,结尾介绍代替词)
RUN                   #镜像构建的时候需要执行的命令。
CMD                   #类似于 RUN 指令,用于运行程序(只有最后一个会生效,可被替代)
EXPOSE                #对外开放的端口。
ENV                   #设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ADD                   # 步骤:tomcat镜像,这个tomcat压缩包。添加内容。
COPY                  #复制指令,将文件拷贝到镜像中。
VOLUME                #设置卷,挂载的主机目录。
USER                  #用于指定执行后续命令的用户和用户组,
                       这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
WORKDIR               #工作目录(类似CD命令)。
ENTRYPOINT            #类似于 CMD 指令,但其不会被 docker run 
                       的命令行参数指定的指令所覆盖,会追加命令。
ONBUILD               #当构建一个被继承Dokcerfile,就会运行ONBUILD的指令。出发执行。


注意:CMD类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

LABEL(MAINTALNER已经被弃用了,目前是使用LABEL代替)
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我们可以添加镜像的作者:
LABEL org.opencontainers.image.authors="runoob"

dockerfile文件模板例子:

FORM centos
MAINTAINER ydk<123@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim-enhanced
RUN yum -y install net-tools
EXPOSE 80
CMD echo #MYPATH
CMD echo "------------END-------------"
CMD /bin/bash

构建dockerfile:

docker build -f mydockerfile-t mycentos:1.0 .

六、Docker容器数据卷?

1.数据卷:
docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。为了能保存数据,容器中引用了数据卷的概念。

2.数据卷作用以及特点:
卷就是目录或者文件,存在一个或者多个容器之中,由docker挂载到容器,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或者共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会再容器删除时删除其挂载的数据卷。

它还存在以下几种特点:
1、数据卷可在容器之间共享或者重用数据。
2、卷中的更改可以直接生效。
3、数据卷中的更改不会包含在镜像的更新中。
4、数据卷的生命周期一直持续到没有容器使用它为止。

3.如何使用:
直接使用-v进行挂载:

docker run -it -v 主机目录:容器目录 /bin/bash
docker run -it -v /home/test01:/home centos /bin/bash

打开一个终端,cd /home目录,这下我们发现多出来了一个test01目录,这个test01目录,就是我们刚刚启动的容器内部的home目录,并且,此时这两个目录是同步的状态,我们在home目录中写入任何新的文件,都会同步到主机home目录下的test01目录。

docker inspect 容器ID

我们找到这个Mounts,它代表着挂载,type是类型(绑定),source是源(/home/test01),也就是把什么挂载到哪里。destination(home)就是挂载的目标路径了。

4.具名挂载与匿名挂载:

docker volum ls #查看所有卷的情况。

匿名挂载:使用匿名挂载的命令启动一个容器。

docker run -d -P --name=nginxt01 -v /etc/nginx nginx

在这里插入图片描述
这里84开头的那一长串就是挂载到宿主机的名字。
继续追查下去。可以使用less。
docker inspect 84(容器ID) | less
然后输入/name, name是你想查到的内容,就可以很轻松的找到啦。
大家仔细看一下,是不是/etc/nginx就是叫84开头的那一长串,挂载到了我/var/lib…路径下,我们复制这个路径继续去查看。

具名挂载:具名挂载的方式启动一个容器。

docker run -d -P --name=nginxt02 -v jumingguazai:/etc/nginx nginx

docker volume ls 查看卷:
在这里插入图片描述
docker inspect ID | less 找到挂载点。
在这里插入图片描述
我们再复制一下路径,找到nginx的配置文件。
在这里插入图片描述

如何确定是具名挂载还是匿名挂载:

-v  容器内路径               #匿名挂载
-v  卷名:容器内路径          #具名挂载
-v  /宿主机路径:容器内路径    # 指定路径挂载

注意:

通过 -v 容器内路径  :ro   rw   可以改变读写权限
ro  readonly   #只读
rw  readwrite  #可写可读
例: docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx
    docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值