docker学习笔记-自制docker镜像


构建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账号,能够共享和发布镜像
[root@docker-learning-centos7 ~]# docker login

在这里插入图片描述

docker commit方式去自制镜像

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

1.启动centos7的容器镜像

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

[root@docker-learning-centos7 ~]# docker run -i  -t  --name "nginxcommit"  -p 8080:80  centos:7 /bin/bash 

2.yum安装nginx服务

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

尝试启动nginx服务

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

文件内容如下:
在这里插入图片描述

此时再去访问网页,就会发现网页内容变成如下:
在这里插入图片描述

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

3.制作镜像

[root@docker-learning-centos7 ~]# docker commit -m "nginx"  -c'CMD ["nginx"]' 870506cbbd4d nginx-commit1


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

[root@docker-learning-centos7 ~]# docker  inspect nginx-commit1

在这里插入图片描述

4.验证

[root@docker-learning-centos7 ~]# docker run -i  -t  --name "nginxtest1"  -p 8082:80  nginx-commit1 /bin/bash 

在容器中运行nginx,发现能正常访问
在这里插入图片描述

Dockerfile文件自制镜像

1.新建容器的配置文件

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

文件内容如下:
在这里插入图片描述

2.docker build制作镜像

[root@docker-learning-centos7 nginx-yum]# docker build -t "nginx-build" .

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

3.验证

可以看到现在的本地镜像里面多了一个nginx-build镜像,即为docker build制作的镜像
在这里插入图片描述
使用该镜像启动容器:

[root@docker-learning-centos7 nginx-yum]# docker run -d -p 8083:80 --name "nginxtest2" nginx-build 

然后访问网址,页面如下:
在这里插入图片描述

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值