#dockerfile 是用来创建docker镜像的文件!命令参数脚本
#构建步骤
- 编写一个dockerfile文件
- 通过docker build 构建成为一个镜像
- docker run 运行镜像
- docker push发布镜像(Dockerhub,阿里云镜像仓库)
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 从上到下的执行顺序
- # 表示注释
- 每一个指令都会创建并提交一个新的镜像层
#dockerfile的指令
- FROM #指定基础镜像
- MAINTAINER #镜像是谁写的 姓名+邮箱
- RUN #镜像构建的时候需要运行的命令
- ADD #步骤,假设是要构建Tomcat ,则这里需要添加tmocat压缩包! #添加内容
- WORKDIR #镜像工作目录
- VOLUME #挂载的目录
- EXPOSE #暴露端口配置
- CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
- ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
- ONBUILD #当构建一个被继承 dockerfile,这个时候就会运行ONBUILD 的指令 ,触发指令
- COPY #类似ADD命令,将文件拷贝到镜像中
- ENV #构建的时候,设置环境变量
#先创建一个Dockerfile文件
[root@localhost home]# ls
docker-test-volume mysql test xiezuotao
[root@localhost home]# cd docker-test-volume/
[root@localhost docker-test-volume]# touch Dockerfile
#利用vim编辑器打开Dockerfile编写一些脚本命令
FROM centos
VOLUME ["volume01","volume02"] #匿名挂载
CMD echo"------end------"
CMD /bin/bash
#这里的每条命令就是一层镜像
#docker build 构建成为一个镜像
[root@localhost docker-test-volume]# docker build -f Dockerfile -t Xiezuotao/centos .
[+] Building 0.1s (5/5) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 186B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/1] FROM docker.io/library/centos:latest 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:c7f4fa28ada6acbe53815124afe81f122d5d040144b8714dfe44aa92cef31804 0.0s
=> => naming to Xiezuotao/centos 0.0s
[root@localhost docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat01 1.0 f65a7f9467f5 5 hours ago 684MB
nginx latest 605c77e624dd 2 years ago 141MB
tomcat latest fb5657adc892 2 years ago 680MB
mysql latest 3218b38490ce 2 years ago 516MB
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
Xiezuotao/centos latest c7f4fa28ada6 2 years ago 231MB
centos latest 5d0da3dc9764 2 years ago 231MB
portainer/portainer latest 580c0e4e98b0 2 years ago 79.1MB
#查看数据卷目录
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Feb 19 13:56 dev
drwxr-xr-x. 1 root root 66 Feb 19 13:56 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 253 root root 0 Feb 19 13:56 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Feb 19 07:28 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
drwxr-xr-x. 2 root root 6 Feb 19 13:56 volume01
drwxr-xr-x. 2 root root 6 Feb 19 13:56 volume02
#volume01和volume02目录是生成镜像时候自动挂载的,数据卷目录
#这个卷和外部一定有一个同步的目录!
#查看一下卷挂载路径
#docker inspect 容器id
"Mounts": [
{
"Type": "volume",
"Name": "59f2ab5cebb6a0b6c3cdfca6fb315e183821d15422386ff5edf34241f2243536",
"Source": "/var/lib/docker/volumes/59f2ab5cebb6a0b6c3cdfca6fb315e183821d15422386ff5edf34241f2243536/_data", #容器外的目录
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "68eefb22bf39765bd1c1ecc5d453857aed4a1014471f8a10ae87b66cfac10810",
"Source": "/var/lib/docker/volumes/68eefb22bf39765bd1c1ecc5d453857aed4a1014471f8a10ae87b66cfac10810/_data", #容器外的目录
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
#测试一下文件是否同步出去
#在volume02处创建一个container.txt文件
[root@3ffed92190ff home]# cd /volume02
[root@3ffed92190ff volume02]# ls
[root@3ffed92190ff volume02]# touch container.txt
[root@3ffed92190ff volume02]# ls
container.txt
#在宿主机中查看
[root@localhost _data]# cd /var/lib/docker/volumes/59f2ab5cebb6a0b6c3cdfca6fb315e183821d15422386ff5edf34241f2243536/_data
[root@localhost _data]# ls
container.txt
这种方式使用多!!! 构建自己的镜像!
假设构建镜像时没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
#创建一个自己的centos
#1,编写dockerfile文件
FROM centos:7
MAINTAINER xiezuotao<2806897453@qq.com>
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-------end--------"
CMD /bin/bash
#2,通过这个文件构建镜像
#命令 docker build -f dockerfile文件路径 -t 镜像名[tag]
[root@localhost dockerfile]# docker build -f mydockerfile -t mycentos .
[+] Building 55.4s (8/8) FINISHED docker:default
=> [internal] load build definition from mydockerfile 0.0s
=> => transferring dockerfile: 324B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 16.3s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/4] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 12.0s
=> => resolve docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 0.0s
=> => sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 1.20kB / 1.20kB 0.0s
=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B 0.0s
=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB 0.0s
=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB 8.2s
=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 3.6s
=> [2/4] WORKDIR /user/local 0.1s
=> [3/4] RUN yum -y install vim 22.1s
=> [4/4] RUN yum -y install net-tools 2.5s
=> exporting to image 2.0s
=> => exporting layers 2.0s
=> => writing image sha256:4029b853692571236d7a5023df41cbd614b353e4de0f33c8842190591960cee9 0.0s
=> => naming to docker.io/library/mycentos
#3,测试运行
工作目录:默认为根目录
可以列出本地镜像的变更历史
[root@localhost dockerfile]# docker history 4029b8536925
IMAGE CREATED CREATED BY SIZE COMMENT
4029b8536925 12 minutes ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0
<missing> 12 minutes ago CMD ["/bin/sh" "-c" "echo \"-------end------… 0B buildkit.dockerfile.v0
<missing> 12 minutes ago CMD ["/bin/sh" "-c" "echo $MYPATH"] 0B buildkit.dockerfile.v0
<missing> 12 minutes ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 12 minutes ago RUN /bin/sh -c yum -y install net-tools # bu… 208MB buildkit.dockerfile.v0
<missing> 12 minutes ago RUN /bin/sh -c yum -y install vim # buildkit 296MB buildkit.dockerfile.v0
<missing> 12 minutes ago WORKDIR /user/local 0B buildkit.dockerfile.v0
<missing> 12 minutes ago ENV MYPATH=/user/local 0B buildkit.dockerfile.v0
<missing> 12 minutes ago MAINTAINER xiezuotao<2806897453@qq.com> 0B buildkit.dockerfile.v0
<missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
可以通过docker history 镜像id/镜像名来查看暴露端口
通过docker history 镜像id/镜像名 可以分析一下镜像是如何做的