内容简介:在前面我们讲解了基于已有的Dockerfile是由多行命令语句组成的,并且在文件中支持以 # 开始的注释行。我们一般将Dockerfile文件分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。其中,第一行(不包含注释行)必须指定基于的基础镜像,例如:FROM ubuntu。之后可以是维护者信息,如:MAINTAINER gongziqi 14155830994@qq.com。再往后可以是镜像的操作指令,如:RUN echo "deb
在前面我们讲解了基于已有的 镜像容器创建和基于本地模板导入 两种方式来创建镜像,在这里我们就来说说第三种创建镜像的方式。Dockerfile是一个文本格式的配置文件,我们可以通过Dockerfile快速创建自定义的镜像。
一、基本结构
Dockerfile是由多行命令语句组成的,并且在文件中支持以 # 开始的注释行。我们一般将Dockerfile文件分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。其中,第一行(不包含注释行)必须指定基于的基础镜像,例如:FROM ubuntu。之后可以是维护者信息,如:MAINTAINER gongziqi 14155830994@qq.com。再往后可以是镜像的操作指令,如:
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
最后可以是容器启动时执行指令,如:CMD /usr/sbin/nginx。
# 0. 在ubuntu镜像的基础上,安装inotify-tools/nginx/apache2/openssh-server等,创建新的Nginx镜像 # Nginx # VERSION 1.0 FROM ubuntu MAINTAINER gongziqi 1415583094@qq.com RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server # 1. 在ubuntu镜像基础上,安装firefox/vnc。启动后,用户可通过5900端口通过vnc方式使用firefox # FireFox over VNC # VERSION 1.0 FROM ubuntu RUN apt-get update && apt-get install -y x11vnc xvfb firefox RUN mkdir ./.vnc RUN x11vnc -storepasswd 123456 ~/.vnc/passwd RUN bash -c 'echo "firefox" >> /.bashrc' EXPOSE 5900 CMD ["x11vnc","-forever","usepw","-create"]
二、指令
1、FROM
语法为:FROM
2、MAINTAINER
语法:MAINTAINER
3、RUN
语法:RUN
4、CMD
支持三种方式:
-
CMD ["executable", "param1", "param2"],使用 exec执行,推荐方式。
-
CMD command param1 param2,在 /bin/sh 中执行,提供给需要交互的应用。
-
CMD ["param1","param2"],提供给 ENTRYPOINT的默认参数。
指定启动容器时执行的命令,每个Dockerfile只能由一条 CMD命令。若指定多条,则只有最后一条有效。若在启动容器时,指定了运行的命令,则CMD命令将会被覆盖。
5、EXPOSE
语法:EXPOSE
6、ENV
语法:ENV
ENV PG_MAJOR 9.3 ENV PG_VERSION 9.3.4 RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ... ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
7、ADD
语法:ADD
8、COPY
语法:COPY
9、ENTRYPOINT
语法:ENTRYPOINT ["executable","param1","param2"] 或 ENTRYPOINT command param1 param2(shell中执行)。配置容器启动后执行的命令,并且不可被docker run 提供的参数覆盖。每个Dockerfile只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
10、VOLUME
语法:VOLUME ["/data"]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
11、USER
语法:USER daemon。指定运行容器时的用户名或UID,后续的RUN指令也会使用指定用户。当服务不需要管理员权限时,可通过该命令指定运行用户,并且可以在之前创建所需要的用户。如:RUN groupadd -r postgres && useradd -r -g postgres postgres。若此时需要临时获取管理员权限,则可使用gosu,不推荐使用sudo。
12、WORKDIR
语法:WORKDIR /path/to/workdir。为后续的 RUN、CMD、ENTRYPOINT指令配置工作目录。可使用多个WORKDIR,若后面的WORKDIR指定的是相对路径,则是基于前一个WORKDIR指定的路径。如:
WORKDIR /a WORKDIR b WORKDIR c RUN pwd # 结果为:/a/b/c
13、ONBUILD
语法:ONBUILD [INSTRUCTION]。配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。如:Dockerfile使用如下的内容创建了镜像 image-A。
[...] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src [...]
若基于image-A创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行 ONBUILD 指令内容,即等价于在 FROM指令后添加了以上的两条指令。在使用ONBUILD指令的镜像,我们推荐在标签中注明,如:ruby:1.9-onbuild。
三、创建镜像
在编写完Dockerfile之后,可以通过 Docker build 命令来创建镜像。语法为:docker build [选项] 路径,即读取指定路径下的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此我们建议放置Dockerfile的目录为空目录。若为非空目录,希望忽略路径下的某些目录或文件,可通过 .dockerignore文件来配置。
# 指定Dockerfile路径所在路径为 /tmp/docker_builder/,希望生成镜像标签为 build_repo/first_image, # 在标签命名时需要注意,所有字母必须为小写 $ sudo docker build -t build_repo/first_image /tmp/docker_builder/
四、一个实例
根据以上信息,我们来自己创建一个Nginx镜像。
# 0. 创建Dockerfile所在目录 $ sudo mkdir /opt/tmp_dockerbuilder # 1. 创建Dockerfile文件并编写内容 $ sudo vim Dockerfile # Nginx # VERSION 1.0 FROM ubuntu MAINTAINER gongziqi 1415583094@qq.com RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server # 2. 查看当前本地镜像 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE # 3. build Dockerfile文件,创建镜像 $ sudo docker build -t nginx/mynginx /opt/tmp_dockerbuilder/Dockerfile Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu ---> 4e5021d210f6 Step 2/3 : MAINTAINER gongziqi 1415583094@qq.com ---> Running in 8dc5269da475 Removing intermediate container 8dc5269da475 ---> e27af3f3a447 Step 3/3 : RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server ---> Running in 2ec0f5b9fc81 ........ ........ ........ Successfully built d27de6c7896d Successfully tagged nginx/mynginx:latest # 4. 再次查看本地镜像 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx/mynginx latest d27de6c7896d 6 minutes ago 275MB # 5. 以当前创建的镜像运行容器 $ sudo docker run -ti d27de6c7896d /bin/bash root@a505965d1b84:/# # 6. 查看当前的容器中是否有我们刚才需要安装的相关软件 root@a505965d1b84:/# find / -name apache2 /etc/cron.daily/apache2 /etc/init.d/apache2 /etc/logrotate.d/apache2 /etc/apache2 /etc/ufw/applications.d/apache2 find: '/proc/1/map_files': Operation not permitted find: '/proc/12/map_files': Operation not permitted /usr/lib/apache2 /usr/sbin/apache2 /usr/share/bug/apache2 /usr/share/doc/apache2 /usr/share/lintian/overrides/apache2 /usr/share/apache2 /var/cache/apache2 /var/lib/apache2 /var/log/apache2 # 7. 查看ubuntu镜像运行的容器中是否有apache2 $ sudo docker run -tid ubuntu /bin/bash $ sudo docker exec -ti 6df8ff14f57f /bin/bash root@6df8ff14f57f:/# find / -name apache2 find: '/proc/1/map_files': Operation not permitted find: '/proc/10/map_files': Operation not permitted find: '/proc/19/map_files': Operation not permitted root@6df8ff14f57f:/# # 说明:我们会发现刚才的配置的 apache2 软件已被安装,而基于的 ubuntu镜像本身是没有apache2的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【自定义】通过Dockerfile创建httpd镜像
- 使用Jib快速简便地创建Docker镜像
- Docker创建MySQL镜像并成功进行远程连接
- docker利用Dockerfile创建镜像,上传docker hub
- 创建优化的 Go 镜像文件以及踩过的坑
- 创建基于Java 11的SpringBoot Docker镜像到48M!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。