Docker构建镜像(Dockerfile 和docker-commit)

Docker构建镜像

简介:最近研究了一波docker的镜像制作,因此本文特和大家分享交流常用的两种docker镜像的制作方式。为了对本文有个直观的理解,废话不多说,先上图:(由于太穷画出图没法去除水印效果,凑合看吧,哈哈)
Docker构建镜像(Dockerfile 和docker-commit)_第1张图片
简而言之, 使用docker commit制作镜像是直接进入到基础镜像中,命令行修改或者安装对应软件及配置,修改完后使用docker commit进行保存。而当我们把上述修改的一条条的指令写到一个文本文件中,之后再根据这个文件便可以快速构建出我们所需要的镜像,而这个文件就是Dockerfile。这样最大的好处就是这个文本记录了对基础镜像的所有修改操作,可以很好的重复出来。话不多说,直接进入正题吧。

1. 使用docker commit制作镜像

1.1 使用docker 拉取一个基础镜像:

例如我们想要基于ubuntu系统搞事情,可以使用

docker pull ubuntu:13.10

或者 centos

docker pull centos7.5.1804

运行后使用docker images 便可以看到centos7.5.1804的镜像了
在这里插入图片描述
关于镜像可以从 Docker Hub 网站 来搜索,也可以 使用docker search 命令来搜索

1.2 使用镜像创建容器

例如我们在上面拉取了一个 centos7.5.1804的基础镜像,想使用该镜像:

docker run \  # 运行主命令
 --privileged \  #指定容器是否为特权容器,特权容器拥有所有的权限
 --restart=always \  #指定容器停止后的重启策略:always-容器退出时总是重启  
-v /data/:/data/ \  # 给容器挂载存储卷,挂载到容器的某个目录,这样容器才能访问外部磁盘/data
 -i \ #用于控制台交互
 -t \ #分配tty设备,该可以支持终端登录
 -d \ # 指定容器运行于前台还是后台 默认为后台
-h centos7.5 \  #指定容器的主机名
--name centos7.5.1804-it \  #指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
-u root \  # 指定容器的用户
centos:7.5.1804  # 拉取的镜像名:TAG 

这样,创建了一个名为centos7.5.1804-it的容器,使用docker ps -a 便可以查看容器。
附:容器和镜像的删除

docker rm -f <CONTAINER ID> # 删除容器
docker rmi <IMAGE ID>  #删除镜像

1.3 进入容器,根据需要安装软件和修改配置

接着,我们进入容器

docker exec -it centos7.5.1804-it /bin/bash

接下来就是linux 的基本操作了,相信大家都很熟悉,而且作为root用户的你,简直可以对他为所欲为,哈哈哈哈。
例如:

yum -y install perl  #安装perl
yum -y install gcc  #安装gcc
yum -y install make  #安装make
ln -s /usr/bin/convert /bin  #软链接

1.4 使用docker commit 进行保存

上述我们在容器中进行了一系列骚操作,我们想把这些操作保存到镜像里头,这样我们后面使用该镜像的时候,就不需要重新操作了。

docker commit -m "centos7.5.1804 init 1.0.0"  centos7.5.1804-it  centos:7.5.1804
# -m 提交时的说明文字,大致写一下即可
# centos7.5.1804-it  容器名称
# centos:7.5.1804 更新后的镜像名称:TAG ; 若和前面的镜像名一样则前面的镜像名会变为NONE

这样,就可以修改后的镜像就做成了,
可以使用docker save 保存镜像为tar包了

docker save centos:7.5.1804 > centos.tar

附: 保存的tar包如何使用

docker load -i centos.tar 

2. 使用Dockerfile制作镜像

使用docker commit 制作镜像后,Dockerfile就比较好理解了,所谓的Dockerfile其实就是记录上面修改操作的文件。当然为了规范文件的书写格式,Dockerfile规定了一系列指令,下面主要的目的也还是简单介绍不同的指令对应的含义。

2.1. 制作Dockerfile

为了方便,不如看个示例,从实例中可能看的会直观些

#FROM 指定基础镜像centos7.5.1804(即上述我们需要拉取的基础镜像)
FROM centos:centos7.5.1804   

#MAINTAINER 指定镜像维护者信息邮箱
MAINTAINER "Xinruzhishui "

#COPY  进行拷贝/复制操作,例如拷贝当前目录下的pipelines/ 到镜像中的/usr/pipelines/路径下
COPY  pipelines/ /usr/pipelines/

#RUN 指定运行的程序/命令
RUN yum -y install perl
RUN yum -y install gcc
RUN yum -y install make
RUN yum -y install ImageMagick
RUN ln -s /usr/bin/java /bin/
RUN ln -s /usr/*.so  /lib64/ 

#WORKDIR 指定RUN、CMD、ENTRYPOINT、COPY和ADD的工作目录
WORKDIR /usr/local/install  #设定当前目录为/usr/local/install
RUN tar -xzf gnuplot-5.2.8.tar.gz  # 在/usr/local/install下 解压gnuplot-5.2.8.tar.gz
RUN rm -r gnuplot-5.2.8.tar.gz  # 在/usr/local/install下 删除gnuplot-5.2.8/
WORKDIR /usr/local/install/gnuplot-5.2.8/
RUN ./configure  #编译
RUN make && make install #编译安装

#VOLUME 指定创建挂载点目录 
VOLUME /data/

#EXPOSE 打开指定要监听的端口80
EXPOSE 80/tcp

#ENV 指定环境变量
ENV PATH=/usr/local/test/bin 

#USER 指定的程序时的用户名或UID
USER 1000 

这里列举了一些常用的指令,详细的可参考

  1. docker refference
  2. Docker系列07—Dockerfile 详解

2.2. 使用dockerfile构建镜像

撰写好上述Dockerfile,接着便可以使用docker build构建镜像了

docker build  -f Dockerfile -t centos:7.5.1804 .
#-f 指定Dockerfile 文件的位置
#-t 创建的镜像名
# . 当前目录

至此,dockerg构建镜像的过程就基本结束… 溜了溜了

参考:
docker refference
Docker系列07—Dockerfile 详解
Docker 教程

你可能感兴趣的:(Docker构建镜像(Dockerfile 和docker-commit))