DockerFile
初识DockerFile
DockerFile 是用来构建 docker镜像的构建文件! 命令脚本!
#创建dockerfile文件 名字随意 建议dockerfiel‘
#文件中的内容 格式[指令 参数]
FROM centos
VOLUM ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash
#这里的每个命令就是一层
[root@Graht docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t graht/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 67a7ac9f38fb
Removing intermediate container 67a7ac9f38fb
---> 2de68b2918af
Step 3/4 : CMD echo "---end---"
---> Running in 836657ec6857
Removing intermediate container 836657ec6857
---> 2248735efc1d
Step 4/4 : CMD /bin/bash
---> Running in 1ecc93fb6766
Removing intermediate container 1ecc93fb6766
---> ad6b61f7d98c
Successfully built ad6b61f7d98c
Successfully tagged graht/centos:latest
#启动自己新建的镜像会发现/home文件夹下有volume01和volume02两个文件
#因为挂载的时候没起名字所以是匿名挂载 在volume01下创建一个文件
#docker inspect 容器id 查看详细信息会发现mounts有两个挂载
#进入volume01所指定的文件位置查看是否有文件
#如果有说明挂载成功
DockerFile
dockerfile是用来构建docker镜像的文件 命令参数脚本
编写一个dockerfile文件
docker builder 构建成为一个镜像
docker run 运行镜像
docker push 发布镜像(DockerHub、阿里云镜像仓库)
DockerFile的指令
FROM #基础镜像,一切都是从这里开始构造
MAINTAINER #镜像作者, 格式姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包就是添加的内容
WORKDIR #镜像的工作目录
VOLUME #设置容器卷 挂载位置
EXPOSE #对外指定端口
RUN #容器启动后要干的事
CMD #指定容器启动时候要运行的命令 只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动时候要运行的命令 可以追加命令
ONBUILD #当构建一个被继承 dockerfile 就会运行onbuild指令
COPY #类似ADD 将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
测试:
Docker Hub中99%都是从基础镜像过来的 FROM scratch
创建一个自己的centos
#编写dockerfile文件
[root@Graht dockerFile]# vim mydockerfile-centos
[root@Graht dockerFile]# cat mydockerfile-centos
FROM centos:7 #这里如果是默认他就会下载最新版本
MAINTAINER graht<430702238@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
#通过这个build命令构建镜像
#命令 docker buildre -f 文件路径 -t 镜像名:tag(版本信息) .
#最后出现success 说明创建成功
Successfully built 83208c45503e
Successfully tagged mycentos:0.1
#测试运行
##镜像更改名字或加版本信息就用docker tag 名字:tag
列出本地的变更历史
docker history 镜像id
[root@Graht dockerFile]# docker history mycentos:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
83208c45503e 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
2eb6417db08c 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
1adeedccc22b 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
f41335402ed4 9 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
3b1bb7562993 9 minutes ago /bin/sh -c yum -y install net-tools 161MB
53447d578129 9 minutes ago /bin/sh -c yum -y install vim 216MB
e36009722e57 10 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
7b9fcc6ddc4d 10 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
0f70a186628a 10 minutes ago /bin/sh -c #(nop) MAINTAINER graht<43070223… 0B
eeb6ee3f44bd 5 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
CMD 和 ENTRYPOINT 的区别
CMD #指定容器启动时候要运行的命令 只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动时候要运行的命令 可以追加命令
测试cmd
[root@Graht dockerFile]# vim dockerfile-cmdtest
[root@Graht dockerFile]# cat dockerfile-cmdtest
FROM centos:7
CMD ["ls","-a"]
[root@Graht dockerFile]# docker build -f dockerfile-cmdtest -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos:7
---> eeb6ee3f44bd
Step 2/2 : CMD ["ls","-a"]
---> Running in ff2bd30ddc18
Removing intermediate container ff2bd30ddc18
---> 47786c45e9ee
Successfully built 47786c45e9ee
Successfully tagged cmdtest:latest
#运行发现ls -a 命令生效
[root@Graht dockerFile]# docker run 47786c45e9ee
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
####################################
#如果这个时候我们想追加一个 -l [ls -al]
[root@Graht dockerFile]# docker run 47786c45e9ee -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
#cmd的情况下 -l代替了 CMD ["ls","-a"] 命令,-l不是命令所以报错
##当在后面追加ls -al 就成功替换成了 ls -al 所以可以打印
[root@Graht dockerFile]# docker run 47786c45e9ee ls -al
total 64
drwxr-xr-x 1 root root 4096 Mar 13 06:44 .
drwxr-xr-x 1 root root 4096 Mar 13 06:44 ..
-rwxr-xr-x 1 root root 0 Mar 13 06:44 .dockerenv
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Mar 13 06:44 dev
drwxr-xr-x 1 root root 4096 Mar 13 06:44 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 92 root root 0 Mar 13 06:44 proc
dr-xr-x--- 2 root root 4096 Nov 13 2020 root
drwxr-xr-x 11 root root 4096 Nov 13 2020 run
lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Mar 11 02:12 sys
drwxrwxrwt 7 root root 4096 Nov 13 2020 tmp
drwxr-xr-x 13 root root 4096 Nov 13 2020 usr
drwxr-xr-x 18 root root 4096 Nov 13 2020 var
测试 ENTRYPOINT
[root@Graht dockerFile]# vim dockerfile-testentrypoint
[root@Graht dockerFile]# cat dockerfile-testentrypoint
FROM centos:7
ENTRYPOINT ["ls","-a"]
[root@Graht dockerFile]# docker build -f dockerfile-testentrypoint -t entrypointtest .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos:7
---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in c06f64062c94
Removing intermediate container c06f64062c94
---> 3f3d3ca1e9f0
Successfully built 3f3d3ca1e9f0
Successfully tagged entrypointtest:latest
#启动发现ls -a命令生效
[root@Graht dockerFile]# docker run 3f3d3ca1e9f0
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#此时我们再次测试在末尾追加-l 机会拼接成 ls -al 命令生效
[root@Graht dockerFile]# docker run 3f3d3ca1e9f0 -l
total 64
drwxr-xr-x 1 root root 4096 Mar 13 06:53 .
drwxr-xr-x 1 root root 4096 Mar 13 06:53 ..
-rwxr-xr-x 1 root root 0 Mar 13 06:53 .dockerenv
-rw-r--r-- 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Mar 13 06:53 dev
drwxr-xr-x 1 root root 4096 Mar 13 06:53 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 91 root root 0 Mar 13 06:53 proc
dr-xr-x--- 2 root root 4096 Nov 13 2020 root
drwxr-xr-x 11 root root 4096 Nov 13 2020 run
lrwxrwxrwx 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Mar 11 02:12 sys
drwxrwxrwt 7 root root 4096 Nov 13 2020 tmp
drwxr-xr-x 13 root root 4096 Nov 13 2020 usr
drwxr-xr-x 18 root root 4096 Nov 13 2020 var
Tomcat镜像
1、准备镜像文件
[root@Graht tomcat]# ls
apache-tomcat-9.0.59.tar.gz jdk-8u202-linux-x64.tar.gz
readme.txt
2、编写dockerfile文件名字最好是Dockerfile 因为Dockerfile是官方默认的文件名会自动识别
[root@Graht tomcat]# cat Dockerfile
FROM centos:7
MAINTAINER graht<430702238@qq.com> #作者信息
COPY readme.txt /usr/local/readme.txt #复制文件到容器
ADD jdk-8u202-linux-x64.tar.gz /usr/local/ #添加并解压文件
ADD apache-tomcat-9.0.59.tar.gz /usr/local/
RUN yum -y install vim #yum下载vim
ENV MYPATH /usr/local/ #配置初始工作目录
WORKDIR $MYPATH
#配置java和tomcat环境
ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.59
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.59
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#开启端口
EXPOSE 8080
#开启启动tomcat以及日志
CMD /usr/local/apache-tomcat-9.0.59/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.95/bin/logs/catalina.out
3、构建镜像文件
docker build -t diytomcat .
4、启动测试
[root@Graht tomcat]# docker run -d -p 9000:8080 --name grahttomcat -v /home/graht/build/tomcat/test/:/usr/local/apache-tomcat-9.0.59/webapps/test/ -v /home/graht/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.59/log diytomcat
#浏览器访问公网ip:9000端口
5、发布项目
#在挂载的目录下建立WEB-INF目录和index.jsp
[root@Graht test]# ls
index.jsp WEB-INF
#index.jsp文件
[root@Graht test]# cat index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>GrahtTomcat</title>
</head>
<body>
<h1>HelloGraht</h1>
<%
System.out.println("---hello---");
%>
</body>
</html>
#在WEB-INF下新建web.xml文件
[root@Graht WEB-INF]# ls
web.xml
#web.xml下面的文件
[root@Graht WEB-INF]# cat web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
6、浏览器启动测试
#浏览器访问公网ip:9000/test/
完成啦
发布到阿里云镜像服务上
登录阿里云 找到容器镜像服务 创建命名空间 创建容器镜像==>弹出一个基本信息页面上面写的很详细
#先登录 [docker login --username=你的阿里云全名 registry.cn-hangzhou.aliyuncs.com]
#给镜像加名字版本信息
#[docker tag 镜像id 名字:tag]
#发布 [docker push 镜像名:tag]