文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Docker 镜像构建保姆级入门实战指南

2024-12-01 15:24

关注

一、概述

官方文档:

Dockerfile 示例:

二、Dockerfile 结构

Dockerfile 结构主要分为四部分:

三、常用 Dockerfile 操作指令

1)镜像构建(docker build)

docker build -t text:v1 . --no-cache
# 要在构建后将映像标记到多个存储库中,请在运行命令-t时添加多个参数
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
# --no-cache:不缓存

2)运行容器测试(docker run)

# 非交互式运行
docker run centos:7.4.1708 /bin/echo "Hello world"
### 交互式执行
# -t: 在新容器内指定一个伪终端或终端。
#-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
# 会登录到docker环境中,交互式
docker run -it centos:7.4.1708 /bin/bash
# -d:后台执行,加了 -d 参数默认不会进入容器
docker run -itd centos:7.4.1708 /bin/bash
### 进入容器
# 在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
#docker exec -it :推荐大家使用 docker exec -it 命令,因为此命令会退出容器终端,但不会导致容器的停止。
#docker attach:容器退出,会导致容器的停止。
docker exec -it b2c0235dc53 /bin/bash
docker attach b2c0235dc53

3)ARG

语法格式:

ARG <参数名>[=<默认值>]

示例:

# 在FROM之前定义ARG,只在 FROM 中生效
ARG VERSION=laster
FROM centos:${VERSION}
# 在FROM之后使用,得重新定义,不需要赋值
ARG VERSION
RUN echo $VERSION >/tmp/image_version

4)FROM

语法格式:

FROM [--platform=]  [AS ]
FROM [--platform=] [:] [AS ]
FROM [--platform=] [@] [AS ]

示例:

ARG VERSION=latest
FROM busybox:$VERSION
# FROM --platform="linux/amd64" busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version

5)MAINTAINER(已弃用)

语法格式:

MAINTAINER 

示例:

LABEL org.opencontainers.image.authors="SvenDowideit@home.org.au"

6)VOLUME

作用:

语法格式:

# 后面路径是容器内的路径,对应宿主机的目录是随机的
VOLUME ["<1>", "<2>"...]
VOLUME <路径>

示例:

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

7)RUN

语法格式:

示例:

# 以下三种写法等价
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]

8)COPY

语法格式:

COPY [--chown=:] ... 
COPY [--chown=:] ["<src>",... "<dest>"]

示例:

# 添加所有以“hom”开头的文件:
COPY hom* /mydir/
# ?替换为任何单个字符,例如“home.txt”。
COPY hom?.txt /mydir/
# 使用相对路径,并将“test.txt”添加到/relativeDir/:
COPY test.txt relativeDir/
# 使用绝对路径,并将“test.txt”添加到/absoluteDir/
COPY test.txt /absoluteDir/
# 修改文件权限
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/

9)ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

语法格式:

ADD [--chown=:] ... 
ADD [--chown=:] ["<src>",... "<dest>"]

示例:

# 通配符
ADD hom* /mydir/
# 相对路径,拷贝到WORKDIR目录下relativeDir/
ADD test.txt relativeDir/
# 绝对路径
ADD test.txt /absoluteDir/
# 更改权限
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/

ADD 和 COPY 的区别和使用场景:

10)ENV

语法格式:

ENV = =...
# 省略"="此语法不允许在单个ENV指令中设置多个环境变量,并且可能会造成混淆。
ENV

示例:

ENV JAVA_HOME=/usr/local/jdk
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
# 此语法不允许在单个ENV指令中设置多个环境变量,并且可能会造成混淆。
ENV JAVA_HOME /usr/local/jdk

11)WORKDIR

语法格式:

WORKDIR <工作目录路径>

示例:

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar

12)USER

语法格式:

USER <用户名>[:<用户组>]
USER [:]

示例:

FROM busybox
RUN groupadd --system --gid=9999 admin && useradd --system --home-dir /home/admin --uid=9999 --gid=admin admin
USER admin:admin
# USER 9999:9999

13)EXPOSE

作用:

语法格式:

# 默认情况下,EXPOSE假定 TCP。
EXPOSE [/...]

示例:

