DockerFile学习
Dockerfile 简介
==dockerfile==是用来构建docker镜像的文件!命令参数脚本! 构建步骤:
- 编写一个dockerfile文件
- docker build 构建为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、阿里云仓库)
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
dockerfile 构建过程
基本常识:
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下的顺序
3、# 表示注释
4、每一个指令都会创建一个新的镜像,并提交
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
DockerFile 的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
创建一个自己的centos
Docker Hub中 99% 的镜像都是从这个基础镜像来的 FROM scratch,然后需要软件和配置来进行的构建。
创建一个自己的 centos
FROM centos
MAINTAINER nanju<duan-nan@qq.com>
ENV MYPATH /usr/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 文件路径 -t 镜像名:[tag] .
docker build -f mydockerfile-centos -t mycentos:0.1 .
接下来我们可以通过docker images来查看镜像,发现我们刚才构建的镜像已经出现了!
然后我们启动运行我们自定义的镜像:(docker run -it mycentos:0.1)
运行之后我们发现,vim和ifconfig 都已经可以成功使用了
关于 CMD 与 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
CMD测试:
# 构建镜像
[root]# docker build -f dockerfile-cmd -t cmd:0.1 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
---> Running in 958506b8fa80
Removing intermediate container 958506b8fa80
---> 7de895557eb2
Successfully built 7de895557eb2
Successfully tagged cmd:0.1
# 查看本地镜像,发现cmd构建成功
[root]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cmd 0.1 7de895557eb2 8 seconds ago 209MB
mycentos 0.1 e525317a9c3a 17 hours ago 299MB
nginx latest d1a364dc548d 6 weeks ago 133MB
tomcat 9.0 c43a65faae57 7 weeks ago 667MB
tomcat latest c43a65faae57 7 weeks ago 667MB
redis latest bc8d70f9ef6c 7 weeks ago 105MB
mysql latest c0cdc95609f1 7 weeks ago 556MB
portainer/portainer latest 580c0e4e98b0 3 months ago 79.1MB
centos latest 300e315adb2f 7 months ago 209MB
elasticsearch 7.6.2 f29a1ee41030 15 months ago 791MB
# 运行镜像 发现执行了 ls-a 的命令
[root]# docker run cmd:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 如果进行命令的追加则会发生报错 例如追加了 -l 的命令
[root]# docker run cmd:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
ENTRTYPOINT 测试:
# 构建镜像
[root]# docker build -f dockerfile-entrypoint -t entrypoint:0.1 .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 4ea807a517e5
Removing intermediate container 4ea807a517e5
---> a524b4cef79e
Successfully built a524b4cef79e
Successfully tagged entrypoint:0.1
# 查看本地镜像目录
[root]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
entrypoint 0.1 a524b4cef79e 10 seconds ago 209MB
cmd 0.1 7de895557eb2 32 minutes ago 209MB
mycentos 0.1 e525317a9c3a 18 hours ago 299MB
nginx latest d1a364dc548d 6 weeks ago 133MB
tomcat 9.0 c43a65faae57 7 weeks ago 667MB
tomcat latest c43a65faae57 7 weeks ago 667MB
redis latest bc8d70f9ef6c 7 weeks ago 105MB
mysql latest c0cdc95609f1 7 weeks ago 556MB
portainer/portainer latest 580c0e4e98b0 3 months ago 79.1MB
centos latest 300e315adb2f 7 months ago 209MB
elasticsearch 7.6.2 f29a1ee41030 15 months ago 791MB
#运行镜像
[root]# docker run entrypoint:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 追加命令成功
[root]# docker run entrypoint:0.1 -l
total 0
drwxr-xr-x 1 root root 6 Jul 7 06:35 .
drwxr-xr-x 1 root root 6 Jul 7 06:35 ..
-rwxr-xr-x 1 root root 0 Jul 7 06:35 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Jul 7 06:35 dev
drwxr-xr-x 1 root root 66 Jul 7 06:35 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 Dec 4 2020 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 127 root root 0 Jul 7 06:35 proc
dr-xr-x--- 2 root root 162 Dec 4 2020 root
drwxr-xr-x 11 root root 163 Dec 4 2020 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 Jul 7 06:35 sys
drwxrwxrwt 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x 12 root root 144 Dec 4 2020 usr
drwxr-xr-x 20 root root 262 Dec 4 2020 va
Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果!
使用dockerFile 构建一个 Tomcat
- 准备安装包
- 编写 dockerfile 文件(官方命名==Dockerfile==)
FROM centos
# 作者名以及作者邮箱
MAINTAINER nanju<duan-nan@qq.com>
# Copy命令执行
COPY readme.md /usr/local/readme.md
# 安装命令
ADD jdk-8u291-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.50.tar.gz /usr/local/
# 安装vim
RUN yum -y install vim
# 配置环境变量
ENV MYPATH /usr/local
WORKDIR $MYPATH
# jdk 配置
ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# tomcat 配置
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.50
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.50
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 暴露端口
EXPOSE 8080
# 启动项目
CMD /usr/local/apache-tomcat-9.0.50/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.50/bin/logs/catalina.out
- 构建我们自定义的镜像
[root]# docker build -f Dockerfile -t diy .
Sending build context to Docker daemon 156.5MB
Step 1/14 : FROM centos
---> 300e315adb2f
Step 2/14 : MAINTAINER nanju<duan-nan@qq.com>
---> Running in b1de4c72b64c
Removing intermediate container b1de4c72b64c
---> c08cd7c2d910
Step 3/14 : COPY readme.md /usr/local/readme.md
---> ca128212d746
Step 4/14 : ADD jdk-8u291-linux-x64.tar.gz /usr/local/
---> 8defb59c907e
Step 5/14 : ADD apache-tomcat-9.0.50.tar.gz /usr/local/
---> b51ee79a02ae
Step 6/14 : ENV MYPATH /usr/local
---> Running in 2836f0a92fc3
Removing intermediate container 2836f0a92fc3
---> 81430d36b842
Step 7/14 : WORKDIR $MYPATH
---> Running in 5c486e398bd2
Removing intermediate container 5c486e398bd2
---> 547cf68fff80
Step 8/14 : ENV JAVA_HOME /usr/local/jdk1.8.0_291
---> Running in e711e9461df2
Removing intermediate container e711e9461df2
---> f0cec38fd5aa
Step 9/14 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
---> Running in d341bb0a01d5
Removing intermediate container d341bb0a01d5
---> 8eb740d7ed0f
Step 10/14 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.50
---> Running in d0f6766015af
Removing intermediate container d0f6766015af
---> db15184ab284
Step 11/14 : ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.50
---> Running in 3346b3cf3456
Removing intermediate container 3346b3cf3456
---> 5d3ffc6e627c
Step 12/14 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
---> Running in 6ce5e2b9cd3a
Removing intermediate container 6ce5e2b9cd3a
---> 9fef093cbddc
Step 13/14 : EXPOSE 8080
---> Running in d6eccf76593c
Removing intermediate container d6eccf76593c
---> 6c30eefb3e7d
Step 14/14 : CMD /usr/local/apache-tomcat-9.0.50/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.50/bin/logs/catalina.out
---> Running in 3cdfafe57328
Removing intermediate container 3cdfafe57328
---> f41341c036a3
Successfully built f41341c036a3
Successfully tagged diy:latest
- 查看我们的镜像
- 运行我们的镜像
- 测试访问
树苗如果因为怕痛而拒绝修剪,那就永远不会成材。