构建Docker镜像 Dockerfile文件编写

构建镜像有两种方式

        使用docker commit命令

        使用docker build命令和Dockerfile文件

commit命令构建镜像

 commit命令构建镜像,在开启的容器中做出修改,在使用docker commit命令提交,就可以将修改后的镜像提交为一个新镜像,例如             

$ sudo docker run -it ubuntu /bin/bash
root@5e4e2be4724a:/# apt-get update && aptget install vim
root@5e4e2be4724a:/# exit

启动了一个ubuntu镜像,并在里面安装了vim,然后退出,使用commit提交

$ sudo docker commit 5e4e2be4724a name/vim
sha256:a82648aa5c91c46752b88635359ee62d505ddfb6d96828881db55314a00ef913
$ sudo docker images name/vim
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
name/vim            latest              a82648aa5c91        About a minute ago   163MB

commit后面可以有参数 -m表示用了指定新创建的镜像的提交信息  -a用来列出镜像的作者信息

$ sudo docker commit -m "a new images" -a "author" 5e4e2be4724a name/vim:v0
sha256:245265bd7c8906511f8f1c9ff7baf72c3929340b219bc6e6990234c3bf323679

Dockerfile构建镜像

首先Dockerfile存放在文件夹中,这个文件夹称为上下文环境,Docker在构建镜像时会将上下文也就是目录以及上下文中的文件和目录上传到Docker守护进程中,这样Docker守护进程就可以访问用户想在镜像中存储的任何代码、文件等。

一个小例子

#Version:0.01
FROM ubuntu:18.04
MAINTAINER Name "123456@qq.com"
RUN apr-get update && apt-get install -y nginx
RUN echo 'Hello,Docker images'>//usr/bginx/gtml/index.html
EXPOSE 8080

Dockerfile会按照从上到下的顺序执行一系列指令,每条指令创建一个新的镜像层并执行类似commit提交一个新镜像层,知道所有指令全部执行完成。其中某一条指令失败,也会得到一个基于最后执行成功的指令创建的镜像。因为docker会将之前的镜像层看做缓存,如果修改中间某一步,docker会从修改地方开始运行。不需要缓存的话可以使用build --no-cache选项。

也可以设置一个环境变量表示时间,当修改时间时,docker就会从修改的位置往下执行

FROM ubunt 01 [buffer]    
MAINTAINER 04 [buffer]    .com"
ENV REFRESHED_AT 2018-01-01
RUN apr-get update && apt-get install -y nginx

Docker的第一条指令必须是FROM。FROM指令指定一个已经存在的镜像,之后的指定就基于该镜像执行。MAINTAINER指令表明镜像的作者和邮箱。RUN指令在当前构建的镜像中运行指定的命令,例如apt-get install。默认RUN在shell里使用/bin/sh -c来执行,如果不希望在shell中执行可以使用exec格式的RUN指令,例如 RUN["apt-get","install","-y","nginx"]。EXPOSE公开容器的端口。

docker build命令 运行Dockerfile构建一个新镜像

sudo docker build -t="name/web" .

-t选项表示为新镜像设置仓库名和名称 ,上面命令中有个" . "表示当前目录,不要忘记

sudo docker history <ID> 可以看到构建的每一步

Dockerfile指令

1、CMD   

CMD指令用于指定一个容器启动时要运行的命令。

例如CMD  ["/bin/bash"]  或者CMD ["/bin/bash","-l"]给CMD指令传参 ,这样在用run启动容器时就不用写"/bin/bash"参数了
$sudo docker run -it nameregistry/test
root@f453e7683526:/#
docker run后并未指定命令也使用了 /bin/bash果docker run 指定了命令例如/bin/ps ,则/bin/ps会覆盖/bin/bash
另外在Dockerfile中只能指定一条CMD指令,如果指定多条,也只有最有一条会被使用

2、ENTRYPOINT

ENTRYPOINT指令和CMD指令类似
例如 ENTRYPOINT ["/usr/sbin/nginx"] 或 带有参数的 ENTRYPOINT 

