docker

docker与虚拟机:

  1. 虚拟机是下是一个完整的操作系统,进程在系统上再运行进程,而docker则直接运行于宿主内核,相应的软件大小非常小
  2. docker容器之间有自己独有的文件系统,进程之间不会相互影响

 

docker构成:

镜像:docker镜像(image)就是一个 只读 的模板。 镜像可以用来创建docker容器,一个镜像可以创建很多容器 。

容器:docker利用容器(container)独立运行的一个或者一组应用。容器是利用镜像创建的运行实例(相对于Python中的类和对象的概念)。它可以被启动、开始、停止、删除。每个容器都是互相隔离的,保证安全的平台。

仓库:仓库(repository)是集中存放镜像文件的场所 。

 

centos7安装docker:https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-repository

速度太慢,配置阿里云加速:https://cr.console.aliyun.com/undefined/instances/mirrors

多个加速:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

 

使用docker run hello-world的步骤拆分(Docker Hub以换成阿里云)

 

docker帮助命令:docker --help

列出本地docker镜像:docker images

在Docker Hub上查找镜像:docker search tomcat

从阿里云上下载镜像:docker pull tomcat==docker pull tomcat:lastest

删除镜像文件:docker rmi hello-world(其中还有容器正在使用这个镜像,需要强制删除)

强制删除镜像:docker rmi -f hello-world

删除所有本地镜像:docker rmi -f $(docker images -qa)              //不演示了。。。。

 

生成以镜像为模板的容器并运行:docker run -it --name mycentos01 (镜像id)

后台运行容器即守护式容器:docker run -d (镜像id)    //docker ps没有,因为已经kill了

docker run -d centos /bin/sh -c "while true;do echo hello myLog;sleep 2;done"    //不断打印日志,使得后台守护容器能不被kill

 

列出所有正在运行的容器:docker ps 【options】

退出容器:1、容器停止退出:exit 2、容器不停退出:ctrl+p+q

启动容器:docker start (容器id)

重启容器:docker restart (容器id)

停止容器:docker stop (容器id)

强制停止容器:docker kill (容器id)

删除已停止的容器:docker rm (容器id)

查看容器内的进程:docker top (容器id)

查看容器内部的细节:docker inspect (容器id)

重新进入容器:docker attatch (容器id)

在宿主机执行容器里命令:docker exec -t (容器id) (命令)

把容器中数据拷贝到宿主机中:docker cp (容器id):(容器中文件)(宿主机的路径)

 

docker镜像底层原理:

底层采用UnionFS(联合文件系统)的形式,支持对文件的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件下。

docker镜像最底层是bootfs,其中包含bootloader和kernel,bootloader主要引导加载kernel,加载完毕后内存使用权就交给内核,系统会卸载bootfs

rootfs在bootfs之上,包含的就是典型linux中的/dev,/bin等标准目录和文件,也就是不同操作系统的发行版,例如Ubuntu或Centos等。

对于一个精简的os,rootfs可以很小,包含最基本的命令,因为底层使用Host的kernel,只需要提供rootfs就行

 

资源共享:宿主机只要在磁盘上保存一份base镜像,就可以为所有的容器服务。

 

docker commit:提交我们自己的容器的副本成为一个新的镜像

例Tomcat:

docker run -it -p 8888:8080 tomcat

8888为docker对外暴露的端口,实际进来后使用8080访问docker中的tomcat

生成了实例,故意删除上一步容器生成的doc(容器在运行中)

提交一个没有doc的容器作为镜像:-a是作者,-m是描述

实例化我们提交的容器

成功消失~~~

 

docker容器数据卷:(持久化和共享数据)(宿主机到容器,容器到宿主机都行)(类似于vm中的和主机共享数据的文件夹)

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

直接命令添加:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

宿主机和容器的文件中都没有数据卷文件,退出并重新创建带有数据卷的容器

进入容器中,可以看到出现了

在宿主机中,也出现了

测试数据共享

在宿主机上创建一个测试文件testVolume.txt

进入容器中查看

 

反向操作,在容器中更改数据,看宿主机中是不是能同步更改

success!!!!

 

当我们退出容器时候,使用exit

在宿主机中的更新文件,会不会同步到容器中呢

发现当容器关闭时候,宿主机中的更改仍然能同步到容器中

 

带权限的使用数据卷:docker run -it -v /宿主机绝对路径:/容器中的绝对路径:ro 镜像名

(容器中bind的文件夹里内容只能读不能写)

在宿主机中创建文件

容器中仍然可以同步

但是!!!!!!!!!!!

在容器中创建文件

不能创建!同理也不能更改!

 

dockerfile相当于是镜像的源码级描述

使用dockerfile添加数据卷:

新建文件夹

编写Dockerfile

使用bulid命令,变成一个新的镜像

进入容器中查看,发现容器中有我们创建的文件夹

创建一个文件,但是没有指定宿主机的目录

从宿主机中查看docker inspect (容器id)

进入相应路径可查看到之前在容器中新建的文件

在宿主机中创建新文件

容器中对应的数据卷文件也会新增

 

 

 

数据卷共享volume-from

以smxy_centos镜像为模板,创建dc1,创建一个dc01_add.txt文件

容器dc2和dc3继承自dc1

进入dataVolumeContainer2,查看共享了dc1中的文件

在dc2中的dataVolumeContainer2创建文件dc02.txt

创建dc3

在dc3的文件夹中可以看到之前创建的文件

在dc3中创建文件dc03_add.txt

子类和父类都可以共享文件

如果此时删除父类dc1

在dc2中创建文件dc02_update.txt

在dc3中仍然可以同步

新建dc4,继承dc3

删除dc3

发现dc4数据仍然存在

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

 

 

Dockerfile:是用来构建docker镜像的文件

步骤:1、编写Dockerfile文件2、Docker build.... 3、Docker run....

docker保留字指令:

FROM:基础镜像,当前镜像是基于哪个镜像

MAINTAINER:镜像维护者的姓名和邮箱(LABELL替代,使用键值对表示)

RUN:容器运行时所需要的命令(容器中运行的命令,查看下面的案例解释)

EXPOSE:容器对外暴露的端口号

WORKDIR:指定创建容器后,终端默认登录的工作目录

ENV:定义环境变量,例ENV MY_PATH /usr/m,ytest    WORKDIR $MY_PATH

ADD:将宿主机的文件拷贝进镜像并解压tar压缩包,会自动处理URL

COPY:只拷贝

VOLUME:容器数据卷,负责数据持久化

CMD:指定一个容器启动时要运行的命令(可以有多个CMD命令,但只有最后一个生效)(会被docker run之后的参数替换)

ENTRYPOINT:指定一个容器启动时要运行的命令(会追加),和目的CMD一样

ONBUILD:构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的ONBUILD被触发

 

默认实例化的centos,默认路径时/,不能使用vim,ifconfig等,自定义mycentos镜像要求实现修改默认路径,能使用vim,ifconfig

一层包着一层,unionFS

 

 

 

自制tomcat9

搞了半天的东西,学艺不精。。。

编写Dockerfile

生成容器

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值