1、初始Dockerfile

Dockerfile就是用来构建docker镜像的构建文件,通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层。

#创建一个dockerfile文件,建议Dockerfile
#文件中的内容 指令(大写)
[root@node1 home]# mkdir volume-test-dockerfile
[root@node1 home]# cd volume-test-dockerfile/
[root@node1 volume-test-dockerfile]# vim dockerfile1
FROM centos

VOLUME ["volume1","volume2"]

CMD echo "build successful!"

CMD /bin/bash
[root@node1 volume-test-dockerfile]# docker build  . -f dockerfile1 -t hebye/centos:1.0 
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume1","volume2"]
 ---> Running in f3ae812daa0e
Removing intermediate container f3ae812daa0e
 ---> bdfd2a6ff2e9
Step 3/4 : CMD echo "build successful!"
 ---> Running in 4e94b99b2832
Removing intermediate container 4e94b99b2832
 ---> 4bf48b2265eb
Step 4/4 : CMD /bin/bash
 ---> Running in c1cde2fab20b
Removing intermediate container c1cde2fab20b
 ---> 3826c4d93e9f
Successfully built 3826c4d93e9f
Successfully tagged hebye/centos:1.0
#用自己生成的镜像启动容器
[root@node1 volume-test-dockerfile]# docker run -it --name test-volume hebye/centos:1.0 /bin/bash
[root@e705f8896c6e /]# ls
bin  etc   lib      lost+found  mnt  proc  run   srv  tmp  var      volume2
dev  home  lib64  media       opt  root  sbin  sys  usr  volume1
[root@e705f8896c6e /]# ls volume1/
[root@e705f8896c6e /]# ls volume2/
#这个卷和外部一定有一个同步的目录
[root@node1 ~]# docker inspect test-volume

2、数据卷容器

#多个mysql同步数据
#实现多个容器直接数据共享
#用我们生成的镜像,创建3个容器,实现3个容器直接数据共享
#创建容器1
[root@node1 ~]# docker run -it --name docker01 hebye/centos:1.0 
[root@d642ff0d8b90 /]# ls 
bin  etc   lib      lost+found  mnt  proc  run   srv  tmp  var      volume2
dev  home  lib64  media       opt  root  sbin  sys  usr  volume1
[root@d642ff0d8b90 /]# touch volume1/docker01

#创建容器2
[root@node1 ~]# docker run -it --name docker02 --volumes-from docker01 hebye/centos:1.0
[root@4767f772c643 /]# ls volume1/
docker01
[root@4767f772c643 /]# touch volume2/docker2
[root@4767f772c643 /]# 
#查看数据,数据共享

#创建容器3
[root@node1 ~]# docker run -it --name docker03 --volumes-from docker02 hebye/centos:1.0
[root@1a3065c64d9c /]# ls /volume1/
docker01
[root@1a3065c64d9c /]# ls /volume2/
docker2
[root@1a3065c64d9c /]# 
#结论:
#容器之间配置信息的传递,数据卷容器的声明周期一直持续到没有容器使用为止。
#但是一旦你持久化到了本地,这个时候,旧的的的数据是不会删除的。

3、构建步骤

构建步骤:

1、编写一个dockerfile文件

2、docker build构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(DockerHub,阿里云镜像仓库)

4、构建过程

1、每个保留关键字(指令)都必须大写字母

2、执行从上到下顺序执行

3、#表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交

docker是面向开发的,以后要发布项目,做镜像,就需要编写dockerfile文件。

Docker镜像逐渐成为企业交付的标准。

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImage:通过DockerFile构建生成的镜像,最终发布和运行的产品。

Docker容器:容器就是镜像运行起来提供服务。

5、DockerFile的指令

#
FROM            #基础镜像,一切从这里开始
MAINTAINER        #镜像维护者姓名或邮箱地址
RUN                #镜像构建的时候需要运行的命令
ADD                #添加内容
WORKDIR            #工作目录
VOLUME            #挂载的目录
EXPOST            #暴露端口
CMD                #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT        #指定这个容器启动的时候运行的命令,可以追加命令
ONBUILD            #当构建一个呗继承Dockerfile,这个时候就会运行ONBUILD的指令,触发指令
COPY            #类似ADD,将我们文件拷贝到镜像中
ENV                #构建的时候设置环境变量

6、构建镜像

#
[root@node1 dockerfile]# cat dockerfile-centos 
FROM centos
MAINTAINER hebye<xtyang@hebye.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ 
    echo 'Asia/Shanghai' >/etc/timezone