EXPOSE 80/TCP 443/TCP
EXPOSE 80 443
EXPOSE 80/tcp
EXPOSE 80/udp

14)CMD

语法格式:

CMD 
CMD ["<可执行文件或命令>","","",...]
CMD ["","",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

示例:

CMD cat /etc/profile
CMD ["/bin/sh","-c","/etc/profile"]

15)ENTRYPOINT

语法格式:

# exec形式,这是首选形式:
ENTRYPOINT ["executable", "param1", "param2"]
# 外壳形式:
ENTRYPOINT command param1 param2

示例:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
# CMD作为ENTRYPOINT参数
CMD ["-c"]
# 与下面的等价
ENTRYPOINT ["top", "-b -c"]
ENTRYPOINT top -b -c

16)HEALTHCHECK

语法格式:

HEALTHCHECK [OPTIONS] CMD command(通过在容器内运行命令检查容器运行状况)
HEALTHCHECK NONE(禁用从基础映像继承的任何运行状况检查)

选项CMD有:

命令的exit status指示容器的运行状况。可能的值为:

示例:

FROM nginx
MAINTAINER Securitit
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
CMD ["usr/sbin/nginx", "-g", "daemon off;"]

17)ONBUILD

语法格式:

ONBUILD <其它指令>

示例:

FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]

18)LABEL

语法格式:

LABEL = = = ...

示例:比如我们可以添加镜像的作者

LABEL org.opencontainers.image.authors="runoob"

四、ARG 和 ENV 的区别

五、CMD,ENTRYPOINT,command,args 场景测试

当用户同时在 kubernetes 中的 yaml 文件中写了command和args的时候,默认是会覆盖DockerFile中的命令行和参数,完整的情况分类如下:

1)command 和 args 不存在场景测试

Dockerfile
FROM centos
COPY test.sh /
RUN chmod +x /test.sh
### ENTRYPOINT将作为的子命令启动/bin/sh -c,它不会传递参数,要传递参数只能这样传参
# ENTRYPOINT ["/bin/sh","-c","/test.sh ENTRYPOINT"]
ENTRYPOINT ["/test.sh","ENTRYPOINT"]
CMD ["CMD"]

/tmp/test.sh

#!/bin/bash
echo $*

构建

docker build -t test1:v1 -f Dockerfile .

yaml 编排

cat << EOF > test1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
nodeName: local-168-182-110
containers:
- name: test
image: test:v1
#command: ['/bin/sh','-c','/test.sh']
#args: ['args']
EOF

执行

kubectl apply -f test.yaml

2)command 存在,但 args 存在场景测试

cat << EOF > test2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test2
spec:
replicas: 1
selector:
matchLabels:
app: test2
template:
metadata:
labels:
app: test2
spec:
nodeName: local-168-182-110
containers:
- name: test2
image: test:v1
# ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部传参,不会输出hello,只能通过这样传参,['/bin/sh','-c','/test.sh command'];CMD里面的参数会被忽略
command: ['/test.sh']
# command带参数
# command: ['/test.sh','command']
#args: ['args']
EOF

3)command 不存在,但 args 存在场景测试

cat << EOF > test3.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test3
spec:
replicas: 1
selector:
matchLabels:
app: test3
template:
metadata:
labels:
app: test3
spec:
nodeName: local-168-182-110
containers:
- name: test3
image: test:v1
# ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部传参,不会输出hello,只能通过这样传参,['/bin/sh','-c','/test.sh command'];CMD里面的参数会被忽略
# command: ['/test.sh']
# command带参数
# command: ['/test.sh','command']
args: ['args']
EOF

4)command 和 args 都存在场景测试

cat << EOF > test4.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test4
spec:
replicas: 1
selector:
matchLabels:
app: test4
template:
metadata:
labels:
app: test4
spec:
nodeName: local-168-182-110
containers:
- name: test4
image: test:v1
# ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部传参,不会输出hello,只能通过这样传参,['/bin/sh','-c','/test.sh command'];CMD里面的参数会被忽略
# command: ['/test.sh']
# command带参数,command和args都会带上
command: ['/test.sh','command']
args: ['args']
EOF

镜像构建 Dockerfile 的介绍就到这里了!

来源:马哥Linux运维内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