构建docker镜像有两种方法:
- 使用docker commit命令创建
- 使用docker build和dockerfile创建
一般来说我们创建的镜像都是基于一个现有的镜像,在此基础上对现有的镜像进行二次开发,达到我们想要的镜像。如果真的想从零构建一个全新的镜像,可以参考https://docs.docker.com/engine/userguide/eng-image/baseimages/。这里推荐使用dockerfile来创建新的镜像。
首先说说docker commit创建镜像:
docker commit创建镜像是向一个现有的镜像中提交变更,就想修改代码一样,最后再将变更后的镜像提交成一个新的镜像。完成变更后使用docker commit命令就可以提交新的镜像:
docker commit详解:
格式:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]
Options:
-a, --author string 指定作者信息
-c, --change list 将dockerfile指令应用到创建的镜像
-m, --message string 提交消息
-p, --pause 提交过程中暂停容器
如果想从刚创建的镜像运行一个容器,可以使用docker run命令:
# docker run -t -i [REPOSITORY[:TAG] /bin/bash
dockerfile创建镜像
dockerfile 使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像。使用dockerfile构建镜像时首先要创建一个名为dockerfile的文件,在此文件中使用DSL语法指令构建docker镜像。
dockerfile指令:
- FROM 指定基础镜像
格式:FROM registry:[tag]
FROM registry@digest
在dockerfile中FROM必须放在第一个非注释行。- MAINTAINER 指定作者信息
- LABEL 指定元数据
- COPY 将工作目录下的文件复制到所做得镜像中的文件系统中
格式:COPY <src> <dest>- ADD 和COPY都具有复制的功能但ADD可以将复制过来的tar包进行解压,也可以从网络位置下载一个包,但是下载的tar包是不会解压的。
格式:ADD <src> <dest>- WORKDIR 设置镜像的工作目录,相当于执行cd
- VOLUME 指定数据卷的挂在点
- EXPOSE 实现暴露容器的端口
格式:EXPOSE PORT/[PROTOCOL]- ENV 设置环境变量
格式:ENV var value
ENV var1=value1 var2=value2 …- RUN 基于镜像要构建容器是要执行的命令
- CMD 定义容器启动以后要默认运行的程序,pid为1的程序
格式:CMD <命令> 相当于执行的是/bin/sh -c 命令,也相当于执行exec来运行命令
CMD ["<命令>", “<参数>”, “<参数>”]
CMD ["<参数>", “<参数>”] <<< 需要借助于ENTRYPOINT指令- ENTRYPOINT 定义容器启动以后要默认运行的程序,pid为1的程序.
注意:
在运行RUN的时候所执行的命令无法覆盖ENTRYPOINT中的命令
RUN 后面的命令会被以参数的方式追加到原本要执行的命令的末尾,而不是替换
基于一个镜像,在创建容器的时候,通过传递不同的参数实现创建不同的容器
以上就是dockerfile中常用的一些指令,创建好dockerfile文件就开始构建镜像
cd filename >>>进入镜像的工作目录
docker build -t="test/static_web" . >>> -t指定新镜像的仓库和名称, . 指当前目录也可以使用工作目录的绝对路径
这样我们就构建好了一个全新的镜像。以下是我自己的dockerfile文件:
# base image
FROM centos
# MAINTAINER
MAINTAINER json_hc@163.com
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio \
--with-http_ssl_module --with-http_realip_module --with-http_addition_module \
--with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module \
--with-http_sub_module --with-http_dav_module --with-http_flv_module \
--with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module \
--with-http_auth_request_module --with-http_random_index_module \
--with-http_secure_link_module --with-http_degradation_module \
--with-http_stub_status_module && make && make install
EXPOSE 80