EXPOSE 80
CMD echo "$MYPATH"
CMD echo "build successful"
CMD /bin/bash
[root@node1 dockerfile]# 
root@node1 dockerfile]# docker build . -f dockerfile-centos  -t hebye/mycentos
#查看镜像的历史构建过程
docker histroy mycentos
#我们平时拿到一个镜像,可以研究一下它是怎么做的

7、CMD与ENTRYPOINT区别

#
CMD                #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT        #指定这个容器启动的时候运行的命令,可以追加命令
#测试CMD
#编写dockerfile文件
[root@node1 dockerfile]# cat dockerfile-cmd-test 
FROM centos
CMD ["ls","-a"]
[root@node1 dockerfile]# 
#构建镜像
docker build -f dockerfile-cmd-test  -t cmdtest .
#run运行,发现我们的ls -a 命令生效
[root@node1 dockerfile]# docker run cmdtest
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@node1 dockerfile]# 
#想追加一个命令-l ls -al
[root@node1 dockerfile]# docker run cmdtest -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.
[root@node1 dockerfile]# 
#cmd的 -l 命令 替换了CMD["ls","-a"]命令 -l不是命令,所有报错

#测试ENTRYPOINT
#编写dockerfile
[root@node1 dockerfile]# cat dockerfile-entrypoint-test 
FROM centos
ENTRYPOINT ["ls","-a"]
[root@node1 dockerfile]# docker build . -f dockerfile-entrypoint-test -t entrypoint

#运行容器,测试命令,发现追加命令是直接拼接在ENTRYPOINT命令的后面
[root@node1 dockerfile]# docker run entrypoint -l
total 0
drwxr-xr-x   1 root root   6 Mar 18 11:10 .
drwxr-xr-x   1 root root   6 Mar 18 11:10 ..
-rwxr-xr-x   1 root root   0 Mar 18 11:10 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 340 Mar 18 11:10 dev
drwxr-xr-x   1 root root  66 Mar 18 11:10 etc
drwxr-xr-x   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root   6 Nov  3 15:22 media
drwxr-xr-x   2 root root   6 Nov  3 15:22 mnt
drwxr-xr-x   2 root root   6 Nov  3 15:22 opt
dr-xr-xr-x 134 root root   0 Mar 18 11:10 proc
dr-xr-x---   2 root root 162 Dec  4 17:37 root
drwxr-xr-x  11 root root 163 Dec  4 17:37 run
lrwxrwxrwx   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3 15:22 srv
dr-xr-xr-x  13 root root   0 Mar 18 11:10 sys
drwxrwxrwt   7 root root 145 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 144 Dec  4 17:37 usr
drwxr-xr-x  20 root root 262 Dec  4 17:37 var
[root@node1 dockerfile]# 

8、Dockerfile制作Tomcat镜像

#
1、准备镜像文件 tomcat压缩包,jdk压缩包
2、编写dockerfile文件,官方命名为Dockerfile,build会自动寻找这个文件,就不需要-f指定文件了
touch readme.txt
[root@node1 tomcat]# cat Dockerfile 
FROM centos
MAINTAINER hebye<xtyang@hebye.com>
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ 
    echo 'Asia/Shanghai' >/etc/timezone
COPY readme.txt /usr/local
ADD apache-tomcat-8.0.32.tar.gz /usr/local
ADD jdk-8u221-linux-x64.tar.gz /usr/local
RUN yum -y install vim net-tools lrzsz 

ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_221
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.32
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.32
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080
CMD /usr/local/apache-tomcat-8.0.32/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.0.32/logs/catalina.out
[root@node1 tomcat]# 
3、构建镜像
[root@node1 tomcat]# docker build -t mytomcat .
4、启动镜像
[root@node1 tomcat]# docker run -d -p 9090:8080 --name hebye-tomcat -v /home/xtyang/tomcat/test:/usr/local/apache-tomcat-8.0.32/webapps/test  -v /home/xtyang/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.32/logs mytomcat
5、访问测试
http://10.4.7.99:9090/
6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
[root@node1 tomcat]# cd /home/xtyang/tomcat/test/
[root@node1 test]# cat meminfo.jsp 
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;

out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Free memory:"+fm+"MB"+"<br>");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>
[root@node1 test]# 
访问访问:
http://10.4.7.99:9090/test/meminfo.jsp
发现:项目部署成功,可以直接访问!
文档更新时间: 2021-03-18 21:15   作者:xtyang