Docker 构建镜像

栏目: 编程工具 · 发布时间: 5年前

内容简介:文章首发于微信公众号《程序员果果》地址:构建Docker镜像有以下两种方法:

文章首发于微信公众号《程序员果果》

地址: mp.weixin.qq.com/s/foVeANf0i…

构建 Docker 镜像有以下两种方法:

  • 使用docker commit命令,从容器创建一个新的镜像。
  • 使用docker build命令和 Dockerfile 文件。

一、通过commit命令创建镜像

语法

docker commit 容器ID:tag
复制代码

OPTIONS说明:

  • -a :提交的镜像作者;

  • -c :使用Dockerfile指令来创建镜像;

  • -m :提交时的说明文字;

  • -p :在commit时,将容器暂停。

实例

我们获取一nginx的镜像,修改nginx的欢迎页面,之后重新构建成新镜像。

#下载镜像
docker pull nginx
#运行镜像
docker run -it -d -p 81:80  --name mynginx nginx
复制代码

我们访问127.0.0.1:81 如下:

Docker 构建镜像

下载我们来修改nginx的欢迎页

#进入容器
docker exec -it mynginx /bin/bash
#更新源
apt-get update
#安装vim
apt-get install -y vim
#修改欢迎页的title为 "Welcome to nginx , ha ha ha!"
复制代码

我们刷新访问127.0.0.1:81如下:

Docker 构建镜像

那么现在修改把修改过的容器,重新构件成新的镜像。

docker commit -a "程序员果果" -m "my nginx" mynginx:v1
复制代码

之后,我们查看下本地镜像列表,可以发现已经存在我们构件的新镜像。

Docker 构建镜像

二、通过 Dockerfile 创建镜像

我们先看个Dockerfile文件实例:

# Version: 0.0.1
FROM ubuntu:latest
MAINTAINER gf "gf@163.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html
EXPOSE 80
复制代码
构建
docker build -f /path/Dockerfile
复制代码

Dockerfile由一系列指令和参数组成。每条指令都必须为大写字母,切后面要跟随一个参数。Dockerfile中的指令会按照顺序从上到下执行,所以应该根据需要合理安排指令的顺序。每条指令都会创建一个新的镜像层并对镜像进行提交。Docker大体上按照如下流程执行Dockerfile中的指令。

Dockerfile构建构过程:

  • 从基础镜像运行一个容器
  • 执行一条指令,对容器做出修改
  • 执行类似docker commit 的操作,提交一个新的镜像层
  • 再基于刚提交的镜像运行一个新容器
  • 执行Dockerfile中的下一条指令,直至所有指令执行完毕

从上面可以看出,如果你的Dockerfile由于某些原因(如某条指令失败了)没有正常结束,那你也可以得到一个可以使用的镜像。这对调试非常有帮助:可以基于该镜像运行一个具备交互功能的容器,使用最后创建的镜像对为什么你的指令会失败进行调试。

Dockerfile也支持注释。以#开头的行都会被认为是注释,# Version: 0.0.1这就是个注释。

Dockerfile指令

1. FROM

指定基础镜像,必须为第一个命令。

格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM mysql:5.6
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
复制代码

2. MAINTAINER

维护者信息

格式:
    MAINTAINER <name>
示例:
    MAINTAINER san zhang
    MAINTAINER zhangsan@163.com
    MAINTAINER zs<gf@163.com>
复制代码

3. RUN

构建镜像时执行的命令。

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:

格式:
    用法1(shell模式) RUN <command>
    用法1(exec模式) RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
复制代码

4. ADD

将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源,类似wget。

格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
复制代码

5. COPY

功能类似ADD,但是不会自动解压文件,也不能访问网络资源。

格式:
    COPY <src>... <dest>
    COPY ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    COPY hom* /mydir/          # 添加所有以"hom"开头的文件
    COPY hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    COPY test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    COPY test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
注:
	如果单纯复制文件,Docker 推荐适用COPY
复制代码

6. ENTRYPOINT

配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

格式:
    用法1(exec模式) ENTRYPOINT ["executable", "param1", "param2"]
    用法2(shell模式) ENTRYPOINT command param1 param2
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
注:
   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
    所以可以指定ENTERYPOINT和CMD组合使用 通过ENTERYPOINT指定命令,CMD指定命令的参数
复制代码

7. CMD

指定容器运行时的命令。

格式:
	用法1(exec模式) ENTERYPOINT ["executable" , "param1" , "param2"] 
	用法2(shell模式) ENTERYPOINT command param1 param2
示例:
	CMD [ "sh", "-c", "echo $HOME" ]
复制代码

8. EXPOSE

指定运行改镜像的容器使用的端口。

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
注:
  但是docker 容器处于安全的考虑并不会打开指定端口,而是需要在使用的时候 ,通过 -p 打开
	例如 $docker run -p 80 -d huanchupk/df_test1 nginx -g "daemon off"
复制代码

9. ENV

设置环境变量。

格式:
    ENV <key> <value>
    ENV <key>=<value> ...
示例:
    ENV myName gf
    ENV myAddress shanghai
复制代码

10. VOLUME

向容器中添加卷(指定持久化目录)。

格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
	1. 卷可以容器间共享和重用
	2. 容器并不一定要和其它容器共享卷
	3. 修改卷后会立即生效
	4. 对卷的修改不会对镜像产生影响
	5. 卷会一直存在,直到没有任何容器在使用它
复制代码

11. WORKDIR

从镜像创建一个新容器时,在容器中设置工作目录(类似于cd命令)。

格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
    WORKDIR b  (这时工作目录为/a/b)
    WORKDIR c  (这时工作目录为/a/b/c)
注:
  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
复制代码

12. USER

镜像由什么用户执行,如果不指定默认以root用户执行。

格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

 示例:
  USER www
 注:
  使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
复制代码

13. ARG

用于指定传递给构建运行时的变量。

格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www
复制代码

14. ONBUILD

用于设置镜像触发器。

格式:
  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
  当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发
复制代码

Dockerfile 实例

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

#MAINTAINER 维护者信息
MAINTAINER tianfeiyu 

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]
复制代码

最后用一张图解释常用指令的意义:

Docker 构建镜像

参考资料:Dockerfile文件详解

欢迎扫码或微信搜索公众号《程序员果果》关注我,关注有惊喜~

Docker 构建镜像

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Django 1.0 Template Development

Django 1.0 Template Development

Scott Newman / Packt / 2008 / 24.99

Django is a high-level Python web application framework designed to support the rapid development of dynamic websites, web applications, and web services. Getting the most out of its template system a......一起来看看 《Django 1.0 Template Development》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

html转js在线工具
html转js在线工具

html转js在线工具