0x02 Docker 初探Dockerfile

引入

本篇讲了Dockerfile中常用的命令,并在文末简单介绍了一下将本地镜像推送到Docker Hub的方法

开始

构建简易服务器

构建Dockerfile

我们首先来看一个Dockerfile的例子

FROM ubuntu:14.04
MAINTAINER James Turnbull "james@example.com"
RUN apt-get update
RUN apt-get install nginx -y
RUN echo 'Hi, I am in your container' > /var/www/html/index.html
EXPOSE 80

注:每条指令(如FROM)都必须为大写字母,且后面要跟随一个参数

语句分析

FROM : 指定一个已存在的镜像(基础镜像)
MAINTAINER : 标明镜像的作者及作者的邮件地址
RUN : 在当前镜像中运行指定命令(构建容器时运行)
EXPOSE : 指定该容器内应用程序所使用的端口

使用Dockerfile构建新镜像

docker build -t="[仓库名]/[镜像名]:[标签]" [上下文路径]

上下文即为存放dockerfile的文件夹,也称构造环境或构建上下文

有时还会用到--no-cache : 略过缓存功能

构造完成后就可以使用docker images来查看我们新构造的镜像文件了

使用新镜像

① 将容器端口映射到宿主机上(随机选择宿主机端口进行映射)

docker run -d -p 80 --name nginx_test r0co/test:aaa nginx -g "daemon off;"

参数说明

-p : 指定容器向外界公开的端口
-P : 指定容器向外界公开的端口为80

可使用docker ps来查看容器端口分配情况

也可使用docker port [UUID] [想查看的端口号]

② 选择指定宿主机端口进行映射

docker run -d -p 8080:80 --name nginx_port_123 r0co/test:aaa nginx -g "daemon off;"

之后就可以访问宿主机的8080端口来查看容器所呈现的内容了

Dockerfile常用命令

CMD

作用: 指定一个容器启动时要运行的命令

举例:

CMD ["/bin/bash"] 

注意:

① 在Dockerfile中只能指定一条CMD指令,若指定多条指令,则只有最后一条CMD会执行

② 若在docker run中指定了命令,则容器只会运行docker run中指定的命令,例如

docker run -ti [某镜像] /bin/sh -c "echo 1"

则容器在启动时只会执行/bin/sh -c "echo 1"

ENTRYPOINT

将默认的/bin/sh -c改为你需要的内容

例如启动nginx

若不使用ENTRYPOINT,写法如下

docker run -d [镜像] nginx -g "daemon off;"

容器中实际执行的命令为:/bin/sh -c nginx -g "daemon off;"

若在dockerfile中加上EXTRYPOINT ["/usr/sbin/nginx"],则可以这么写

docker run -d [镜像] -g "daemon off;"

容器中实际执行的命令为:/usr/bin/nginx -g "daemon off;"

WORKDIR

在容器中切换到指定目录

WORKDIR ["/var/www/html"]

ENV

设置环境变量

举例如下

ENV TEST /var/www/html
WORKDIR $TEST    

上述语句跟WORKDIR ["/var/www/html"]效果一样

USER

指定该镜像会以什么样的用户去运行

举例:基于该镜像启动的容器会以nginx用户的身份来运行

USER nginx

VOLUME

向基于镜像创建的容器添加卷

VOLUME ["/opt/project"]

ADD

作用: 将构建环境下的文件和目录复制到镜像中

举例:将a.txt复制到镜像中的/tmp目录下

ADD a.txt /tmp/a.txt

注;

① 不能将构建目录之外的文件进行ADD操作

② Docker通过判断目的地址参数末尾是否为/来判断文件源是目录还是文件

③ 若文件源为归档文件(gzip、bzip2、xz),则在移动时自动解包

例如

ADD test.tar.gz /tmp/

则test.tar.gz会解压到/tmp/目录下

④ 文件源可使用URL格式,ADD https://example.com/a.txt /tmp/a.txt

COPY

作用类似于ADD,不过在移动文件时不会自动解包

COPY a.txt /tmp/a.txt

注:

① 任何处于构建环境之外的东西都是不可用的(即无法复制构建环境外的东西)

② 目的位置必须为容器内的绝对路径

③ 若目的位置不存在,则Docker会自动创建文件夹

ONBUILD

当一个镜像被用作其他镜像的基础镜像时,该镜像中的触发器将会被执行(即ONBUILD命令会被执行)

parent/dockerfile如下;

FROM ubuntu:latest
ONBUILD RUN ["echo","This is parent"]

child/dockerfile如下:

FROM parent:test
CMD ["echo","This is child"]

分别生成它们的镜像

docker build -t="parent:test" parent/
docker build -t="child:test" child/

其中,命令docker build -t="child:test" child/的输出如下

注意:

① ONBUILD只能被继承一次

② 为防止递归,FROM、MAINTAINER和ONBUILD本身不允许在ONBUILD中使用

推送本地镜像到Docker Hub

docker login
docker push [你的ID]/[镜像名]

如果我的文章能帮到您的话我会很开心.如需转载记得注明出处:)
目录