Docker用法总结(一)Dockerfile

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

配置文件

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

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

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

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

Dockerfile

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

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

$ docker build -t name:tag PATH

docker build [OPTIONS] PATH | URL | -

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

PATH为Dockerfile所在的目录

格式

一个Dockerfile大致长这个亚子:

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中指令

指令

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

指令操作(例子)功能
FROMFROM ubuntu:16.04指定初始镜像
WORKDIRWORKDIR /home/taqini切换工作目录
USERUSER taqini切换默认用户
ARGARG CODE_VERSION=latest定义变量
ENVENV DALAO=Imagin定义环境变量
COPYCOPY test /opt/test/拷贝文件至镜像
RUNadduser taqini执行系统命令
EXPOSEEXPOSE 80/tcp曝露端口
CMDCMD ["start.sh"]启动时执行命令
ENTERPOINTENTRYPOINT ["entrypoint.sh"]指定启动时的入口点

FROM

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

FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]

一般直接FROM image:tag就行

WORKDIR

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

WORKDIR /dir

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

USER

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

USER taqini
USER 1001

默认用户是root

ARG

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

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

ENV

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

ENV <key> <value>
ENV <key>=<value> ...

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

COPY

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

COPY test relativeDir/   # adds "test" to `WORKDIR`/relativeDir/
COPY test /absoluteDir/  # adds "test" to /absoluteDir/

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

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

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数组,所以只能用双引号,不能用单引号!

一般使用第一种,例子:

RUN apt-get update

执行命令的默认用户是root

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

RUN [ "echo", "$HOME" ]

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

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

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

EXPOSE

配置曝露的端口

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

例如:

EXPOSE 80/tcp

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

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指定了一个启动脚本:

ENTRYPOINT ["entrypoint.sh"]

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

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

CMD ["2333"]
ENTRYPOINT ["echo"]

运行镜像的结果是:

2333

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

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

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

LABLE

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

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

ADD

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

VOLUME

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

VOLUME ["/data"]

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

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

Ref

官方| Docker Documentation

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaQini852

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值