文章目录
这一篇主要介绍Dockerfile命令的使用说明及如何使用Dockerfile制作简单镜像
制作简单Mysql镜像
创建目录
mkdir /tmp/mysql
cd /tmp/mysql
新建Dockerfile文件,输入如下内容并保存
vim Dockerfile
#输入如下内容
FROM mysql:5.7
COPY my.cnf /etc/mysql/
EXPOSE 3306
CMD ["mysqld"]
新建my.cnf文件,输入如下内容并保存
vim my.cnf
#输入以下内容
[mysqld]
##################基础设置##################
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect=‘SET NAMES utf8mb4‘
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1
编译
docker build -t myself-mysql:5.7 .
注意:
- myself-mysql为自定义的镜像名称
- 5.7为镜像版本号
- 命令的最后一定要有 . 符号,表示docker使用当前目录的Dockerfile文件进行镜像的制作
这样,一个简单的镜像就做成了,接下来说明Dockerfile文件内的各个命令的作用
Dockerfile命令说明
|
|
---|---|
FROM | 必填,指定锁创建镜像的基础镜像 |
MAINTAINER | 指定维护者信息,该信息将会写入生成镜像的Author属性域中,如:MAINTAINER docker_user [email protected] |
RUN | 运行命令 |
CMD | 指定启动容器时默认执行的命令 |
LABEL | 指定生成镜像的元数据标签信息 |
EXPOSE | 声明镜像内服务所监听的端口 |
ENV | 指定环境变量 |
ADD | 赋值指定的src路径下的内容到容器中的dest路径下 |
COPY | 赋值本地主机的scr路径下的内容到容器中的dest路径下;一般情况下推荐使用COPY而不是ADD |
ENTRYPOINT | 指定镜像的默认入口 |
VOLUME | 创建数据挂载点 |
USER | 指定运行容器时的用户名或UID |
WORKDIR | 配置工作目录 |
ARG | 指定镜像内使用的参数 |
ONBUILD | 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令 |
STOPSIGNAL | 容器退出的信号 |
HEALTHCHECK | 如何进行健康检查 |
SHELL | 指定使用SHELL时的默认SHELL类型 |
上述命令中,常用的命令其实不多,接下来对常用的命令进行详解:
-
FROM:指定所创建的镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。格式为:FROM image,或FROM image:tag。任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile文件中创建多个镜像,可以使用多个FROM指令(每个镜像一次)
-
RUN:运行指定命令
两种运行格式
- shell格式:RUN [command]
- exec格式:RUN [“可执行文件”, “参数1”, “参数2”]
每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\换行,如下:
RUN apt-get update
&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev
&& rm -rf /var/cache/apt -
CMD :容器启动命令,启动方式和RUN类似,也有两种。每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令
- shell格式:RUN [command]
- exec格式:RUN [“可执行文件”, “参数1”, “参数2”]
-
EXPOSE:声明镜像内服务所监听的端口,格式为:EXPOSE [port] [port]…],如:EXPOSE 22 80 443 3306。
注意:该命令只是起到声明作用,并不会自动完成端口映射。在容器启动时需要使用-P(大写P),Docker主机会自动分配一个宿主机未被使用的临时端口转发到指定的端口;使用-p(小写p),则可以具体指定哪个宿主机的本地端口映射过来
-
COPY:复制本地主机的src下的内容到镜像中的dest下,路径同样支持正则。
格式为:COPY [src] [dest]。
src为本地主机所在目录的一个相对路径、文件或目录
dest为容器内的目录,目标路径不存在时,会自动创建
当使用本地目录为源目录时,推荐使用COPY而不是ADD。 -
ADD:和COPY指令作用一致,该指令将复制指定的src路径下的内容到容器中的dest路径下。
格式为:ADD[src] [dest]。
[src]可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一个tar文件(如果是tar文件,会自动解压到[dest]路径下)。
[dest]可以使镜像内的绝对路径,或者相当于工作目录(WORKDIR)的相对路径。路径支持正则表达式。 -
ENV:设置环境变量。
格式有两种:ENV [key] [value]或ENV [key1]=[value1] [key2]=[value2]…。
无论是后面的其它指令,如 RUN ,还是运行时的应用,都可以直接使用这里定义的环境变量
总结
制作镜像的步骤如下:
- 编写Dockerfile文件及其他相关的使用到的配置文件
- 将Dockerfile和配置文件放在同一个目录
- 进入该目录,执行命令:docker build -t [容器名称] .