Docker 镜像介绍
Docker镜像构建分为两种,一种是手动构建,另一种是Dockerfile(自动构建)
手动构建docker镜像
案例:我们基于centos镜像进行构建,制作自己的nginx镜像
1
2
3
|
docker run --name mynginx -it centos
rpm -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
|
[root@linux-node1 ~]
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a8128fa6245 centos
"/bin/bash"
9 minutes ago Exited (0) 2 minutes ago mynginx
[root@linux-node1 ~]
# docker commit -m "My Nginx" 2a8128fa6245 shhnwangjian/mynginx:v1
sha256:a8be358735525b50f49ca0bfe2b264427875333dcb1c02495b49dce4d1b10705
[root@linux-node1 ~]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shhnwangjian
/mynginx
v1 a8be35873552 39 seconds ago 335.2 MB
nginx latest 01f818af747d 3 weeks ago 181.6 MB
centos latest 67591570dd29 4 weeks ago 191.8 MB
|
上面commit命令一行注释
- -m 描述
- 容器ID
- 第一个shhnwangjian是仓库的名称
- 第二个mynginx是镜像的名称
- v1 标签,如果是最后一个版本我们可以打latest
我们现在启动制作好的nginx镜像
1
2
|
[root@linux-node1 ~]
# docker run --name mynginxv1 -d -p 88:80 shhnwangjian/mynginx:v1 nginx
21bb74c3979c26697b7f03a79c3ddb49363791d03160e07fd04617d7e8c00436<br><br>
|
提示:最后面的nginx不是镜像的nginx,而是服务的名称
1
2
3
|
[root@linux-node1 ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21bb74c3979c 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
|
[root@linux-node1 ~]
# cd /root
[root@linux-node1 nginx]
# mkdir -p dockerfile/nginx
[root@linux-node1 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
|
[root@linux-node1 nginx]
# vim Dockerfile
# This Dockerfile
# Base image
FROM centos
# Maintainer
MAINTAINER shhnwangjian xxx@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"
]
|
说明:
- #井号代表注释
- #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
|
[root@linux-node1 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 b
WORKDIR c
RUN
pwd
则最终路径为
/a/b/c
。
|
ONBUILD
解释:指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
ARG
1
|
格式:ARG<name>[=<default value>]
|
解释:ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。