文章目录
官网地址 https://docs.docker.com/
https://hub.docker.com/
学习视频: 尚硅谷2022版Docker实战教程(docker教程天花板)
一、Docker综述
- 个人理解:Docker是一种虚拟技术,不同于传统虚拟机:传统虚拟机是模拟整个操作系统,而Docker模拟的是一个软件/进程,它只加载环境需要的最小最核心赖以生存的Linux内核文件,而不加载其他用不上的东西,更加轻量廉价和快速。它的出现使软件开发师承担了一部分运维工程师的角色。
- Docker可以安装在Windows、Linux、Mac各个平台上,但它并非是一个通用的容器工具,它依赖已存在并运行的Linux捏和环境,执行效率几乎等同于所部属的Linux主机。因此Docker必须部署在Linux内核系统上。其他系统想部署就必须安装一个虚拟Linux环境。(Windows部署桌面版Docker是通过微软开发的虚拟机Hyper-V)
- Docker三要素:镜像image(类模板)、容器container(实例对象)、仓库repository(存放镜像的地方)
- 仓库分为公开仓库(eg:阿里云、腾讯云…)和私有仓库
- Docker入门架构&高级架构:(pull的时候如果本地没有找到对应镜像,就会取共有仓库中拉取。)
- 为什么docker比虚拟机快?
① 抽象层更少,docker容器中的程序直接使用实际物理机上的硬件资源。
②利用的是宿主机的内核,当新建一个容器时,不需要加载操作系统OS内核。
二、安装及加速工具
三、Docker常用命令
-
启动:systemctl start docker 停止:systemctl stop docker 重启:systemctl restart docker 查看状态:systemctl status docker 开机启动:systemctl enable docker 查看概要信息:docker info 查看总体帮助文档:docker --help 查看命令帮助文档:docker 具体命令 --help
- 镜像命令:
docker images //TAG表示版本号,同一仓库源可以有多个TAG版本,代表这个仓库源的不同版本,使用REPOSITORY:AG来定义不同的镜像,不指定就是默认最新 docker images -a //列出所有镜像,包括历史版本 docker images -q //只显示镜像ID docker images -aq docker search 镜像名 docker search --limit N 镜像名 //默认列出25个镜像 docker pull 镜像名[:TAG] //TAG没写默认为最新 docker system df //查看镜像、容器、数据卷所占空间 //删除单个 rm + i(image) docker rmi 某个镜像名字(ID) //删除镜像 docker rmi -f 某个镜像名字(ID) //强制删除镜像 //删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG //删除全部 docker rmi -f $(docker images -qa)
- 虚悬镜像:仓库名、标签都是none的镜像,俗称dangling image
- 容器命令
//run docker run [OPTIONS] IMAGE [COMMAND] [ARG...] //OPTIONS说明 --name=容器名字 -d //后台运行容器并返回容器ID,也即启动守护式容器(后台运行) -it //启动交互式容器 -i //interactive以交互式模式运行容器,通常与-t同时使用 -t //tty为容器重新分配一个伪输入终端,通常与-i同时使用 -P //随机端口映射 -p //指定端口映射 (docker端口与容器端口的映射。eg:6379:6379) eg: docker run -it ubuntu bash //bash表示使用shell命令 docker run -it --name=mUbuntu ubuntu bash docker ps //查看正在运行的容器 //OPTIONS说明 -a //显示所有正在运行的容器+历史上运行过的 -l //显示最新创建的容器 -n //显示最近n个创建的容器 eg:docker ps -n 1 -q //静默模式,只显示容器编号 docker logs 容器ID //查看日志 docker top 容器ID //查看容器内正在运行的进程 docker inspect //查看容器内部细节,包含网络、网桥 docker cp 容器ID:容器内路径 目的主机路径 //从容器内拷贝文件到主机上,在主机的命令行下进行操作 docker export 容器ID > 文件名.tar //导出容器 cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 //导入容器,后面三个镜像信息都可以自己设置 //退出容器命令 exit //run进去容器,退出后容器停止 ctrl+p+q //run进去容器,退出后容器不停止,即:docker ps还可以显示该容器 docker start 容器名字/ID //启动已停止运行的容器 docker restart 容器名字/ID docker stop 容器名字/ID //停止容器,会进行一些回收退出操作,比较优雅 docker kill 容器名字/ID //强制停止容器,直接停止,较粗鲁 docker rm 容器名字/ID //删除已停止的容器 -f 强制删除 //stop、kill的容器可以通过start重新启动,rm不可以 //一次性删除多个容器实例 docker rm -f $(docker ps -a -q) docker ps -a -q | xargs docker rm //表示前面的命令作为后面命令的输入参数args
- 守护式容器(后台服务器):在大部分场景下,我们希望docker的服务是在后台运行的,我们可以通过-d指定容器的后台运行模式。
- 重要的一点:Docker容器后台运行就必须有一个前台进程,容器命令如果不是一直挂起的命令(eg:top,tail),就会自动退出。因为他会觉得自己无事可做。
解决方法:将要运行的程序以前台进程的形式运行,一般是用命令行模式,表示还有交互式操作。 - top:用来动态显示系统当前进程状况,默认以CPU 占用量排序。而ps是静态的,即只显示命令执行时的进程状况。
- tail:按照要求将指定的文件的最后部分输出到标准设备,一般是终端。
docker run -d 容器名 //创建之后立即自杀退出 //解决方案 docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done" docker run -d ubuntu /bin/sh -c "tail -f /dev/null" //进入正在运行的容器并以命令行交互(通过-d运行起来的容器、ctrl+p+q操作退出的容器) docker exec -it 容器ID bashShell(/bin/bash) docker attach 容器ID 区别:attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。 exec是在容器中打开新的终端,可以启动新的进程,用exit退出,不会导致容器的停止
- 重要的一点:Docker容器后台运行就必须有一个前台进程,容器命令如果不是一直挂起的命令(eg:top,tail),就会自动退出。因为他会觉得自己无事可做。
四、镜像的分层概念
- UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:以此同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。 - Docker镜像加载原理:
- docker镜像实际是由一层一层的文件系统组成,这种层级的文件系统UnionFS。
- bootfs主要包含根加载bootloader和linux内核kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。
- 当boot加载完成之后整个内核就在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。bootfs之上就是rootfs,就是各种不同的操作系统发行版,eg:Ubuntu、CentOS。
- 对于一个精简OS ,rootfs很小,只需要包含最基本的命令、工具、程序就可以了,因为底层直接用主机的kernel,自己只需要提供rootfs即可。
- 好处:共享资源、方便复制迁移,即复用。比如:多个镜像都是从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像,同时内存只需加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。
- 镜像是只读的,只有容器才是可写的。容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为“容器层”,之下的都成为“镜像层”。
- 提交容器副本使之成为一个新的镜像:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
五、Docker本地镜像发布到阿里云
登录阿里云账户,进入容器镜像服务->创建个人实例->创建命名空间->创建镜像仓库->之后即有相关命令行操作。
六、私有Docker Registry(Docker hub)
-
下载Docker仓库
docker pull registry
运行私有仓库,相当于本地有一个私有仓库Docker hub
docker run -d -p 5000:5000 -v /zzy/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便与宿主机联调 -
curl验证私服库上有什么镜像
curl -XGET http://192.168.111.129:5000/v2/_catalog
将新镜像修改符合私服规范的Tag,相当于创建一个副本。
docker tag 镜像文件:版本号 IP地址:端口号/镜像名称:版本号
这个副本和原来的镜像一模一样,也就是说,当通过镜像ID删除镜像时,创建的tag会和原来的镜像一起被删除。
-
docker默认不允许http方式推送镜像,修改配置文件使之支持http
vim /etc/docker/daemon.json
"insecure-registries":["192.168.111.129:5000"]
加到上述文件中
-
push刚刚tag出来的镜像到本地仓库
docker push 192.168.111.129:5000/镜像名:版本号
再次curl验证私服库上有什么镜像
curl -XGET http://192.168.111.129:5000/v2/_catalog
pull拉过来仓库中的镜像
docker pull 192.168.111.129:5000/镜像名:版本号
七、Docker容器数据卷
-
容器卷后面都加上
--privileged=true
扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。 -
-v /zzy/myregistry/:/tmp/registry --privileged=true
结构:-v 宿主机路径:容器内路径 --privileged=true
实现宿主机和容器的互联,默认仓库被创建在容器的/var/lib/registry
目录下。 -
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System,提供一些用于持续存储或共享数据的特性。
卷设计的目的就是数据持久化,完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷。 -
特点:①数据卷可在容器之间共享或重用数据
②卷中的更改可以直接实时生效
③数据卷中的更该不会包含在镜像的更新中
④数据卷的生命期一直持续到没有容器 -
docker inspect 容器ID //查看数据卷是否挂载成功,看里面Mount的参数。 //读写权限:针对的是整个文件夹(默认为可读可写) docker run -it --privileged=true -v /zzy/myregistry/:/tmp/registry:rw --name 容器名 镜像名 //可读可写 docker run -it --privileged=true -v /zzy/myregistry/:/tmp/registry:ro --name 容器名 镜像名 //容器只读read only,即宿主机可以写东西到共享文件夹,容器可以查看里面的文件,但容器不可以添加东西到共享文件夹中 //数据卷的继承和共享 docker -run -it --privileged=true -v --volumes-from 被继承容器名 --name 容器名 镜像名 //被继承容器被关闭之后不会影响当前容器对共享文件夹的使用
八、容器下安装常用软件
步骤:搜索镜像->拉取镜像->查看镜像->启动镜像->停止容器->移除容器