构建三部曲
- 编写
Dockerfile
- 使用
docker build
命令从Dockerfile
构建图像 docker run
镜像
指令
FROM
LABEL
RUN
EXPOSE
WORKDIR
ENV
USER
VOLUME
ADD
COPY
CMD
ENTRYPOINT
FROM
基础镜像,基于的镜像
# FROM 镜像:TAG
FROM centos:centos7
LABEL - (MAINTAINER <name> 维护者 已弃用)
标签
# LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
RUN
容器构建的时候执行的命令(分
shell
和exec
形式)RUN 指令在
docker build
时运行
# RUN 命令
# shell形式
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
# exec形式
RUN ["/bin/bash", "-c", "echo hello"]
EXPOSE
当前容器对外暴露的端口
# EXPOSE <port> [<port>/<protocol>...]
EXPOSE 80/tcp
EXPOSE 80/udp
WORKDIR
指定创建容器后,终端默认登录进来的工作目录,相当于落脚点
# WORKDIR 路径
WORKDIR /path/to/workdir
ENV
定义环境变量
# ENV <key>=<value> ...
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
USER
指定该镜像以什么样的用户去执行,如果都不指定,默认为root
# USER <user>[:<group>]
# USER <UID>[:<GID>]
FROM microsoft/windowsservercore
RUN net user /add patrick
USER patrick
VOLUME
容器卷,相当于
-v
# VOLUME ["/data"]
VOLUME /var/lib/mysql
ADD
将宿主机目录下的文件拷贝进镜像且会
自动处理URL
和解压tar压缩包
,相当于COPY+解压
# ADD [--chown=<user>:<group>] <src>... <dest>
# ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
ADD hom* /mydir/
ADD hom?.txt /mydir/
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
COPY
类似
ADD
,拷贝文件和目录到镜像中
# COPY [--chown=<user>:<group>] <src>... <dest>
# COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
CMD - (分 shell
和 exec
形式)
指定容器运行后执行的命令
只能有一条CMD指令Dockerfile。如果列出多个,CMD 则只有最后一个CMD才会生效,其他不会生效
CMD 指令在
docker run
时运行
$ docker run -it image /bin/bash
相当于在dockerfile的最后一行追加了一行CMD指令
(CMD ["/bin/bash", "run"])
,那么原有的指令便不会执行如:
CMD ["catalina.sh", "run"] CMD ["/bin/bash","run"]
# CMD ["executable","param1","param2"]
# CMD ["param1","param2"]
# CMD command param1 param2
FROM ubuntu
CMD echo "This is a test." | wc -
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
ENTRYPOINT - (分 shell
和 exec
形式)
用来指定一个容器启动时要运行的命令
# ENTRYPOINT ["executable", "param1", "param2"]
# ENTRYPOINT command param1 param2
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
- 例如:(
nginx:test
)FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参
docker命令 | 衍生出的实际命令 |
---|---|
docker run nginx:test |
nginx -c /etc/nginx/nginx.conf |
docker run nginx:test -c /etc/nginx/new.conf |
nginx -c /etc/nginx/new.conf |