docker与虚拟机:
- 虚拟机是下是一个完整的操作系统,进程在系统上再运行进程,而docker则直接运行于宿主内核,相应的软件大小非常小
- 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中的和主机共享数据的文件夹)
- 数据卷可在容器之间共享或重用数据。
- 卷中的更改可以直接生效。
- 数据卷中国的更改不会包含在镜像的更新中。
- 数据卷的生命周期一直持续到没有容器使用它为止。
直接命令添加: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
生成容器