制作贰个dockerfile,创立当地镜像

2019-11-19 01:43 来源:未知

一、测试环境

    dockerfile, 主要是四部分组成:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。

build Build an image from a Dockerfile 通过Dockerfile构建出一个镜像

OS version: CentOS Linux release 7.5.1804 (Core)

 

[root@localhost ~]# docker build --help

Usage:  docker build [OPTIONS] PATH | URL | -

Build an image from a Dockerfile

Options:
      --add-host list           Add a custom host-to-IP mapping (host:ip)                  添加自定义的主机到IP映射(主机:IP)
      --build-arg list          Set build-time variables                                   设置镜像创建时的变量
      --cache-from strings      Images to consider as cache sources                        指定缓存源,指定后将再不使用本地生成的镜像链,而是从镜像仓库中下载
      --cgroup-parent string    Optional parent cgroup for the container                   容器的可选父cgroup
      --compress                Compress the build context using gzip                      使用gzip压缩构建上下文
      --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period       限制 CPU CFS周期
      --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota        限制 CPU CFS配额
  -c, --cpu-shares int          CPU shares (relative weight)                               设置 cpu 使用权重
      --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)                指定使用的CPU id
      --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)                指定使用的内存 id
      --disable-content-trust   Skip image verification (default true)                     忽略校验,默认开启
  -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')      指定要使用的Dockerfile路径
      --force-rm                Always remove intermediate containers                      设置镜像过程中删除中间容器
      --iidfile string          Write the image ID to the file                             将图像ID写入文件
      --isolation string        Container isolation technology                             使用容器隔离技术
      --label list              Set metadata for an image                                  设置镜像使用的元数据
  -m, --memory bytes            Memory limit                                               设置内存最大值
      --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap                    设置Swap的最大值为内存 swap,"-1"表示不限swap
      --network string          Set the networking mode for the RUN instructions during build (default "default")      在构建期间为RUN指令设置联网模式(默认“default”)
      --no-cache                Do not use cache when building the image                                               创建镜像的过程不使用缓存
      --pull                    Always attempt to pull a newer version of the image                                    尝试去更新镜像的新版本
  -q, --quiet                   Suppress the build output and print image ID on success                                安静模式,成功后只输出镜像ID
      --rm                      Remove intermediate containers after a successful build (default true)                 设置镜像成功后删除中间容器
      --security-opt strings    Security options                                                                       安全选项
      --shm-size bytes          Size of /dev/shm                                                                       设置/dev/shm的大小,默认值是64M
  -t, --tag list                Name and optionally a tag in the 'name:tag' format                                     以'name:tag'格式命名和可选的标记
      --target string           Set the target build stage to build.                                                   设置要构建的目标构建阶段。
      --ulimit ulimit           Ulimit options (default [])                                                            Ulimit配置

docker cluster : master 1 data node 4

step 1: 按照语法,如下写一个centos操作系统的nignx镜像。

docker build是非常重要的一个功能,你可以用它来制作出符合你自己需求的镜像
由于非官方镜像的安全性无法得到保证,而我们又确实需要某些特殊功能的镜像,因此我们可以使用Dockerfile,创建一个可以保证安全性的镜像

docker version: 1.13.1

图片 1

所以本文第一个要讲的就是dockerfile
dockerfile可以通俗的理解为是docker的脚本,通过这个脚本你可以将原本一个单纯的系统镜像加入许多自己需要的软件。
dockerfile文件是一个由一系列构建指令组成的文本文件,docker build命令会根据这些构建指令完成docker镜像的构建。

 

然后记得:wq保存和退出vi。

说明:构建会在Docker后台守护进程(daemon)中执行,而不是CLI中。构建前,构建进程会将全部内容(递归)发送到守护进程。大多情况下,应该将一个空目录作为构建上下文环境,并将Dockerfile文件放在该目录下。

二、材料准备

 

在构建上下文中使用的Dockerfile文件,是一个构建指令文件。为了提高构建性能,可以通过.dockerignore文件排除上下文目录下,不需要的文件和目录。

  1. dockerfile 文件,如下

step 2: 构建dockerfile镜像文件

命令为:

/opt/command/kevin_docker_files/01_nginx/Dockerfile/kevin_nginx_dockerfile.dockerignore

备注:最后加1个空格,1个英文句号,OK

docker build -f Dockerfile_PATH .
也可以加入-t参数指定构建后的镜像名称、标签

如:docker build -t nginx:old -f Dockerfile_PATH .

# Instruction
FROM centos

# LABLE info
LABEL vendor="itshare" 
      version="0.0.1-beta" 
      release-date="2018-09-02"

# Dockerfile execute command
RUN mkdir -p /opt/apt/
RUN touch /opt/apt/sources.list
RUN echo "kevin.tian installed nginx" >> /opt/apt/sources.list
# RUN yum update && yum install -y nginx
RUN apt-get update && apt-get install -y nginx
RUN echo "ndaemon off;" >> /etc/nginx/nginx.conf

