一.docker参数表格
|------------|---------------------------------|
| FROM | 指定基础镜像(Dockerfile 首行必选) |
| COPY | 复制本地文件 / 目录到容器(仅本地文件,不解压) |
| ADD | 复制文件(支持压缩包自动解压、URL 下载) |
| RUN | 构建镜像时执行命令(分层构建,建议合并指令) |
| ENV | 设置容器环境变量(构建 / 运行时生效) |
| EXPOSE | 声明容器暴露的端口(仅文档说明,需配合-p映射) |
| VOLUME | 声明数据卷(指定容器持久化目录) |
| WORKDIR | 设置容器工作目录(后续指令基于此路径) |
| CMD | 容器启动时执行的命令(可被docker run后参数覆盖) |
| ENTRYPOINT | 容器启动入口命令(不可覆盖,搭配 CMD 传参) |
建立构建目录
cpp
[root@docker1 ~]# mkdir docker
[root@docker1 ~]# cd docker
e
编写构建规则文件
cpp
[root@docker1 docker]# vim Dockerfil
FROM busybox:latest #基于最新版 busybox 镜像来构建新镜像
LABEL Creater=xu #给这个镜像打上一个标签,说明创建者是 xu
COPY xurui /root #将宿主机(构建上下文)中的文件 / 目录复制到容器内
#FROM
cpp
FROM busybox:latest
#COPY
cpp
[root@docker1 docker]# echo xurui > xurui
[root@docker1 docker]# cat xurui
xurui
#LABEL
cpp
LABEL creater=xu
构建命令
cpp
[root@docker1 docker]# docker build -t xurui:v1 .
[+] Building 10.5s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 152B 0.0s
=> [internal] load metadata for docker.io/library/busybox:latest 10.3s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 98B 0.0s
=> [1/2] FROM //这里注意from docker.io/library/busybox:latest@sha256:b3255e7dfbcd10cb367af0d409747d511aeb66 0.0s
=> => resolve docker.io/library/busybox:latest@sha256:b3255e7dfbcd10cb367af0d409747d511aeb66 0.0s
=> [2/2] COPY xurui /root //这里注意copy 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => exporting manifest sha256:6707f769a477264b76eab883c61010567642270baf30d91bf10bf78a466e 0.0s
=> => exporting config sha256:91684f258507156d94ffbcad7392562e63c03ff5180be0f6c692dbfb51d9d3 0.0s
=> => exporting attestation manifest sha256:e66906a082da033f8eb06112ab797e35ee317476cf6e7fe6 0.0s
=> => exporting manifest list sha256:dfaf1890cf682829e7e1351f74393f602d66c077f584f5cfc796b4d 0.0s
=> => naming to docker.io/library/xurui:v1 0.0s
=> => unpacking to docker.io/library/xurui:v1
#ADD
注意add和copy的区别就是前者能解压缩,后者不行
cpp
[root@docker1 docker]# tar zcf bin.tar.gz /bin
tar: Removing leading `/' from member names
#编写文件
[root@docker1 docker]# vim Dockerfile
FROM busybox:latest
LABEL Creater=xu
COPY bin.tar.gz /root
ADD bin.tar.gz /mnt
#构建镜像
[root@docker1 docker]# docker build -t xu:v2 .
#测试
[root@docker1 docker]# docker run -it --name test --rm xu:v2
/ # ls /root/ #copy底下的/root命令不能解压缩该文件
bin.tar.gz
/ # ls /mnt/ #add底下的/mnt命令能解压缩该文件
bin
/ # exit
#ENV
cpp
[root@docker1 docker]# vim Dockerfile
FROM busybox:latest
LABEL Creater=xu
ENV NAME=xurui
RUN ["/bin/sh","-c", "touch /root/$NAME" ] 调用 /bin/sh 执行 touch /root/$NAME 命令,利用环境变量 $NAME 自动替换为 xurui,最终在 /root 目录下创建一个名为xurui 的空文件
#构建镜像
[root@docker1 docker]# docker build -t xu:v3 .
#测试
[root@docker1 docker]# docker run -it --name test --rm xu:v3
/ # ls /root/
xurui
#EXPOSE
cpp
[root@docker1 docker]# vim Dockerfile
FROM busybox:latest
LABEL creater=xu
EXPOSE 8080
[root@docker1 docker]# docker build -t xu:v4 .
[root@docker1 docker]# docker history xu:v4
IMAGE CREATED CREATED BY SIZE COMMENT
c6872b2ccb25 18 months ago EXPOSE [8080/tcp] #暴露其8080端口 0B buildkit.dockerfile.v0
<missing> 18 months ago LABEL creater=xu 0B buildkit.dockerfile.v0
<missing> 18 months ago BusyBox 1.37.0 (glibc), Debian 13 4.49MB
#VOLUEM
cpp
[root@docker1 docker]# vim Dockerfile
FROM busybox:latest
LABEL creater=xu
VOLUME "/mnt"
构建镜像
[root@docker1 docker]# docker build -t xu:v5 .
测试
[root@docker1 docker]# docker run -it --name test --rm xu:v5
在新建一个新的窗口执行以下命令
[root@docker1 ~]# docker inspect test | grep -i mounts -A10
"Mounts": [
{
"Type": "volume",
"Name": "acfc6547891db3b8bc72b0851790c7ade019b0c0e2e59d957537f6895def9c79",
"Source": "/var/lib/docker/volumes/acfc6547891db3b8bc72b0851790c7ade019b0c0e2e59d957537f6895def9c79/_data",
"Destination": "/mnt",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
#WORKDIR
cpp
[root@docker1 docker]# vim Dockerfile
FROM busybox:latest
LABEL Creater=xu
WORKDIR "/mnt"
[root@docker1 docker]# docker build -t xu:v6 .
[root@docker1 docker]# docker run -it --name test --rm xu:v6
/mnt #
#CMD
cpp
[root@docker1 docker]# vim Dockerfile
FROM busybox:latest
LABEL creater=xu
CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
解析:
/bin/sh:调用 shell 解释器。
-c:告诉 shell 从后续字符串中读取并执行命令。
/bin/echo $NAME:执行 echo 命令,输出环境变量 $NAME 的值。
[root@docker1 docker]# docker build -t xu:v7 .
[root@docker1 docker]# docker run -it --name test --rm xu:v7 echo haha
haha
#ENTRYPOINT
cpp
[root@docker1 docker]# vim Dockerfile
FROM busybox:latest
LABEL creater=xu
ENV NAME=xu
ENTRYPOINT ["echo", "$NAME"]
[root@docker1 docker]# docker build -t xu:v8 .
[root@docker1 docker]# docker run -it --name test --rm xu:v8
#数据不可覆盖
[root@docker1 docker]# docker run -it --name test --rm xu:v8 echo haha
$NAME echo haha
[root@docker1 docker]# docker run -it --name test --rm xu:v8 echo test
$NAME echo test