Docker命令之二,创建本地镜像

风度翩翩、测量试验境况

    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的层以上产生新的层卡塔 尔(英语:State of Qatar)。

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]
本条命令的着力成效是从源系统的文件系统上复制文件到目的容器的文件系统。假如源是贰个U福特ExplorerL,那该UEnclaveL的内容将被下载并复制到容器中。

 

 

ENTRYPOINT

Usage: ENTRYPOINT application “argument”, “argument”, ..
配备容器运营后试行的指令,而且不可被 docker run 提供的参数覆盖。
ENTKoleosYPOINT
帮忙您布署二个容器使之可施行化,假设你结合CMD命令和ENT景逸SUVYPOINT命令,你能够从CMD命令中移除“application”而独自小编保护留参数,参数将传递给ENT大切诺基YPOINT命令。
各种 Dockerfile 中必须要有二个ENT普拉多YPOINT,当钦点多少个时,只有最后四个起效。

四、实验结果

生机勃勃旦对您有援助,请帮本身点赞,各位的协助也是本身创作的重力,谢谢

COPY

Usage: COPY [source directory or URL] [destination directory]
复制当地主机的 (为Dockerfile所在目录的相对路径卡塔 尔(英语:State of Qatar)到容器中的 。

太阳集团太阳娱乐登录 3

VOLUME

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

 

USER

Usage: USER [UID]
USE帕杰罗命令用于安装运转容器的UID。

WORKDIR

Usage: WORKDIR /path
WO奥迪Q3KDISportage命令用于安装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和ENTLANDYPOINT,这里依旧有一点点傻傻分不清楚怎么用
标识一下那点之后继续商讨一下。