目录
一、Docker的架构和底层技术
1.Docker Platform(平台)
2.Docker Engine
2.1 组成
3.Docker Architecture(架构)
4.底层技术支持
二、Docker Image(镜像)
1.概述
2.获取image的第一种方式
3.获取image的第二种方式
4.如何制作一个Base Image
1.什么是Container
2.运行容器
3.交互式运行容器
4.Docker和Docker Image简写命令及Container命令
四、构建自己的Docker Image
1.docker container commit(docker commit)
1.1 交互式运行容器
1.2 将容器commit成一个image
2.docker image build(docker build)
2.1 创建dockerfile
2.2 通过dockerfile构建出image
学习资源分享
一、Docker的架构和底层技术
1.Docker Platform(平台)
-
Docker提供了一个开发、打包、运行app(应用application)的平台
-
把app和底层infrastructure(基础设备)隔离开来
-
Docker提供了一个开发、打包、运行app(应用application)的平台
-
把app和底层infrastructure(基础设备)隔离开来
2.Docker Engine
2.1 组成
-
后台进程(dockerd)
用于一些后台的操作,如image、container、网络及存储的管理
-
REST API Server
用于dockerd和docker之间通信的接口服务
-
CLI接口(docker)
运行docker version命令是显示的client 版本和server engine版本,client和server之间是一个cs架构的
-
运行docker version命令可以看到客户端版本与服务端engine版本,查找docker进程可以看到后台是执行的dockerd进程
-
后台进程(dockerd)
用于一些后台的操作,如image、container、网络及存储的管理
-
REST API Server
用于dockerd和docker之间通信的接口服务
-
CLI接口(docker)
运行docker version命令是显示的client 版本和server engine版本,client和server之间是一个cs架构的
-
运行docker version命令可以看到客户端版本与服务端engine版本,查找docker进程可以看到后台是执行的dockerd进程
3.Docker Architecture(架构)
4.底层技术支持
Namespaces:做隔离pid、net、ipc、mnt、uts
Control groups:做资源限制
Union file systems:Container和image的分层
二、Docker Image(镜像)
1.概述
-
文件和meta data的集合(root filesystem)
-
分层的,并且每一层都可以添加改变删除文件,成为一个新的image
-
不同的image可以共享相同的layer(层)
-
image本身是read-only(只读)
-
查看本地存在的image
docker image ls
2.获取image的第一种方式
-
文件和meta data的集合(root filesystem)
-
分层的,并且每一层都可以添加改变删除文件,成为一个新的image
-
不同的image可以共享相同的layer(层)
-
image本身是read-only(只读)
-
查看本地存在的image
docker image ls
2.获取image的第一种方式
Build from Dockerfile
Docker提供一个配置文件Dockerfile,就好比之前博主使用Vagrant工具时的Vagrantfile文件一样,通过Dockerfile文件就可以去定义一个docker image镜像,build这个dockerfile文件就可以构建出一个image镜像
-
在cdtaogang目录下创建dockerfile文件,内容如下
-
执行docker build命令进行构建镜像,-t 镜像名称,后面的.是表示当前dockerfile路径
docker build -t cdtaogang123/redis:latest .
-
提示如下超时,docker安装后默认没有daemon.json这个配置文件,需要进行手动创建,配置文件的默认路径:/etc/docker/daemon.json,在阿里云中复制加速器地址,进行添加
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
-
重启生效
sudo systemctl daemon-reload
sudo systemctl restart docker
-
再次build构建,显示成功
-
在执行build构建时,dockerfile文件中每一行代码都表示一个步骤,一共有7行代码,所以build时,会显示执行这7个步骤
-
此时查看本地image镜像就可以看到以上创建的镜像了
3.获取image的第二种方式
Pull from Registry
类似github 仓库,可以git clone拉取仓库的文件,也可以将文件push到仓库中,那么docker pull则是在docker hub上去拉取你要的镜像
-
在docker hub网站上查看image基础镜像
-
如点击centos进入后,选择tags标签,可以看到很多版本的centos镜像,对应有拉取命令
-
博主拉取一个centos8镜像,镜像名后面不跟版本则表示拉取latest最新的
-
docker pull centos:centos8
-
除了官方提供的images镜像外,还有第三方的镜像(个人的或者公司的),比如搜索wordpress第一个标记Official的则表示官方提供的,如下这种用户名/wordpress的image则表示是个人或者公司的
-
拉取这个人的wordpress images,由于文件比较多,博主这里就不继续下载了
4.如何制作一个Base Image
-
说明一点,博主之前在执行docker命令时是在root用户下执行的,如博主exit退出root用户,使用cdtaogang用户那么每次执行命名docker命令都需要加上sudo就比较麻烦,不添加sudo则会提示权限不够
-
将当前cdtaogang用户添加到docker用户组中,然后重启docker服务,执行docker image ls命令结果还是提示权限不够
-
原因是,需要xshell重新远程连接centos即可
-
回到正轨,之前博主在centos虚拟机中安装docker时,拉取过hello-world基础镜像,在这个base image中其实存在一个可执行文件,通过docker run 执行这个hello-world基础镜像就会创建一个容器并运行这个容器,打印出如下hello from docker这一段话
-
现在就模拟hello-world做一个基础镜像,就需要hello world程序,可以通过c语言编写一个hello world 将这个hello world编译成一个可执行的二进制文件
-
mkdir hello-world
cd hello-world
vi hello.c
说明一点,博主之前在执行docker命令时是在root用户下执行的,如博主exit退出root用户,使用cdtaogang用户那么每次执行命名docker命令都需要加上sudo就比较麻烦,不添加sudo则会提示权限不够
将当前cdtaogang用户添加到docker用户组中,然后重启docker服务,执行docker image ls命令结果还是提示权限不够
原因是,需要xshell重新远程连接centos即可
回到正轨,之前博主在centos虚拟机中安装docker时,拉取过hello-world基础镜像,在这个base image中其实存在一个可执行文件,通过docker run 执行这个hello-world基础镜像就会创建一个容器并运行这个容器,打印出如下hello from docker这一段话
现在就模拟hello-world做一个基础镜像,就需要hello world程序,可以通过c语言编写一个hello world 将这个hello world编译成一个可执行的二进制文件
mkdir hello-world
cd hello-world
vi hello.c
-
编译c语言脚本,需要安装gcc
-
sudo yum install gcc
sudo yum install glibc-static
-
编译hello.c文件输出为hello可执行文件,执行hello文件,成功打印
-
通过dockerfile把这个可执行文件打成docker image,在hello-world目录创建dockerfile文件,因为是我们自己创建基础镜像,所以FROM字段不以任何镜像为基础,写法为FROM scratch,之前创建的dockerfile文件中FROM字段指定以ubuntu:14.04为基础镜像,具体配置如下
-
构建dockerfile文件,生成tag为cdtaogang/hello-world的image
-
对比cdtaogang/hello-world镜像与hello-world文件中的hello可执行文件大小,差距很小,几乎是基于hello可执行文件的大小下创建的image
-
通过docker history
,查看构建的cdtaogang/hello-world镜像的分层情况,第一层是执行hello文件,第二层这是添加文件到指定路径,因为FROM 没有指定基础镜像所以该层不显示 -
创建并执行容器
三、Container(容器)
1.什么是Container
-
通过Image创建(copy)
-
在Image layer之上建立一个container layer(可读写)
-
类比面向对象:类(image)和实例(container)
-
Image负责app的存储和分发,Container负责运行app
2.运行容器
-
执行docker container ls命令可以查看当前正在运行的容器,目前是没有容器正在运行,因为执行docker run命令后,创建并运行容器后,会退出,那么通过docker container ls -a命令列举出来所有的容器包括运行或者退出的,可以到看到cdtaogang/hello-world镜像创建的容器是已退出状态
-
创建并运行centos:centos8镜像的容器,同理也是在容器运行后就自动退出了
通过Image创建(copy)
在Image layer之上建立一个container layer(可读写)
类比面向对象:类(image)和实例(container)
Image负责app的存储和分发,Container负责运行app
-
执行docker container ls命令可以查看当前正在运行的容器,目前是没有容器正在运行,因为执行docker run命令后,创建并运行容器后,会退出,那么通过docker container ls -a命令列举出来所有的容器包括运行或者退出的,可以到看到cdtaogang/hello-world镜像创建的容器是已退出状态
-
创建并运行centos:centos8镜像的容器,同理也是在容器运行后就自动退出了
3.交互式运行容器
-
在docker run 添加-it交互式运行命令,可以看到命令运行成功会进入到一个系统里面
-
在另一个终端中,执行docker container ls就能看到我们刚交互式运行的容器没有退出,可以发现上面进入的系统其实就是容器的ID,所以交互式运行容器就是指创建并进入到容器中
-
在容器中,因为镜像是centos的,所以可以执行yum命令
-
那么退出容器,在执行docker container ls命令查看正在运行的容器则不会显示该容器了,而执行docker container ls -a 则会显示刚刚退出的容器
在docker run 添加-it交互式运行命令,可以看到命令运行成功会进入到一个系统里面
在另一个终端中,执行docker container ls就能看到我们刚交互式运行的容器没有退出,可以发现上面进入的系统其实就是容器的ID,所以交互式运行容器就是指创建并进入到容器中
在容器中,因为镜像是centos的,所以可以执行yum命令
那么退出容器,在执行docker container ls命令查看正在运行的容器则不会显示该容器了,而执行docker container ls -a 则会显示刚刚退出的容器
4.Docker和Docker Image简写命令及Container命令
-
首先在命令行输入docker回车,查看docker所有命令,可见分为Management Commands(管理命令)和Commands(命令)
-
查看正在运行的容器及所有的容器
-
docker container ls >> docker ps
docker container ls -a >> docker ps -a
-
-
比如删除一个容器,使用docker container rm命令,可以输入docker container命令回车,查看能执行的命令
-
删除容器简写命令,因为docker rm命令默认是删除容器所以可以直接用
-
docker container rm >> docker rm
-
-
执行docker rm container id,这个id可以不写全,但是需要保证你输入的简写id是唯一的
-
输入docker image查看可以执行的命令
-
查看所有的image镜像
-
docker image ls >> docker images
-
-
删除镜像
-
docker image rm >> docker rmi
首先在命令行输入docker回车,查看docker所有命令,可见分为Management Commands(管理命令)和Commands(命令)
查看正在运行的容器及所有的容器
docker container ls >> docker ps
docker container ls -a >> docker ps -a
比如删除一个容器,使用docker container rm命令,可以输入docker container命令回车,查看能执行的命令
删除容器简写命令,因为docker rm命令默认是删除容器所以可以直接用
docker container rm >> docker rm
执行docker rm container id,这个id可以不写全,但是需要保证你输入的简写id是唯一的
输入docker image查看可以执行的命令
查看所有的image镜像
docker image ls >> docker images
删除镜像
docker image rm >> docker rmi
-
一次性删除所有的容器,首先运行5个容器,然后查看所有的容器(已退出)
-
首先通过docker ps -aq 列举出所有的容器ID
-
docker ps -aq
-
然后直接rm命令删除列举出所有的容器ID来删除所有容器,需要使用$将以上命令当成一个结果进行删除
-
docker rm $(docker ps -aq)
-
如果所有的容器中存在正在运行的容器以及已退出的容器,我只删除已退出的容器,这种场景如何实现
-
实现以上的场景,首先需要获取到所有容器中已退出的容器ID,通过-f 筛选出容器状态status=exited已退出的容器,加上-q参数则表示列举出容器ID,最后$包住结果,执行docker rm删除即可,成功实现只删除已退出的容器
四、构建自己的Docker Image
1.docker container commit(docker commit)
1.1 交互式运行容器
-
交互式运行centos容器,在容器中并没有安装vim命令,进行安装vim工具
-
exit退出容器,查看所有容器,显示交互式运行的容器已退出
1.2 将容器commit成一个image
1.1 交互式运行容器
-
交互式运行centos容器,在容器中并没有安装vim命令,进行安装vim工具
-
exit退出容器,查看所有容器,显示交互式运行的容器已退出
1.2 将容器commit成一个image
交互式运行centos容器,在容器中并没有安装vim命令,进行安装vim工具
exit退出容器,查看所有容器,显示交互式运行的容器已退出
说明:上一步在容器中安装了vim并退出了容器,那么在已退出的容器中可以看到该容器,现在则需要将这个容器commit成一个镜像,这个镜像是基于centos8基础镜像的,但是跟centos8基础基础镜像不一样的是它安装了vim
-
通过docker container commit命令实现将容器提交成image,命令可以简写成docker commit
-
执行如下命令,生成image镜像,
-
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit stupefied_fermat cdtaogang/centos-vim:centos8
-
查看生成的image
-
对比基础image和自己构建的image分层情况,很明显比基础centos8镜像多了一层,那就是安装vim命令
以上创建image的方式不提倡使用,因为如果发布该image,用户拿到该image是不知道该image是如何构建的,并且这种方式构建image很有可能把不安全的东西放到image里面发布出去,即该image肯定是不安全的
2.docker image build(docker build)
2.1 创建dockerfile
-
首先将上一步中commit容器生成的image删除
-
在上一级目录下创建一个目录,进入目录创建并编辑dockerfile文件
-
dockerfile内容如下,指定基础镜像为centos:centos8版本,在基础镜像中运行安装vim命令
-
首先将上一步中commit容器生成的image删除
-
在上一级目录下创建一个目录,进入目录创建并编辑dockerfile文件
-
dockerfile内容如下,指定基础镜像为centos:centos8版本,在基础镜像中运行安装vim命令
2.2 通过dockerfile构建出image
-
执行docker build命令以当前路径下的dockerfile构建出
-
查看构建的image
执行docker build命令以当前路径下的dockerfile构建出
查看构建的image
通过dockerfile构建镜像和commit容器生成的镜像差不多,但建议使用dockerfile构建image,这样的话只需要分享dockerfile这个文件给别人就可以了,别人通过你分享的dockerfile文件就能构建出跟你一样的image
学习资源分享
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走
这些资料,对于想进阶【自动化测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…



