Docker镜像制作
Docker镜像的构建分为两种,一种是手动构建,一种是dockerfile(自动构建)
手动构建
基于centos镜像进行构建制作Nginx镜像
[root@rbtnode1 ~]# docker run --name Edward -it centos [root@429ae931a699 /]# yum install -y nginx [root@429ae931a699 /]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
修改Nginx配置让它在前台运行
[root@429ae931a699 /]# vim /etc/nginx/nginx.conf ... daemon off; ... [root@rbtnode1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 429ae931a699 centos "/bin/bash" 16 minutes ago Exited (0) 54 seconds ago Edward
修改完之后commit
[root@rbtnode1 ~]# docker commit -m "My Nginx" 429ae931a699 edward/edward:v1 sha256:3240a62fc2e57466a7938af03fc21c84c24726fd200b5009530391ddb30abfb7 [root@rbtnode1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE edward/edward v1 3240a62fc2e5 9 seconds ago 412 MB docker.io/nginx latest e445ab08b2be 8 days ago 126 MB docker.io/centos latest 9f38484d220f 4 months ago 202 MB #注释 -m 描述 容器ID 第一个edward是仓库的名称 第二个edward是镜像的名称 v1 标签,如果是最后一个版本我们可以打latest 启动制作好的镜像
[root@rbtnode1 ~]# docker run --name nginxv1 -d -p 81:80 edward/edward:v1 nginx 0a38af6c6eddfc3a354760282f01ff6e16b93e4f903d7c154f038d68a10f581d [root@rbtnode1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0a38af6c6edd edward/edward:v1 "nginx" 8 seconds ago Up 6 seconds 0.0.0.0:81->80/tcp nginxv1
自动构建
Dockerfile是由一行命令和语句组成的
Dockerfile构建步骤:
[root@rbtnode1 ~]# mkdir /dockerfile [root@rbtnode1 ~]# cd /dockerfile [root@rbtnode1 dockerfile]# mkdir nginx [root@rbtnode1 dockerfile]# cd nginx [root@rbtnode1 nginx]#vim Dockerfile # Dockerfile FROM centos #Maintainer MAINTAINER sjny yunweizabbix@163.com #Commands RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum install -y nginx && yum clean all RUN echo "daemon off;" >>/etc/nginx/nginx.conf ADD index.html /usr/share/nginx/html/index.html EXPOSE 80 CMD ["nginx"] [root@rbtnode1 nginx]# echo "hello world" >index.html #井号代表注释 #Base image 除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么 #Maintainer 维护信息 #Commands 命令 #ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改 EXPOSE 对外端口号 CMD [“nginx”] 它要启动的命令是nginx (就算是nginx服务) 开始构建 docker build -t mynginx:v2 . docker run --name mynginxtest -d -p 82:80 mynginx:v2
Dockerfile参数
FROM
格式:
FROM<image>或FROM<image>:<tag>
解释:FROM是dockerfile里的第一条指令,后面跟有效的镜像名(如果该镜像你的本地镜像没有则会从远程仓库pull取)。后面的其它指令在FROM的镜像中执行。
MAINTAINER
格式:
MAINTAINER <name>
解释:指定维护者信息。
RUN
格式:
RUN <command>或 RUN[“executable”,“param1”,“param2”]
解释:运行,命令,命令较长时可以使用来换行。推荐使用以上数组格式
CMD
格式:
CMD [“executable”,”param1”,”param2”]使用exec执行,推荐;
CMD command param1 param2 在/bin/sh 中执行,提供给需要交互的应用;
CMD [“param1”,”param2”] 提供给ENTRYPOINT的默认参数;
解释:CMD指定容器启动是执行的命令,每个dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖dockerfile构建的镜像里面的CMD命令。
ENTRYPOINT
格式:
ENTRYPOINT [“executable”,”param1”,”par am2”]
ENTRYPOINT command param1 param2 (shell中执行)
解释:和CMD类似都是配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。
每个dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,所以生产中可以同时使用ENTRYPOINT和CMD。
USER
格式:USER daemon
解释:指定运行容器时的用户名和UID。
EXPOSE
格式:EXPOSE<port> [<port>…]
解释:设置docker容器内部暴露的端口号,如果需要外部访问。还需要启动容器时增加-p或者-P参数进行分配。
ENV
格式:ENV
ENV =<value>…
解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。
ADD
格式:ADD <src>… <dest>
ADD [“”,. . . “”]
解释:将指定的复制到容器文件系统中
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
如果文件是可识别的压缩格式,则docker会帮忙解压缩
VOLUME
格式:VOLUME [“/data”]
解释:可以将本地文件夹或者其他container的文件挂载到container中
WORKDIR
格式:WORKDIR/path/to/workdir
解释:切换目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以多次切换(相当于cd命令)
也可以使用多个WORKDIR指令,后续命令如果参数是相对路劲,则会基于之前命令指定的路径。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路劲为 /a/b/c
ONBUILD
ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
ARG
格式:ARG<name> [=<default value>]
解释:ARG指定了一个变量在docker build的时候使用,可以使用—build-arg =来指定参数的值,不过如果构建的时候不指定就会报错。