Docker 镜像介绍
Docker镜像构建分为两种,一种是手动构建,另一种是Dockerfile(自动构建)
手动构建docker镜像
案例:我们基于centos镜像进行构建,制作自己的nginx镜像
|
1
2
3
|
docker run --name mynginx -it centosrpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install nginx -y
|
我们需要修改nginx配置文件,让他运行在前台
|
1
2
|
vi /etc/nginx/nginx.conf
daemon off; |
修改完之后我们退出,将mynginx本地提交
|
1
2
3
4
5
6
7
8
9
10
|
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2a8128fa6245 centos "/bin/bash" 9 minutes ago Exited (0) 2 minutes ago mynginx
[[email protected] ~]# docker commit -m "My Nginx" 2a8128fa6245 shhnwangjian/mynginx:v1
sha256:a8be358735525b50f49ca0bfe2b264427875333dcb1c02495b49dce4d1b10705[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZEshhnwangjian/mynginx v1 a8be35873552 39 seconds ago 335.2 MB
nginx latest 01f818af747d 3 weeks ago 181.6 MBcentos latest 67591570dd29 4 weeks ago 191.8 MB |
上面commit命令一行注释
- -m 描述
- 容器ID
- 第一个shhnwangjian是仓库的名称
- 第二个mynginx是镜像的名称
- v1 标签,如果是最后一个版本我们可以打latest
我们现在启动制作好的nginx镜像
|
1
2
|
[[email protected] ~]# docker run --name mynginxv1 -d -p 88:80 shhnwangjian/mynginx:v1 nginx
21bb74c3979c26697b7f03a79c3ddb49363791d03160e07fd04617d7e8c00436<br><br> |
提示:最后面的nginx不是镜像的nginx,而是服务的名称
|
1
2
3
|
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES21bb74c3979c shhnwangjian/mynginx:v1 "nginx" 35 seconds ago Up 33 seconds 0.0.0.0:88->80/tcp mynginxv1
|
Dockerfile
Dockerfile是由一行命令和语句组成的。
案例:我们基于centos镜像进行自动构建(dockerfile)
规划存放dockerfile文件的目录结构
|
1
2
3
4
|
[[email protected] ~]# cd /root
[[email protected] nginx]# mkdir -p dockerfile/nginx
[[email protected] nginx]# pwd
/root/dockerfile/nginx |
创建文件需注意:D需要大写,当我们构建dockerfile的时候,docker默认会在我们当前目录读取一个名为Dockerfile的文件。这时候的D必须大写。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[[email protected] nginx]# vim Dockerfile
# This Dockerfile# Base imageFROM centos# MaintainerMAINTAINER shhnwangjian [email protected]# CommandsRUN 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 80CMD ["nginx"]
|
说明:
- #井号代表注释
- #Base image 除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么
- #Maintainer 维护信息
- #Commands 命令
- #ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改
- EXPOSE 对外端口号
- CMD ["nginx"] 它要启动的命令是nginx (就算是nginx服务)
我们写好Dockerfile还需要一个index.html
1 |
echo shhnwangjian > index.html
|
开始构建
1 |
docker build -t mynginx:v2 . |
提示:.代表构建的位置,我们是当前目录。
构建完成
启动容器
|
1
2
|
[[email protected] nginx]# docker run --name mynginxv2 -d -p 89:80 mynginx:v2
0c4f1703d96c63587825e62225ffc67a172b1233b958a320d881e5560383846d |
Dockerfile参数简介:
- FROM (指定基础镜像)
- MAINTAINER (指定维护者信息)
- RUN (在命令前面加上RUN)
- ADD (COPY文件,会自动解压)
- WORKDIR (设置当前工作目录,类似于cd)
- VOLUME (设置卷,挂载主机目录)
- EXPOSE (指定对外的端口)
- CMD (指定容器启动后要干的事情)
Dockerfile参数解释
FROM
1 |
格式:FROM<image>或FROM<image>:<tag>。 |
解释:FROM是Dockerfile里的第一条指令(必须是),后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。然后后面的其它指令FROM的镜像中执行。
MAINTAINER
1 |
格式:MAINTAINER <name> |
解释:指定维护者信息。
RUN
1 |
格式:RUN <command>或 RUN["executable", "param1", "param2"]。
|
解释:运行命令,命令较长使可以使用\来换行。推荐使用上面数组的格式。
CMD
|
1
2
3
4
|
格式:CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;
|
解释:CMD指定容器启动时执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行。如果你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。
ENTRYPOINT
|
1
2
3
|
格式:ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2(shell中执行)。
|
解释:和CMD类似都是配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。
所以生产实践中我们可以同时使用ENTRYPOINT和CMD。
例:
|
1
2
|
ENTRYPOINT ["/usr/bin/rethinkdb"]
CMD ["--help"]
|
USER
1 |
格式:USER daemon |
解释:指定运行容器时的用户名和UID,后续的RUN指令也会使用这里指定的用户。
EXPOSE
1 |
格式:EXPOSE<port> [<port>...] |
解释:设置Docker容器内部暴露的端口号,如果需要外部访问,还需要启动容器时增加-p或者-P参数进行分配。
ENV
|
1
2
|
格式:ENV<key> <value>ENV <key>=<value> ... |
解释:设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。
ADD
|
1
2
3
|
格式:ADD <src>... <dest>ADD ["<src>",... "<dest>"]
|
解释:将指定的<src>复制到容器文件系统中的<dest>
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
如果文件是可识别的压缩格式,则docker会帮忙解压缩
VOLUME
1 |
格式:VOLUME ["/data"]
|
解释:可以将本地文件夹或者其他container的文件夹挂载到container中。
WORKDIR
1 |
格式:WORKDIR/path/to/workdir
|
解释:切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。
可以多次切换(相当于cd命令), 也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
例:
|
1
2
3
4
5
|
WORKDIR /a
WORKDIR bWORKDIR cRUN pwd
则最终路径为 /a/b/c。
|
ONBUILD
解释:指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
ARG
1 |
格式:ARG<name>[=<default value>] |
解释:ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。