docker初学
1.docker:系统平滑移植,容器虚拟化技术,基于go语言实现的云开源项目。一次镜像,处处运行。将应用打包成镜像。解决运行环境和配置问题。
2.docker基本组成
1.镜像image:类似一个集装箱,一个只读的模板,一个镜像可以创建多个容器,一个最小系统的root文件系统 2.docker容器container:使用镜像创建的运行实例,可以把容器看成一个简易版的Linux环境和运行其中应用程序,每个容器都是相互隔离的,保证安全的平台 3.仓库respository:存放镜像的地方 |
3.整体架构及通讯原理简述
1.用户使用docker client 与docker daemon建立通信,并发送请求个后者 2.docker daemon作为docker架构中的主体部分,首先提供docker server的功能使其可以接受docker client的请求 3.docker engine执行docker内部的一系列工作,每一项工作都已是以一个job的形式存在 4,job运行的过程中,当需要容器镜像时,则从docker registry中下载镜像,并通过镜像管理驱动graph driver将下载的镜像以graph的形式存储 5.当需要为docker创建网络环境是,通过网络管理驱动network driver创建并配置docker容器网络环境 6.当需要限制docker容器在运行资源或执行用户指令等操作是,则通过exec driver来完成 7.Libcontainer是一项独立的容器管理包,networkdriver以及exec driver都是通过里边container来实现具体对容器进行的操作 |
4.docker 安装 查看官网 https://docs.docker.com/engine/install/centos/
5.输入 docker run hello-world 查看是否成功
run 干了什么
5.docker为什么比虚拟机快
1.比虚拟机更少的抽象层
2.docker利用的是宿主机的内核,而不是加载操作系统的os内核
6.docker常用命令
1.帮助启动类命令 systemctl start docker 启动docker systemctl stop docker 停止docker systemctl restart docker 重启docker systemctl status docker 查看docker 状态 systemctl enable docker 开启启动 docker info 查看docker概要信息 docker --help 查看帮助文档 docker 命令 --help 查看具体命令帮助文档 2.镜像命令 docker images 【-a 全部镜像 | -q 只查看镜像id】 查看已存在镜像 docker serach 【--limit 5 最多stars的5个】 镜像名 查看远程仓库是否有此镜像 docker pull 镜像名 【:tag版本号】 下载镜像 默认latest docker system df 查看镜像、容器、数据卷所占的空间 docker rmi 【-f 强制删除】镜像ID(可以多个) 删除某个镜像 docker rmi -f $(docker images -qa) 删除全部镜像 面试题:docker虚悬镜像是什么:仓库名,标签都是<none>的镜像,俗称虚悬镜像 3.容器命令 docker run [options] [id|name] bash -i:交互式操作 -t: 终端 --name:给容器启动指定一个名称 -P:随机端口映射 大写P -p:指定端口映射 小写p -d:指定容器的后台运行 bash :shell终端 例如:docker run -it ubuntu bash exit:退出停止 ctrl + p +q :退出不停止 docker ps 【options】 :列出正在运行的容器实例 -a :列出当前所有正在运行的容器+历史上运行的过的 -l:显示最近闯将的容器 -n:显示最近n个创建的容器 -q:静默模式,只显示容器编号 docker [start | restart | stop | kill | rm(-f 强制)] id 容器启动,停止,重启,杀掉,删除容器 docker logs id 查看容器日志 docker inspect 容器ID 查看容器内部细节 docker exec -it 容器ID bash 重新进入已经运行容器内部 exit退出不会停止容器 docker attach 容器ID 重新进入已经运行容器内部 exit退出会停止容器 工作中最好使用 docker exec docker cp 容器ID:路径 目的主机:路径 docker拷贝容器文件到本地 容器备份 docker export 容器ID > 文件名.tar 导出容器内容作为一个tar归档文件 cat 文件名.tar |docker import 镜像用户/镜像名:镜像版本号 :从tar包中的内容创建一个新的文件系统再导入为镜像对应 export
|
7.docker镜像
1.是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
2.UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个 虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体 的应用镜像。
3.特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
4.Docker镜像层都是只读的,容器层是可写的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。当容器启动时,一个新的可写层被加 载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。 所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有 镜像层都是只读的。
5.外网联通的情况下载容器中安装命令使用 apt-get
apt-get update 更新包管理工具
apt-get -y install vim 安装vim
安装完成之后可以使用commit提交我们自己的新镜像供大家使用 docker commit -m " add vim cmd " -a="ziyu(作者)" 容器ID 仓库:版本号
例如 : docker commit -m "add vim cmd" -a="ziyu" fdf7fc6ca2b2 guigu:1.1.0
6.本地镜像发布到阿里云流程
7.搭建私有dockers仓库
1.下载registry镜像 docker pull registry 运行私有库Registry,相当于本地有个私有Docker hub docker run -d -p 5000:5000 -v /root/myregistry/:/tmp/registry --privileged=true registry 默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
演示在dockers安装ifconfig命令 docker run -it ubuntu bash apt-get update apt-get -y install net-tools
docker commit -m "ifconfig" -a="ziyu" 1ba76515b4b5 newubuntu:1.2 将本地的新生成的镜像文件提交到本地仓库 模板:docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
curl -XGET http://192.168.92.168:5000/v2/_catalog 验证私服仓库上有什么镜像 将新镜像newubuntu:1.2修改符合私服规范的Tag 按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag 自己host主机IP地址,填写同学你们自己的,不要粘贴错误,O(∩_∩)O 使用命令 docker tag 将zzyyubuntu:1.2 这个镜像修改为192.168.92.168:5000/newubuntu:1.2 docker tag newubuntu:1.2 192.168.92.128:5000/newubuntu:1.2 修改配置文件使之支持http docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker docker push 192.168.92.128:5000/newubuntu:1.2 将镜像推送到私服库 curl -XGET http://192.168.92.128:5000/v2/_catalog 验证 docker pull 192.168.92.168:5000/newubuntu:1.2 拉去到本地运行 |
8.docker容器数据卷
1.卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷 2.将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。为了能保 存数据在docker中我们使用卷。 特点: 1:数据卷可在容器之间共享或重用数据 2:卷中的更改可以直接实时生效,爽 3:数据卷中的更改不会包含在镜像的更新中 4:数据卷的生命周期一直持续到没有容器使用它为止 2.容器卷记得加入 --privileged=true Docker挂载主机目录访问如果出现cannot open directory .: Permission denied 解决办法:在挂载目录后多加一个--privileged=true参数即可
3.宿主vs容器之间映射添加容器卷 直接使用命令 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 docker run -it --name myu3 --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu /bin/bash docker inspect 容器ID 查看是否挂载成功
1 docker修改,主机同步获得 2 主机修改,docker同步获得 3 docker容器stop,主机修改,docker容器重启看数据是否同步 读写规则添加说明(默认是rw) 1.容器内部限制,只能读取不能写使用 ro 2.命令 docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名 卷的继承和共享(相当于使用多盘备份) 1. 容器1完成和宿主机的映射 docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu 2.容器2继承容器1的卷规则 docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu |
9.mysql实例
docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 |