Dockerfile基础
Dockerfile分四部分组成: 基础镜像、维护者信息、镜像操作指令、启动时命令ps: 我的本地镜像已经有centos,若没有请使用docker pull centos入门例子
创建Dockerfile文件cd temp && vim Dockerfile
#若本地镜像没有centos请先使用`docker pull centos`
FROM centosMAINTAINER thewindkee thewindkee@163.com
RUN echo hi
在当前目录下执行docker build .效果:构建了一个centos镜像,并且输出了hiSending build context to Docker daemon 2.048 kB
Step 1/3 : FROM centos ---> 1e1148e4cc2c Step 2/3 : MAINTAINER thewindkee thewindkee@163.com ---> Running in aa0fbd3c9882 ---> fdeb2afefe47 Removing intermediate container aa0fbd3c9882 Step 3/3 : RUN echo hi ---> Running in f15e63f49e17 hi ---> b96f2a0acf5d Removing intermediate container f15e63f49e17 Successfully built b96f2a0acf5★含有nginx的例子
实际不需要这么麻烦,直接使用docker pull nginx即可,这里只是作为练习FROM centos
MAINTAINER thewindkee thewindkee@163.com
RUN yum install wget -y
# or ADD nginx.tar ~RUN wget http://nginx.org/download/nginx-1.14.2.tar.gzRUN tar -xvf nginx-1.14.2.tar.gz WORKDIR nginx-1.14.2RUN lsRUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxml2 libxml2-dev libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-develRUN useradd -M -s /sbin/nologin nginxRUN ./configure --user=nginx www.wanmeiyulept.com--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 -www.meiwanyule.cn-with-http_image_www.qcaphb.com 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_www.365soke.com module --with-http_degradation_module --with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
#防止启动后退出,因此daemon off;CMD ["/bin/bash", "-c", "nginx -g 'daemon off;'"]docker builddocker build . #利用Dockerfile 创建一个镜像1打包效果: 使用docker tag 镜像ID 新仓库名:TAG 为其添加版本号启动
使用docker commit 创建一个新镜像docker commit 容器名 之后的镜像名:版本号docker commit 可以在一个容器的基础上创建一个新的镜像。这里为了方便看出效果,我们先改变一下原镜像的内容,再commit成新镜像启动刚才Dockerfiel使用exec 进入容器,改变index.html的title
commit后启动 新镜像
可以发现新镜像是改变后的内容。ps:run每次开启一个新容器,start 启动已存在的容器.run = create+start
参考:
Dockerfile 语法FROM
基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。如果同一个DockerFile创建多个镜像时,可使用多个FROM指令(每个镜像一次)# Usage: FROM [image name]FROM ubuntuMAINTAINER指定维护者的信息,并应该放在FROM的后面。# Usage: MAINTAINER [name]MAINTAINER authors_www.yongshi123.cn nameRUNRUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。格式为Run 或者Run [“executable” ,”Param1”, “param2”]前者在shell终端上运行,即/bin/sh -C,后者使用exec运行。例如:RUN [“/bin/bash”, “-c”,”echo hello”]每条run指令在当前基础镜像执行,并且提交新镜像。当命令比较长时,可以使用“/”换行。# Usage: RUN [command]RUN apt-get updateUSER格式为 USER daemon 。指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐 sudo 。# Usage: USER [UID]USER 751VOLUMEVOLUME命令用于让你的容器访问宿主机上的目录。格式为 VOLUME [“/data”] 。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。# Usage: VOLUME ["/dir_www.michenggw.com", “/dir_2” …]VOLUME ["/my_files", “/app_files”]WORKDIRWORKDIR命令用于设置CMD指明的命令的运行目录。格式为 WORKDIR /path/to/workdir 。为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:WORKDIR /aWORKDIR bWORKDIR cRUN pwd# 最终路径为 /a/b/c 。CMD支持三种格式:CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐CMD command param1 param2,在/bin/sh上执行CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。每个容器只能执行一条CMD命令,多个CMD命令时,只最后一条被执行。# Usage 1: CMD application www.sanxinyuLevip.com “argument”, “argument”, …CMD “echo” “Hello docker!”ENV格式为 ENV 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。ENV TZ “Asia/Shanghai”ENV LANG en_US.UTF-8ENV LC_ALL en_www.dasheng178.com US.UTF-8ADDADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。如果文件是可识别的压缩格式,则docker会帮忙解压缩。# Usage: ADD [source directory or URL] [destination directory]ADD /my_app_folder /my_app_folderCOPY(基本于ADD没有区别)COPY 将文件从路径 <src复制添加到容器内部路径 。COPY EXPOSE指定在docker允许时指定的端口进行转发EXPOSE […]ENTRYPOINT两种格式:ENTRYPOINT [“executable”, www.bsylept.com “param1”, “param2”]ENTRYPOINT command param1 param2(shell中执行)。配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ONBUILDONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行