avatar

目录
Docker用法总结之Dockerfile

最近在把服务器上的应用尽量docker化,踩了不少坑……不过也正好学习dockerdocker-compose的用法。此篇文章记录docker常用命令、使用方法,用于备忘。

配置文件

主要是dockerfiledocker-compose.yml两个文件,这俩的关系,简单的讲:

  • dockerfile包含生成镜像的配置信息,其中的指令作用的对象是镜像

  • docker-compose.yml包含启动容器的配置信息,其中指令作用的对象是容器

镜像一般只生成一次,而容器则可以启动多个。

Dockerfile

用于生成docker镜像的配置文件,简单讲就是初始化镜像用的,比如拷贝文件到镜像、执行命令、暴露端口、设置用户等等。

生成镜像的常用命令如下:

shell
1
$ docker build -t name:tag PATH

docker build [OPTIONS] PATH | URL | -

通过-t 指定镜像名/版本

PATH为Dockerfile所在的目录

格式

一个Dockerfile大致长这个亚子:

dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
FROM ubuntu

RUN useradd -m ctf
WORKDIR /home/ctf

COPY ./start.sh /start.sh
RUN chmod +x /start.sh

CMD ["/start.sh"]

USER ctf
EXPOSE 9999

基本的书写格式就是:指令+操作

使用Dockerfile生成镜像,就是对原始镜像逐步执行Dockerfile中指令

指令

指令不多,列张表格好了:

指令 操作(例子) 功能
FROM FROM ubuntu:16.04 指定初始镜像
WORKDIR WORKDIR /home/taqini 切换工作目录
USER USER taqini 切换默认用户
ARG ARG CODE_VERSION=latest 定义变量
ENV ENV DALAO=Imagin 定义环境变量
COPY COPY test /opt/test/ 拷贝文件至镜像
RUN adduser taqini 执行系统命令
EXPOSE EXPOSE 80/tcp 曝露端口
CMD CMD ["start.sh"] 启动时执行命令
ENTERPOINT ENTRYPOINT ["entrypoint.sh"] 指定启动时的入口点

FROM

指定初始镜像( Base Image ),写法有三种

dockerfile
1
2
3
FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]

一般直接FROM image:tag就行

WORKDIR

相当于cd,用于切换工作目录,例如:

dockerfile
1
WORKDIR /dir

最后一个WORKDIR指定的路径将作为docker启动的默认路径

USER

切换到指定用户,一般指定用户名或是uid

dockerfile
1
2
USER taqini
USER 1001

默认用户是root

ARG

用于定义临时变量,例如:

dockerfile
1
2
ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

ENV

设置环境变量,有两种格式:

dockerfile
1
2
ENV <key> <value>
ENV <key>=<value> ...

使用等于号可以同时设置多个环境变量

COPY

从本地复制文件到镜像,格式为COPY 本地文件 目标镜像文件

dockerfile
1
2
COPY test relativeDir/   # adds "test" to `WORKDIR`/relativeDir/
COPY test /absoluteDir/ # adds "test" to /absoluteDir/

拷贝时可以使用相对路径,前提是已经通过WORKDIR指定了工作目录

COPY的同时修改文件所有者:

dockerfile
1
COPY --chown=user:group files* /somedir/

RUN

RUN就是执行系统命令,有两种格式:

  • RUN <command> (shell 格式)

  • RUN ["executable", "param1", "param2"] (exec 格式)

shell格式相当于把RUN后的command依次作为/bin/sh -c的参数(子命令)

exec格式则是直接执行括号中的命令

exec 格式使用的是JSON数组,所以只能用双引号,不能用单引号!

一般使用第一种,例子:

dockerfile
1
RUN apt-get update

执行命令的默认用户是root

第二种格式很麻烦,因为它不会调用shell,所以环境变量什么的就不会起作用,比如:

dockerfile
1
RUN [ "echo", "$HOME" ]

上面的用法是错的,正确的用法应该是:

dockerfile
1
RUN [ "sh", "-c", "echo $HOME" ]

很麻烦是叭 _(:з」∠)

EXPOSE

配置曝露的端口

dockerfile
1
EXPOSE <port> [<port>/<protocol>...]

例如:

dockerfile
1
EXPOSE 80/tcp

曝露的端口用于在docker启动时作端口映射,比如将docker的80端口映射到服务器的8080端口:

shell
1
docker run -p 80:80/tcp ...

CMD

有三种写法:

  • CMD ["executable","param1","param2"] (exec 格式)

  • CMD ["param1","param2"] (用作ENTRYPOINT的参数)

  • CMD command param1 param2 (shell 格式)

CMD指定的命令/脚本会在镜像启动时执行,是可执行容器默认的执行命令。

一个Dockerfile中只能有一个CMD指令,如果存在多个,则只有最后一个生效

ENTRYPOINT

镜像启动后的入口点。

和CMD不同,ENTRYPOINT先执行。

比如ENTRYPOINT指定了一个启动脚本:

dockerfile
1
ENTRYPOINT ["entrypoint.sh"]

在镜像启动后,只会执行这个脚本的内容(即使Dockerfile中有CMD指令)。

但是CMD指令也是有用处的,比如这样:

dockerfile
1
2
CMD ["2333"]
ENTRYPOINT ["echo"]

运行镜像的结果是:

shell
1
2333

也就是说,如果之前有CMD指令,CMD指令的操作数其实是用作ENTRYPOINT的参数的。

如果不指定ENTRYPOINT,CMD的操作数就会被全部用作ENTRYPOINT的参数
所以看起来的效果就是默认执行了CMD

感觉没说明白……文章末尾有参考文章,讲的十分清楚(´•灬•‘)

LABLE

给镜像添加标签(没啥用)

dockerfile
1
2
3
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

ADD

COPY差不多,但貌似只能在Linux下用,不提了。

VOLUME

用于创建镜像内的挂载点,例如:

dockerfile
1
VOLUME ["/data"]

感觉没啥用,一般操作是在docker-compose里直接设置挂载点的信息

这篇先写到这里,docker-compose的用法下一篇写。

Ref

官方| Docker Documentation

CSDN|【docker】CMD ENTRYPOINT 区别 终极解读!

文章作者: TaQini
文章链接: http://taqini.space/2020/03/01/note-for-docker/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TaQini
打赏
  • Wechat
    Wechat
  • Alipay
    Alipay

评论