# Container startup command
CMD /usr/sbin/nginx

root >>> docker build -t kevin_nginx/v1:latest -f /opt/command/kevin_docker_files/kevin_nginx_dockerfile.dockerignore .

构建过程实质上是将你所写的dockerfile一步一步的独立进行执行,并且在每一步提交后会生成一个新的镜像,直至完成最后一步以后,会输出一个最终镜像的ID。

 

然后回车,执行build如下图,只需要等待build所有过程完成即可。

那么如何写dockerfile呢?
首先需要了解一下dockerfile的基本命令

三、实验步骤

图片 2

From

Usage: FROM [image name]
DockerFile第一条必须为From指令,指定引用的镜像。如果同一个DockerFile创建多个镜像时,可使用多个From指令(每个镜像一次)

  1. 执行命令,顺序如下

 

MAINTAINER

Usage: MAINTAINER [name]
这个命令用于声明作者,并应该放在FROM的后面

# 查看本地的Docker镜像

最后,查看自己创建的镜像,使用如下命令(可以加参数过滤其他镜像)

RUN

Usage: RUN [command]
接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

root >> docker images

root >>> docker images

CMD

Usage 1: CMD application "argument", "argument", ..
和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

# 执行docker build命令,创建镜像,

 

EXPOSE

Usage: EXPOSE [port]
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

# 注意:build命令结尾有个结束符号 英文句号“.",不要忘记,否则执行会提示错误少个参数。

附上代码,如下地址(下载后,请记得修改文件后缀.sh为.dockerignore)

ENV

Usage: ENV key value
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

root >> docker build -f "/opt/command/kevin_docker_files/01_nginx/Dockerfile/kevin_nginx_dockerfile.dockerignore" -t "nginx/kevin.tian" .

ADD

Usage: ADD [source directory or URL] [destination directory]
这个命令的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

 

 

ENTRYPOINT

Usage: ENTRYPOINT application "argument", "argument", ..
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

四、实验结果

如果对您有帮助,请帮我点赞,各位的支持也是我写作的动力,谢谢

COPY

Usage: COPY [source directory or URL] [destination directory]
复制本地主机的 (为Dockerfile所在目录的相对路径)到容器中的 。

图片 3

VOLUME

Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME命令用于让你的容器访问宿主机上的目录

 

USER

Usage: USER [UID]
USER命令用于设置运行容器的UID。

WORKDIR

Usage: WORKDIR /path
WORKDIR命令用于设置CMD指明的命令的运行目录

ONBUILD

Usage: ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

这里做一个构建自己的nginx镜像的dockerfile演示

[root@localhost ~]# mkdir dockerfile
[root@localhost ~]# cd dockerfile/
[root@localhost dockerfile]# vim Dockerfile
FROM centos
MAINTAINER by hyhy
RUN yum install -y  epel-release
RUN yum install -y  nginx
EXPOSE 80
ENTRYPOINT systemctl start nginx && tailf /usr/local/nginx/logs/error.log
[root@localhost dockerfile]# docker build -t nginx_my:centos .
Step 1/6 : FROM centos
 ---> 2d194b392dd1
Step 2/6 : MAINTAINER by hyhy
 ---> Running in cbd47b6555e2
Removing intermediate container cbd47b6555e2
 ---> 625ef0f2b8f7
Step 3/6 : RUN yum install -y  epel-release
 ---> Running in 01e6f401252e
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.cn99.com
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-9 will be installed
--> Finished Dependency Resolution
...
Dependencies Resolved
...
Installed:
  epel-release.noarch 0:7-9                                                     

Complete!
Removing intermediate container 01e6f401252e
 ---> 2a8bf13b1f05
Step 4/6 : RUN yum install -y  nginx
 ---> Running in 3b0eb58cf811
Loaded plugins: fastestmirror, ovl
https://linuxmirrors.ir/pub/epel/7/x86_64/repodata/2331fa699fd272785aad9dd629482586ceb0706e4fdd2447276e791c6921e172-updateinfo.xml.bz2: [Errno 14] HTTPS Error 404 - Not Found
Trying other mirror.
To address this issue please refer to the below wiki article 

https://wiki.centos.org/yum-errors

If above article doesn't help to resolve this issue please use https://bugs.centos.org/.

Loading mirror speeds from cached hostfile
 * base: mirrors.cn99.com
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
...
Installed:
  nginx.x86_64 1:1.12.2-1.el7                                                   
...
Complete!
Removing intermediate container 3b0eb58cf811
 ---> 9f2c5eee3470
Step 5/6 : EXPOSE 80
 ---> Running in 35a4d9a23074
Removing intermediate container 35a4d9a23074
 ---> 43335a444c08
Step 6/6 : ENTRYPOINT systemctl start nginx && tailf /usr/local/nginx/logs/error.log
 ---> Running in 3b31ab41740e
Removing intermediate container 3b31ab41740e
 ---> 43e745e08973