["/usr/sbin/nginx","-g","daemon off;"]

不同的地方是ENTRYPOINT指令提供的命令不容易在容器启动时被覆盖(使用--entrypoint标志可以覆盖ENTRYPOINT指令)。而且docker run 命令中指定的参数会传递给ENTRYPOINT指定中的命令,当我们在Dockerfile中写上ENTRYPOINT["/usr/sbin/nginx"],build构建新镜像后使用docker run

sudo docker run -t -i nameregistry/web -g "daemon off;"

-g "daemon off;"参数会传递给ENTRYPOINT,完整的命令就是/usr/sbin/nginx  -g “daemon off;"
ENTRYPOINT和CMD指令可以组合使用,例如

ENTRYPOINT ["/usr/sbin/ngix"]
CMD ["-h"]

如果在启动容器时指定参数 -g "daemon off;" 就是执行/usr/sbin/nginx -g “daemon off;";如果不指定就会执行/usr/sbin/nginx -h。这样镜像即可以运行一个默认的命令又可以通过docker run指定可覆盖的选项或标志

3、WOEKDIR

WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT 或CMD指定的程序会在这个目录下执行,可以为Dockerfile中后续指令设置工作目录,也可以为最终的容器设置工作目录。

WORKDIR /opt/webapp/db
RUN bundle install 
EORKDIR /opt/webapp
ENTRYPOINT["rackup"]

  -w标志可以在运行时覆盖工作目录

$sudo docker run -it -w /var/log buntu pwd
/var/log

工作目录变成了/var/log

4、ENV

设置环境变量
例如 ENV RVM_PATH /home/rvm/
设置的环境变量会被持久的保存到镜像所创建的所有容器中,可以用env命令查看
docker run -e标志也可以来传递环境变量,但是这个变量只能在运行时有效
sudo docker run -it -e "PORT=8080" ubuntu env

5、USER

用来指定镜像会以什么的样的用户来运行,如果不使用USER默认用户为root

6、VOLUME

用来向基于镜像创建的容器添加卷,卷就是在容器内的特定的目录,卷在各容器内是共享的

VOLUME ["/OPT/PROJECT"] 或 VOLUME ["/opt/project","/data"] 指定多个卷

 这条指令会为基于此镜像创建的任何容器创建一个名为/opt/project的挂载点。

7、ADD

用来将构建环境下(dockerfile文件所在的目录)的文件和目录复制到镜像中

ADD software.lic /opt/application/software.lic

将文件software复制到镜像中的指定位置。指向源文件的位置可以是一个URL,或者构建上下文或环境中文件或者目录。Docker会通过目的地址参数末尾的字符是否是/ 来判断文件源是文件还是目录 。ADD还会将归档文件解开到目的地址。另外,ADD指令会使后续指令不能继续使用之前的构建缓存

8、COPY

类似与ADD,但COPY只关心在构建上下文中复制本地文件,不会解压和提取,目的位置不存在,会自动创建目录结构,类似mkdir -p命令

9、LABEL

为Docker镜像添加元数据,元数据是以键值对的形式

LABEL version="1.0" TIME="Day Year" type="Data Center"

10、STOPSIGNAL

用来设置发送什么系统调用信号给容易从而停止容器,比如9或SIGKILL

11、ARG

用来定义可以在docker build命令运行时传递给构建运行时的变量,只需要在构建时使用--build-arg标志。

ARG build
ARG web_user=user

上面设置了两个变量,第二个默认值是user

sudo docker buold --build-arg build=1234 -t  name/web .

Docker 预定义了一组ARG变量,可以构建时直接使用,不用在Dockerfile中在定义

HTTP_PROXY   http_proxy
HTTPS_PROXY  https_proxy
FTP_PROXY     ftp_proxy
NO_PROXY      no_proxy

12、ONBUILD

为镜像添加一个触发器,当一个镜像被用做其他镜像的基础镜像时,触发器会被执行

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值