文章目录
概述
本文为个人学习笔记,内容整理自B站尚硅谷周阳老师的docker教程视频,本文仅整理基础部分1-39个视频,更多内容详见教程,原视频请点这里
docker是什么
docker是一种基于go语言的云开源项目,是在Linux容器技术的基础上发展过来的,可以通过将应用打包成镜像,通过镜像新建容器实例,实现跨平台、跨服务器的效果,是一种为了解决运行环境和配置问题的软件,可以方便地做持续集成并有助于整体发布。
Linux容器(Linux containers, LXC):是与Linux操作系统分隔开的一系列进程,可以在别的镜像运行并由该镜像提供进程所需要的全部文件,即将软件所需的所有资源打包成一个隔离的容器,这个容器就是Linux容器。
不同于虚拟机技术虚拟一整套操作系统(虚拟机技术也作为带环境安装的一种解决方案),容器化技术只打包软件所需要配置、环境以及版本信息等,容器没有自己的内核也没有进行硬件虚拟,因此更加轻量化
docker能干嘛
- 更快速的应用交付和部署:开发者直接将应用的源码、环境、配置以及版本信息等打包成一个镜像发布,使用者直接下载该镜像并在docker引擎上就可以直接运行,不用像以前那样,拿到应用之后还需要下载和配置对应的环境和版本等(该过程还容易出错),提高了效率
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
docker三要素
- 镜像image:类似java的类模板,可以用来新建docker容器
- 容器container:类似java的类模板new出来的一个个类实例对象
- 仓库repository:存放镜像的地方,分为公有库和私有库,国内一般使用阿里云或网易云作为公有库而不适用docker-hub这个国外的官方的仓库
我的理解:docker是静态的定义,容器是镜像运行时的实体,比如centos7这个镜像,它包含了完整的一套centos7的最小的系统root文件系统,基于该镜像可以新建centos7的docker容器,进而可以在该容器上进行相关的配置等一些更具体的操作
docker架构及基本运行流程
是一种CS架构,客户端通过Docker Client客户端命令行与docker后台守护进程中的服务层Docker Server进行连接,进而与Engine进行交互,Engine接受客户端命令行发送来的命令,并执行,每一个工作都以一个job的形式进行,并且与远程仓库进行连接,方便下载和发布镜像。当需要为Docker创建网络环境时,通过网络管理驱动Network Driver创建并配置Docker容器网络环境(一个docker引擎内部多个容器进行通信,多个docker引擎之间进行通信)
- 用户是使用docker client与docker daemon建立通信,并发送请求给后者。
- docker daemon作为docker架构中的主体部分,首先提供docker server的功能使其可以接受docker client的请求。
- docker engine执行docker 内部的一系列工作,每一项工作都是以一个job的形式存在。
- job的运行过程中,当需要容器镜像时,则从docker registry中下载镜像,并通过镜像管理驱动graph driver将下载镜像以graph的形式存储。
- 当需要为docker创建网络环境时,通过网络管理驱动network driver创建并配置docker容器网络环境。
- 当需要限制docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。
- libcontainer是一项独立的容器管理包,network driver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。
centos7上安装docker
可以根据官网教程进行安装,以下记录一下步骤
- 安装centos7(网上教程大差不差,可以看这里)
- 卸载旧版本的docker(根据官网所给代码直接粘贴运行)
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- yum安装gcc相关包
yum -y install gcc
yum -y install gcc-c++
另外,yum下载软件失败,显示尝试其他镜像源,看这里
另外,yum命令报错显示There are no enabled repos ,看这里
- 安装需要的软件包
yum install -y yum-utils
- 安装stable镜像库(一般按照阿里云或网易云等国内镜像仓库,这里按照阿里云镜像仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引
yum makecache fast
- 安装docker ce
yum -y install docker-ce docker-ce-cli containerd.io
- 启动docker
systemctl start docker
- 运行一个docker容器实例
docker run hello-world
至此,若无报错则说明成功在centos7上安装了docker
- 为docker配置镜像加速器
注册阿里云账号->登录阿里云开发者平台->鼠标移动到左上角打开产品与服务栏->找到容器下的容器镜像服务ACR->新建一个个人实例->点击镜像工具下的镜像加速器->选择好平台按照提示进行配置
docker常用命令(重点)
帮助启动类命令
- 启动docker:systemctl start docker
- 停止docker:systemctl stop docker
- 重启docker:systemctl restart docker
- 查看docker状态(启用或停止):systemctl status docker
- 设置开机启动docker:systemctl enable docker
- 查看docker概要信息:docker info
- 查看docker总体帮助文档:docker --help
- 查看docker命令帮助文档:docker [具体命令] --help
镜像命令
- 列出本地所有镜像:docker images [option]
- 搜索镜像:docker search [option] [镜像名字]
- 下载镜像:docker pull [镜像名字:[TAG]](冒号[TAG]可加可不加,不加则下载镜像的最新版,加了可以下载指定版本的镜像)
- 删除镜像:docker rmi -f 镜像名字ID
容器命令(重点)
-
运行容器实例:docker run [option] image [commond]
-
查看正在运行的容器实例:docker ps [option]
-
退出容器,一般用exit
-
启动已停止运行的容器:docker start 容器ID或者容器名
-
重启容器:docker restart 容器ID或者容器名
-
停止容器:docker stop 容器ID或者容器名
-
强制停止容器:docker kill 容器ID或者容器名
-
删除已停止的容器:docker rm 容器ID
-
删除正在运行的容器:docker rm -f 容器ID
-
查看容器日志:docker logs 容器ID
-
查看容器内运行进程:docker top 容器ID
-
查看容器内部细节:docker inspect 容器ID
-
进入容器(一般用exec)
-
从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径
-
导出容器:docker export 容器ID > 文件名.tar
-
导入容器:cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
容器的分层
镜像是分层的,底层原理是联合文件系统,联合文件系统是一种分层的、轻量级且高性能的文件系统,支持对文件系统的修改作为一层层的叠加。因此可以基于基础镜像,制作出各种具体的应用镜像。
docker最底层是bootfs(boot file system根文件系统),主要包含bootloader(根加载)和kernel(Linux内核),其中bootloader引导加载kernel。Linux系统与之类似,Linux系统刚启动时,会加载bootf,当bootfs加载完成后整个Linux内核就在内存中了,此时内存的使用权由bootfs转交给Linux内核,在bootfs之上的rootfs,其实就包含了各种典型Linux系统(如Ubuntu、centos)的标准目录和文件。
而docker实际上复用了宿主机的内核,即使用了宿主机的bootfs作为自己的bootfs,而不同Linux发行版的bootfs基本是一致的,从而docker下载镜像时只需要下载rootfs层,很轻量。
镜像层是只读的,容器层是可写的,当容器启动时,一个新的可写层被加载到镜像的顶部,对容器层进行操作,若将容器层添加到原先的镜像层则形成了一个新的镜像层,镜像便是这样一层层堆叠起来的。
分层的好处:资源共享,方便复用
本地镜像发布到阿里云
- 打包成新镜像:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
- 进入阿里云开发者平台->鼠标移动到左上角打开产品与服务栏->找到容器下的容器镜像服务ACR->点击进入个人实例->先创建命名空间->点击镜像仓库选择刚才创建的命名空间再创建镜像仓库,代码源选择本地仓库->可以看到推送或拉取的脚本代码,直接复制运行即可
本地新建一个带有vim功能的ubuntu容器实例,打包成镜像文件,并发布到阿里云镜像仓库中
从阿里云镜像仓库中拉取刚才发布的镜像文件到本地
本地镜像发布到私服库
不同于前一节将镜像发布到阿里云的docker registry,本节介绍使用docker官方提供的docker registry来构建私有的镜像仓库,一些机密文件不想放到公网(阿里云镜像仓库)可以放到自己创建的私服库(公司内部或者小团体使用,比较安全)
- 下载镜像registry:
docker pull registry
- 运行私有库registry,相当于本地有个私有docker hub
docker run -d -p 5000:5000 -v /root/myregistry/:/temp/registry --privileged=true registry
-v参数和–privileged参数在下一小节进行讲解
- 使用上一小节的commit命令将修改后的容器实例打包成新镜像
- 查看私服库上有哪些镜像
curl -XGET http://宿主机ip:映射端口port/v2/_catalog
- 将新镜像改名修改成符合规范的Tag
docker tag 镜像:Tag Host:Port/Repository:Tag
- 由于docker私服库进行了安全加固,需要修改配置文件使之支持http
vim /etc/docker/daemon.json
进入配置文件,添加以下代码进入大括号内并保存退出,不要忘了在上一条语句末尾添加逗号,修改完成后重启docker使配置生效
"insecure-registries":["宿主机ip:映射端口port"]
- push推送到私服库
docker push Host:Port/Repository:Tag
- curl验证是否推送成功
curl -XGET http://ip:port/v2/_catalog
- pull到本地并运行
docker pull Host:Port/Repository:Tag
docker容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,不属于联合文件系统,因此能够绕开联合文件系统提供一些用于特殊存储或共享数据的特性,独立于容器的生存周期,因此存储在其中的数据不会在容器删除时丢失
容器数据卷类似电脑的硬盘,可以实现数据的持久化,或者重要数据备份,具有以下特点:
- 数据卷可以在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
使用容器数据卷的命令如下:(所写路径若不存在会自动创建)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
其中–privileged=true,是由于centos7安全模式比之前系统的版本更强,挂载被认为是不安全的行为,因此需要添加该参数扩大容器的权限解决挂载目录没有权限的问题
容器数据卷存在ro只读和rw读写两种规则,默认没写是rw,也可以设置为ro,此时宿主机可以往容器数据卷中写入内容,但是容器内只能读取数据不能写入
-v参数添加自定义的容器数据卷,实现了宿主机绝对路径目录下的数据内容和容器内目录下的数据内容互联互通
- 修改宿主机绝对路径目录下的数据内容,容器内目录下的数据内容会马上同步
- 反之亦然
- 就算容器停止之后,在宿主机绝对路径目录下添加数据,容器内目录下的数据内容同样会同步
此外,容器数据卷还支持容器数据卷之间的继承,可以使用如下命令进行继承:
docker run -it --privileged=true --volumes-from 父容器名 --name=子容器名 镜像名
执行该命令后会新建一个容器实例,该容器实例和宿主机的数据卷挂载关系与父容器实例和宿主机的数据卷挂载关系一致,此时父容器实例与宿主机之间的容器数据卷中的内容会同步到子容器实例中对应的目录中,此时即使父类容器停止,子类容器依旧可以继续和宿主机进行共享数据,修改数据后,重启父类容器,父类容器同样会对共享的目录内容进行更新
不常写博客,写的很丑,阅读性不强,恳请各位读者批评指正,以后会继续改进文章风格,努力提高文章可读性!