Successfully built 43e745e08973
Successfully tagged nginx_my:centos

制作完成,简单看一下,404M,官方的镜像只有109M,如果是源码安装的话应该会小很多,另外就是官方的Nginx镜像中少了很多命令,包括netstat和ps之类的都是没有的,可以说是十分精炼。

[root@localhost dockerfile]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
nginx_my                               centos              43e745e08973        2 minutes ago       404MB
centos                                 latest              2d194b392dd1        3 days ago          195MB
busybox                                latest              f6e427c148a7        8 days ago          1.15MB
mysql                                  latest              5d4d51c57ea8        10 days ago         374MB
registry.docker-cn.com/library/nginx   latest              e548f1a579cf        2 weeks ago         109MB
hello-world                            latest              f2a91732366c        3 months ago        1.85kB

启动一下,看看能不能用

[root@localhost dockerfile]# docker run -i -t -p 80:80 43e745e08973 /bin/bash
Failed to get D-Bus connection: Operation not permitted

非常荣幸,我们遇到问题了,这个问题是centos镜像存在的问题,这个的原因是因为dbus-daemon没能启动。其实systemctl并不是不可以使用。将你的CMD或者entrypoint设置为/usr/sbin/init即可。会自动将dbus等服务启动起来。
然而我们这里完全可以不用systemctl,我们可以用/usr/sbin/nginx
那么我们修改一下我们的dockerfile

[root@localhost dockerfile]# vim Dockerfile
FROM centos
MAINTAINER by hyhy
RUN yum install -y  epel-release && yum clean all
RUN yum install -y  nginx && yum clean all
EXPOSE 80
CMD ["/usr/sbin/init"] 
[root@localhost dockerfile]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
mynginx                                centos              a4e95eb48cbd        23 minutes ago      404MB
centos                                 latest              2d194b392dd1        3 days ago          195MB
busybox                                latest              f6e427c148a7        8 days ago          1.15MB
mysql                                  latest              5d4d51c57ea8        10 days ago         374MB
registry.docker-cn.com/library/nginx   latest              e548f1a579cf        2 weeks ago         109MB
hello-world                            latest              f2a91732366c        3 months ago        1.85kB
[root@localhost dockerfile]# docker run -i -t -d -p 80:80 a4e95eb48cbd /bin/bash
ec138dcf120f17072573750d7b8365c82c31adb05180db33705e537711a53bcb
[root@localhost dockerfile]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                NAMES
ec138dcf120f        a4e95eb48cbd        "/bin/bash"         About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   confident_kirch
cf2c588a7b30        centos              "/bin/bash"         2 hours ago          Up 2 hours                               nifty_yonath
[root@localhost dockerfile]# docker run -i -t -d -p 8080:80 a4e95eb48cbd /bin/bash -c "systemctl start nginx"
0cfcba85f49ae81ca8125d8c5d46db0d328e92a640148ab9f6f987dfc335f8a6

由于这次修改的dockerfile,没有加入启动Nginx,这里重新制作一个镜像

[root@localhost dockerfile]# vim Dockerfile
FROM centos
MAINTAINER by hyhy
RUN yum -y install epel-release && yum clean all
RUN yum -y install nginx && yum clean all
EXPOSE 80
CMD ["/usr/sbin/nginx”,“ -g”, “daemon off”]
[root@localhost dockerfile]# docker build -t nginx:2 .
[root@localhost dockerfile]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED              SIZE
nginx                                  1                   f31a08eb3bee        About a minute ago   286MB
centos                                 latest              2d194b392dd1        6 days ago           195MB
busybox                                latest              f6e427c148a7        11 days ago          1.15MB
mysql                                  latest              5d4d51c57ea8        13 days ago          374MB
registry.docker-cn.com/library/nginx   latest              e548f1a579cf        2 weeks ago          109MB
hello-world                            latest              f2a91732366c        3 months ago         1.85kB
[root@localhost dockerfile]# docker run -itd -p 8080:80 nginx:1 /bin/bash 
f61fe8c1b847e7b8ff30dbff34be1ddbb5337ff1a6d13dcaf302c0aac9797946
[root@localhost dockerfile]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
f61fe8c1b847        nginx:1             "/bin/bash"         3 seconds ago       Up 2 seconds        0.0.0.0:8080->80/tcp   epic_ride
cf2c588a7b30        centos              "/bin/bash"         3 days ago          Up 3 days                                  nifty_yonath

如果到这一步你和我同步的话,你可以尝试curl 127.0.0.1:8080,应该是可以看到nginx的页面的。
这里算是成功的完成了既定的目标,但是这里也是有点小问题,就是CMD和ENTRYPOINT,这里还是有点傻傻分不清楚怎么用
标记一下这点以后继续研究一下。

TAG标签:
版权声明:本文由吉利彩票平台注册-吉利彩票平台官方注册-官网推荐发布于首页,转载请注明出处:制作贰个dockerfile,创立当地镜像