目录
我们可以列出本地进行的变更历史 docker history id
初识DockerFile
dockerfile 就是用来构建 docker 的构建工具! 命令脚本
通过这个脚本可以生成镜像,镜像是一层一层的,脚本的一个个命令,每一个命令就是一层
准备工作
#创建一个文件夹 miker docker-test-volume
[root@gh docker-test-volume]# pwd
/home/docker-test-volume
#创建一个dockerfile文件, 名字可以随意的 建议 dockerfile
#在此目录下创建文件 vim dockerfile1
#文件中的内容 脚本 指令都是(大写) 参数
[root@gh docker-test-volume]# cat dockerfile1
FROM centos
VOLUME ["volume01","volume02"] # 匿名挂载
CMD echo "------end----"
CMD /bin/bash
#这里的每个命令,就是镜像的一层
建造
#建造
build #建造,构建
-f #通过什么文件来构建 指的是dockerfile1的地址
-t #生成镜像
docker build -f dockerfiel1 -t gh/centos . 镜像名前面不能有/
[root@gh docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t gh/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 4054c62bb0a3
Removing intermediate container 4054c62bb0a3
---> bc7a985144b6
Step 3/4 : CMD echo "------end----"
---> Running in 0ccf028a5bcf
Removing intermediate container 0ccf028a5bcf
---> 410a0fd04303
Step 4/4 : CMD /bin/bash
---> Running in 16d863cb2355
Removing intermediate container 16d863cb2355
---> cacef2eba361
Successfully built cacef2eba361
Successfully tagged gh/centos:latest
[root@gh docker-test-volume]#
查看镜像
[root@gh docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gh/centos latest cacef2eba361 4 minutes ago 231MB
centos latest 5d0da3dc9764 6 months ago 231MB
启动自己写的容器
[root@gh docker-test-volume]# docker run -it cacef2eba361 /bin/bash
[root@abc64ad16f61 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 360 Mar 21 03:46 dev
drwxr-xr-x 1 root root 4096 Mar 21 03:46 etc
drwxr-xr-x 2 root root 4096 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 4096 Sep 15 2021 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 2020 media
drwxr-xr-x 2 root root 4096 Nov 3 2020 mnt
drwxr-xr-x 2 root root 4096 Nov 3 2020 opt
dr-xr-xr-x 106 root root 0 Mar 21 03:46 proc
dr-xr-x--- 2 root root 4096 Sep 15 2021 root
drwxr-xr-x 11 root root 4096 Sep 15 2021 run
lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 2020 srv
dr-xr-xr-x 13 root root 0 Mar 21 03:46 sys
drwxrwxrwt 7 root root 4096 Sep 15 2021 tmp
drwxr-xr-x 12 root root 4096 Sep 15 2021 usr
drwxr-xr-x 20 root root 4096 Sep 15 2021 var
drwxr-xr-x 2 root root 4096 Mar 21 03:46 volume01
drwxr-xr-x 2 root root 4096 Mar 21 03:46 volume02
这个卷和外部一定有一个同步的目录!
DockerFile介绍
dockerfile 就是用来构建 docker 的构建工具! 命令脚本
构架步骤:
1、编写一个 dockerfile 文件
2、docker build 构建一个镜像
3、docker run 运行一个镜像
4、docker push 发布镜像(Docker Hub 、阿里云镜像仓库)
DockerFile的构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序
3、#表示注释
4、每一个指令都会创建提交一个新的镜像曾,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
步骤:开发。部署、运维。。。缺一不可
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
DockerFile的指令
FROM # from:基础镜像,一切从这里开始构建
MAINTAINER # maintainer:镜像是谁写的, 姓名+邮箱
RUN # run:镜像构建的时候需要运行的命令
ADD # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # workdir:镜像的工作目录
VOLUME # volume:挂载的目录
EXPOSE # expose:保留端口配置
CMD # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令
COPY # copy:类似ADD,将我们文件拷贝到镜像中
ENV # env:构建的时候设置环境变量!
实战测试:
构建自己的centos
Docker Hub中99%镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行的构建
官方centos镜像
# 初始目录是根目录 没有vim 和 ficonfig
[root@gh ~]# docker run -it centos
[root@ef06d26faed3 /]# pwd
/
[root@ef06d26faed3 /]# vim
bash: vim: command not found
[root@ef06d26faed3 /]# ifconfig
bash: ifconfig: command not found
[root@ef06d26faed3 /]#
构建自己的centos镜像
编写dockerfile文件
[root@gh dockerfile]# pwd
/home/dockerfile
[root@gh dockerfile]# vim mydockerfile-centos
FROM centos:centos7 # 基础镜像
MAINTAINER gh<2495140780@qq.com> # 镜像谁写的
ENV MYPATH /usr/local # 环境变量
WORKDIR $MYPATH # 工作目录
RUN yum -y install vim # 执行yum install
RUN yum -y install net-tools
EXPOSE 80 # 暴露端口 80
CMD echo $MYPATH # 输出 MYPATH
CMD echo "---end---" # 输出 ---end---
CMD /bin/bash # 进入哪个命令行
构建镜像
[root@gh dockerfile]# docker build -f mydockerfile-centos -t mycentos .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos:centos7
---> eeb6ee3f44bd
Step 2/10 : MAINTAINER gh<2495140780@qq.com>
---> Running in b407d7f8f9de
Removing intermediate container b407d7f8f9de
---> 15887db2e09a
Step 3/10 : ENV MYPATH /usr/local
---> Running in f80aa6b7841c
Removing intermediate container f80aa6b7841c
---> e0d0868b9233
Step 4/10 : WORKDIR $MYPATH
---> Running in c21baf5e97c1
Removing intermediate container c21baf5e97c1
---> 50a7bdb40b70
Step 5/10 : RUN yum -y install vim
---> Running in 4599fc04fef4
........
Step 6/10 : RUN yum -y install net-tools
---> Running in 0b53256d68c1
Step 7/10 : EXPOSE 80
---> Running in 4a04122bd97c
Removing intermediate container 4a04122bd97c
---> 09d2fb3ba294
Step 8/10 : CMD echo $MYPATH
---> Running in 5bdcadb8a2cc
Removing intermediate container 5bdcadb8a2cc
---> 464b57806c04
Step 9/10 : CMD echo "---end---"
---> Running in 00b262f8523e
Removing intermediate container 00b262f8523e
---> d984bd39b5fb
Step 10/10 : CMD /bin/bash
---> Running in d827409c4ce5
Removing intermediate container d827409c4ce5
---> e35f53cf074a
Successfully built e35f53cf074a
Successfully tagged mycentos:latest
查看镜像
[root@gh dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 709e14a0127a 23 seconds ago 231MB
运行镜像
出现问题
解决方法
centos last 默认版本是8版本 需要改成centos7
[root@gh dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos7 eeb6ee3f44bd 6 months ago 204MB
我们可以列出本地进行的变更历史 docker history id
CMD 和 ENTRYPOINT 区别
CMD # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
# 编写dockerfile文件
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"] # 启动后执行 ls -a 命令
# 构建镜像
$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
# 运行镜像
$ docker run cmd-test:0.1 # 由结果可得,运行后就执行了 ls -a 命令
.
..
.dockerenv
bin
dev
etc
home
# 想追加一个命令 -l 成为ls -al:展示列表详细数据
$ docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
# cmd的情况下 -l 替换了CMD["ls","-a "] 而 -l 不是命令所以报错
测试ENTRYPOINT
# 编写dockerfile文件
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
$ docker build -f dockerfile-test-entrypoint -t cmd-test:0.1 .
# 运行镜像
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
实战tomcat文件
1、准备镜像文件
readme.txt 帮助文档
2、编写Dokerfile文件
官方命名 Dockfile buil自动会寻找这个文件,就不需要- f 指定了
$ vim dockerfile
FROM centos # 基础镜像centos
MAINTAINER cao<1165680007@qq.com> # 作者
COPY README /usr/local/README # 复制README文件
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ # 添加jdk,ADD 命令会自动解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ # 添加tomcat,ADD 命令会自动解压
RUN yum -y install vim # 安装 vim 命令
ENV MYPATH /usr/local # 环境变量设置 工作目录
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_231 # 环境变量: JAVA_HOME环境变量
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 # 环境变量: tomcat环境变量
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35
# 设置环境变量 分隔符是:
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080 # 设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 设置默认命令
#自己的
FROM centos:centos7
MAINTAINER gh<2495140780@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u311-linux-x64.tar.gz /usr/local
ADD apache-tomcat-10.0.16.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk-8u311
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.16
ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.16
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-10.0.16/startup.sh && tail -F /url/local/apache-tomcat-10.0.16/bin/logs/catalina.out
3、构建镜像
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
[root@gh dockerfile]# docker build -t diytomcat .
[root@gh dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest fe2bf1d54863 2 minutes ago 801MB
4、run镜像
# -v:绑定路径webapps(test文件发布文件位置) 和 logs 日志文件
[root@gh dockerfile]# docker run -d -p 8090:8080 --name diytomcat01 -v /home/dockerfile/tomcat/test:/url/local/apache-tomcat-10.0.16/webapps/test -v/home/dockerfile/tomcat/logs:/url/local/apache-tomcat-10.0.16/logs diytomcat
648ad59a6e4917c17d4d1fb30d8209d954256c4d9df4fd20344f2b8fd396cd28
5、查看一下
[root@gh dockerfile]# docker exec -it e23bb17424f2 /bin/bash
[root@e23bb17424f2 local]# pwd
/usr/local
[root@e23bb17424f2 local]# ls -l
total 52
drwxr-xr-x 3 root root 4096 Mar 22 13:55 aegis
drwxr-xr-x 1 root root 4096 Mar 22 12:47 apache-tomcat-10.0.16
drwxr-xr-x 2 root root 4096 Apr 11 2018 bin
drwxr-xr-x 2 root root 4096 Apr 11 2018 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 games
drwxr-xr-x 2 root root 4096 Apr 11 2018 include
drwxr-xr-x 8 10143 10143 4096 Sep 27 12:29 jdk1.8.0_311
drwxr-xr-x 2 root root 4096 Apr 11 2018 lib
drwxr-xr-x 2 root root 4096 Apr 11 2018 lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 libexec
-rw-r--r-- 1 root root 0 Mar 22 11:05 readme.txt
drwxr-xr-x 2 root root 4096 Apr 11 2018 sbin
drwxr-xr-x 5 root root 4096 Nov 13 2020 share
drwxr-xr-x 2 root root 4096 Apr 11 2018 src
[root@e23bb17424f2 local]# cd a
aegis/ apache-tomcat-10.0.16/
[root@e23bb17424f2 local]# cd appachpache-tomcat-10.0.16
bash: cd: appachpache-tomcat-10.0.16: No such file or directory
[root@e23bb17424f2 local]# clear
[root@e23bb17424f2 local]# pwd
/usr/local
[root@e23bb17424f2 local]# ls -l
total 52
drwxr-xr-x 3 root root 4096 Mar 22 13:55 aegis
drwxr-xr-x 1 root root 4096 Mar 22 12:47 apache-tomcat-10.0.16
drwxr-xr-x 2 root root 4096 Apr 11 2018 bin
drwxr-xr-x 2 root root 4096 Apr 11 2018 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 games
drwxr-xr-x 2 root root 4096 Apr 11 2018 include
drwxr-xr-x 8 10143 10143 4096 Sep 27 12:29 jdk1.8.0_311
drwxr-xr-x 2 root root 4096 Apr 11 2018 lib
drwxr-xr-x 2 root root 4096 Apr 11 2018 lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 libexec
-rw-r--r-- 1 root root 0 Mar 22 11:05 readme.txt
drwxr-xr-x 2 root root 4096 Apr 11 2018 sbin
drwxr-xr-x 5 root root 4096 Nov 13 2020 share
drwxr-xr-x 2 root root 4096 Apr 11 2018 src
[root@e23bb17424f2 local]# cd apache-tomcat-10.0.16
[root@e23bb17424f2 apache-tomcat-10.0.16]# ls -l
total 152
-rw-r----- 1 root root 19004 Jan 15 13:19 BUILDING.txt
-rw-r----- 1 root root 6210 Jan 15 13:19 CONTRIBUTING.md
-rw-r----- 1 root root 60269 Jan 15 13:19 LICENSE
-rw-r----- 1 root root 2333 Jan 15 13:19 NOTICE
-rw-r----- 1 root root 3378 Jan 15 13:19 README.md
-rw-r----- 1 root root 6905 Jan 15 13:19 RELEASE-NOTES
-rw-r----- 1 root root 16517 Jan 15 13:19 RUNNING.txt
drwxr-x--- 2 root root 4096 Jan 15 13:19 bin
drwx------ 1 root root 4096 Mar 22 13:54 conf
drwxr-x--- 2 root root 4096 Jan 15 13:19 lib
drwxr-x--- 1 root root 4096 Mar 22 13:58 logs
drwxr-x--- 2 root root 4096 Jan 15 13:19 temp
drwxr-x--- 7 root root 4096 Jan 15 13:19 webapps
drwxr-x--- 1 root root 4096 Mar 22 13:54 work
[root@e23bb17424f2 apache-tomcat-10.0.16]#
6、内部测试
7、外部测试
8、测试(发布项目)
做了数据卷挂载、直接在本地编写就可以发布!
小结:![](https://i-blog.csdnimg.cn/blog_migrate/29df084aad839e27dbf849424f33d7a2.png)