《Docker技术入门与实践》Docker入门4-使用Dockerfile创建镜像

Dockerfile基础

Dockerfile分四部分组成: 基础镜像、维护者信息、镜像操作指令、启动时命令
ps: 我的本地镜像已经有centos,若没有请使用docker pull centos

入门例子

创建Dockerfile文件

cd temp && vim Dockerfile

#若本地镜像没有centos请先使用`docker pull centos`
FROM centos

MAINTAINER thewindkee thewindkee@163.com

RUN  echo hi

在当前目录下执行docker build .
效果:构建了一个centos镜像,并且输出了hi

   Sending 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 b96f2a0acf5d

在这里插入图片描述

★含有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.gz
RUN tar -xvf nginx-1.14.2.tar.gz 
WORKDIR nginx-1.14.2
RUN ls

RUN 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-devel
RUN useradd -M -s /sbin/nologin nginx

RUN ./configure --user=nginx --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   --with-http_image_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_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 build

docker build .  #利用Dockerfile 创建一个镜像

打包效果:
build中

使用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 ubuntu
MAINTAINER
指定维护者的信息,并应该放在FROM的后面。
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN
RUN命令是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 update
USER
格式为 USER daemon 。
指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要临时获取管理员权限可以使用 gosu ,而不推荐 sudo 。
# Usage: USER [UID]
USER 751
VOLUME
VOLUME命令用于让你的容器访问宿主机上的目录。
格式为 VOLUME [“/data”] 。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
# Usage: VOLUME ["/dir_1", “/dir_2” …]
VOLUME ["/my_files", “/app_files”]
WORKDIR
WORKDIR命令用于设置CMD指明的命令的运行目录。
格式为 WORKDIR /path/to/workdir 。
为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN 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 “argument”, “argument”, …
CMD “echo” “Hello docker!”
ENV
格式为 ENV 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
ENV TZ “Asia/Shanghai”
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ADD
ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。如果文件是可识别的压缩格式,则docker会帮忙解压缩。
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
COPY(基本于ADD没有区别)
COPY 将文件从路径 <src复制添加到容器内部路径 。
COPY
EXPOSE
指定在docker允许时指定的端口进行转发
EXPOSE […]
ENTRYPOINT
两种格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2(shell中执行)。
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ONBUILD
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

posted @ 2019-03-14 18:44  thewindkee  阅读(177)  评论(0编辑  收藏  举报