天天看点

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

自制docker镜像

  • docker commit方式去自制镜像
    • 1.启动centos7的容器镜像
    • 2.yum安装nginx服务
    • 3.制作镜像
    • 4.验证
  • Dockerfile文件自制镜像
    • 1.新建容器的配置文件
    • 2.docker build制作镜像
    • 3.验证
    • 4.对Dockerfile文件的说明
  • 容器内编译安装nginx

构建docker镜像有以下两种方式:

1.docker commit命令

docker commit提交的只是创建容器的镜像与容器的当前状态之间有差异的部分,所以使得该更新非常轻量

2.docker build和Dockerfile文件

Dockerfile文件可以看成格式docker镜像的配置文件,如果docker build不加-f选项,则配置文件的名字必须是Dockerfile,可以理解成Dockerfile是docker配置文件的参数,只有通过该参数才能给docker镜像传递参数

这里均以centos7为基础镜像,在该基础上安装nginx服务。

用户也可以登录docker Hub仓库,去获取镜像或者是上传镜像

登录docker Hub仓库如下:

##可以登录自己的docker Hub账号,能够共享和发布镜像
[[email protected] ~]# docker login
           
docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

docker commit方式去自制镜像

这里以centos7为基础镜像,在该镜像上安装nginx服务,这里的nginx服务为了方便起见,直接使用yum安装,docker commit方法就是将当前容器的状态封装成一个镜像。

1.启动centos7的容器镜像

在此步,运行一个容器,则内核会为该系统分配一个只读层,里面是该容器的镜像,所有由该镜像运行的容器共享这个内存空间,这是为了节约空间大小,并且单独为该容器分配一个可写层,此可写层是该容器独有的,所有对容器的操作,都会保存在该层里面,只有在写的时候,才会为可写层分配内存,从而在很大程度上节约了内存空间。

2.yum安装nginx服务

1  yum install epel-release
    2  yum install nginx -y
           

尝试启动nginx服务

nginx
           

再去访问网站,发现页面如下:

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

然后观察容器中存放页面的文件,发现容器中的index.html文件是一个链接文件,且指向的是…/…/HTML/index.html文件,并且该文件是红色标志,表示源文件不存在,我猜测可能原因:1.yum安装的nginx使用了卷的概念,默认将卷挂载到该目录下 2.可能是由于在容器中运行nginx,因为容器本身就是依附于其宿主机提供服务的,其本身就做了一层端口映射,所以可能nginx也自动做了链接文件的操作

此时将index.html文件删除,并重新新建一个首页文件

注意一定要删除之后新建,因为原来的index.html是软链接文件,不允许在没有目标文件的情况下进行修改

rm -rf /usr/share/nginx/html/index.html
vi index.html
           

文件内容如下:

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

此时再去访问网页,就会发现网页内容变成如下:

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

从而可以发现nginx能提供正常的服务,因此此时退出容器,将该状态封装成一个镜像

3.制作镜像

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

可用如下命令去查看自制镜像的信息:

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

4.验证

在容器中运行nginx,发现能正常访问

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

Dockerfile文件自制镜像

1.新建容器的配置文件

#新建文件夹,用来存放Dockerfile文件和一些依赖的包
[[email protected] ~]# mkdir nginx-yum
[[email protected] ~]# cd nginx-yum
#编写Dockerfile文件
[[email protected] nginx-yum]# vim Dockerfile
           

文件内容如下:

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

2.docker build制作镜像

制作成功会有如下显示,最后一行能够看到successfully,即显示镜像制作成功,并且可以看到镜像制作共用了5步,这是因为dockerfile文件里面有5行,每一行都对应了一步操作,且每一步操作都会生成一个镜像文件,如果构建镜像失败的话,修改dockerfile文件之后,默认会从上次制作镜像失败的地方开始制作,因为使用了dockerfile缓存,如果不想使用缓存,可以使用–no-cache选项。

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

3.验证

可以看到现在的本地镜像里面多了一个nginx-build镜像,即为docker build制作的镜像

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

使用该镜像启动容器:

然后访问网址,页面如下:

docker学习笔记-自制docker镜像docker commit方式去自制镜像Dockerfile文件自制镜像容器内编译安装nginx

4.对Dockerfile文件的说明

1.dockerfile的第一条指定必须是FROM,声明使用的基础镜像

2.每一条RUN指令都会创建一个新的镜像层,如果该指令执行成功,则会将该镜像层提交,之后继续执行Dockerfile文件中的下一条指令

3.关于RUN命令格式,有如下两种:

1.RUN yum install nginx -y
2.RUN ["yum","install" "-y","nginx"]
           
第一种格式是RUN命令默认的格式,会在shell里使用命令包装器/bin/sh -c来执行
第二种是exec格式的RUN指令,如果是在一个不支持shell的平台上运行或者不希望在shell中运行,则可以使用第二种格式

4.关于EXPOSE开放端口问题,处于安全问题的考虑,docker并不会自动打开端口,需要用户在使用docker run命令的时候指令需要打开的端口

容器内编译安装nginx

#1.运行一个centos7镜像的容器
docker run -t -i --name="hxynginx1" centos7 /bin/bash
#2. 解决安装nginx服务的依赖关系
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel wget
#3.安装pcre
#进入安装目录
cd /usr/local/src/
#拉取pcre的安装包
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
#解压安装包
tar zxvf pcre-8.35.tar.gz
#进入安装包
cd pcre-8.35
#进行编译安装
./configure 
make && make install
#验证是否安装成功
pcre-config --version
#4.安装nginx
#进入安装目录
cd /usr/local/src/
#拉取nginx安装包
wget http://nginx.org/download/nginx-1.6.2.tar.gz
#解压安装包
tar zxvf nginx-1.6.2.tar.gz
#进入安装目录
cd nginx-1.6.2
#进行安装设置
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
#开始安装
make && make install
#验证是否安装成功
/usr/local/webserver/nginx/sbin/nginx -v