这里的话,就详细说说小唐对于容器的配置,对了!小唐参考的书籍是Linux容器云实战!!!通过之前的案列,我们已经对了,docker有了一个初步的了解,目前我的暂时的理解就是一台微型的虚拟机!!!一起来做今天的实验吧
一、拉取启动容器
我们这里已centos作为实验案例,没有加速的朋友可以移步Ubantu docker学习笔记(一)docker安装查看
docker pull centos
下载完成之后,我们就可以通过
docker images
来查看我们的镜像
同时通过命令来创建容器来进入我们的镜像
docker run -it centos
-i:以交互模式运行容器,通常与 -t 同时使用; it同时使用
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
这里我们进入的就是我们centos啦!
源于这个我们可以看看centos的内核
uname -r
退出
exit
具体的话我们可以通过镜像id来进行具体查看(注意和上面的容器id进行区分)
这里就很清楚的看到,我们的centos(5d0da3dc9764)是由三层(有几行就是几层)只读层构成的,最后得到一个5d0da3dc9764的id,然后我们用户在读写的时候,会创建一个可读可写层,然后我们所有的操作都是在这个上面进行的
下面我们自己拉扯一个Ubuntu作为练习吧
docker pull Ubuntu:15.04
二、本地镜像初解
我们首先来看看我们的本地镜像,进行一个更为详细的解释和理解
docker images
有人会发问了,那个IMAGE作为唯一id为什么,只有12位,啊哈哈哈,那是因为他只显示12位,我们可以通过
docker images --no-trunc
进行详细的展开
三、构建镜像
为什么有了镜像,那我们为什么还要自己构建呢?
害,其实你可以简单的理解为,虽然是一个新的镜像,但是他无法满足我们开发所需的要求
就好像,我们刚刚拿到的云服务器,里面的sql、nigx需要来安装
我们也需要对于这个镜像diy
这里我们说一下两种方式,一个是我们直接使用命令的方式,另外一种我们就直接使用dockerfile的方式(其实我觉得有点更加像sh脚本啊哈哈哈哈)
3.1使用docker commit构建镜像
我们进入到我们的centos
docker run -it centos /bin/bash
我们给我们centos安装一个vim,并设置为开机启动,自动构成vim,以免我们重新创建镜像后还需要对vim进行安装
yum -y install vim
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: Interrupted by signal
这里由于我们我们使用的版本在去年已经停止服务了,所以在这里我们需要进行换镜像
切换阿里镜像
1.进入yum的repos目录
cd /etc/yum.repos.d/
2、修改所有的CentOS文件内容
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
3、更新yum源为阿里镜像
yum -y install wget
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum clean all
yum makecache
然后再去执行我们vim的下载命令
yum -y install vim
就完成啦
这时候值得注意的是,我们记录下我们现在容器的一个id
通过我们这个容器的id去创建属于他的镜像(我其实喜欢把他叫做快照啊哈哈哈哈)
docker commit 1881e7dde299(你自己ide容器id) centos/vim(名字自己可以取)
这样,我们就得到了这个容器的快照,其实也就是我们已经配置好vim和镜像源的镜像啦
我们一起来验证一下
docker run -it centos/vim(你的名字) /bin/bash
which vim
3.2使用dockerfile构建镜像
说是说dockerfile,其实我感觉更像是sh脚本文件啊哈哈哈哈,接下来我们来看看他有那些好玩的吧
我们首先来了解一下他有哪些配置参数
- FROM(使用哪一个镜像源)
- MAINTAINER(作者信息)
- RUN(容器里运行的命令)
- EXOPOSE(运行容器时使用的端口)
- CMD(容器启动的命令)
- ENTRYPONINT(cmd运行时候的命令传递给ENTRYPONINT)
- COPY(将文件复制到当前容器中)
- ADD(把文件复制到当前容器)
- VOLUME(为容器添加器卷)
- WORKDIR(设置工作目录)
- ENV(环境变量)
- USER(以什么身份运行,默认root)
创建我们的dockerfile
touch Dockerfile
查看
ls
编写我们Dockerfile文件
#选择使用的image,因为我们这个已经配置好镜像了,就直接用这个centos/vim FROM centos/vim #执行的命令 RUN yum -y install vim RUN yum -y install chrony
构建镜像
docker build -t centos/dockerfile .
-t后面跟你的名字 后面还有一个。别忘记了,表示当前目录下
我们通过images可以很直观的看到
其实会注意细节的同学就会看到,三个centos size(内存)变化,他们相当于三个不同状态下centos的快照
我们也可以通过查看history更为直观的看到
centos的
centos/vim 的
centos/dockerfile的
有没有同学想过,如果我们执行的run的顺序相反会发生什么有意思的事情
docker build -t centos/dockerfile2 .
在这里,我们可以很明显的看到,之前我们使用
yum -y install vim是直接下来的
但是我们这一次确实又下载了一次
我们去看看centos/dockerfile2的结构
得到结论,如果命令执行顺序不对,我们的层级会从新创建缓存
注:默认会使用缓存,但是可以添在 docker build中添加–no-cache,来不使用缓存
四、总个结吧
对于我们的images其实我理解就是快照,我们可以通过我们的快照去快速的创建我所需要的环境,也就是我们的容器
然后去创建我们快照的方法一共有两种
1.通过命令去保存之前运行的容器id,将此时运行的容器id作为新的image(容器)
2.通过dockerfile的方式去创建,这里更加便捷,避过要注意我们指令顺序,会对我们是不是用缓存造成影响
以前自己搭建云服务器的方式是真的笨。。。
有兴趣的可以看看之前小唐的笨蛋操作