数据卷容器
初识dockerfile
dockerfile就是用来构建docker镜像的构建文件
[root@docker-study home]# mkdir docker-test-volume[root@docker-study home]# cd docker-test-volume/#创建一个dockerfile文件,名字随意,建议dockerfile#在文件中写入指令[root@docker-study docker-test-volume]# vim dockerfile1#这里的每一条命令都是镜像的一层FROM centosVOLUME ["volume01","volume02"]CMD echo "-------end------"CMD /bin/bash[root@docker-study docker-test-volume]# docker build -f dockerfile1 -t ceshi/centos .Sending build context to Docker daemon 2.048kBStep 1/4 : FROM centos---> 5d0da3dc9764Step 2/4 : VOLUME ["volume01","volume02"]---> Running in a277d2596eafRemoving intermediate container a277d2596eaf---> b102111f7078Step 3/4 : CMD echo "-------end------"---> Running in 440895656d10Removing intermediate container 440895656d10---> 16c7d1d393dfStep 4/4 : CMD /bin/bash---> Running in 2a03a073477eRemoving intermediate container 2a03a073477e---> 9a5e455a4d31Successfully built 9a5e455a4d31Successfully tagged ceshi/centos:latest[root@docker-study docker-test-volume]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEceshi/centos latest 9a5e455a4d31 44 seconds ago 231MB[root@docker-study docker-test-volume]# docker run -it 9a5e455a4d31 /bin/bash
#运行自己做的镜像[root@docker-study ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEceshi/centos latest 9a5e455a4d31 2 hours ago 231MB[root@docker-study ~]# docker run -it 9a5e455a4d31 /bin/bash[root@docker-study ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES877b0cc03dca 9a5e455a4d31 "/bin/bash" 54 seconds ago Up 53 seconds great_hamilton[root@docker-study ~]# docker inspect 877b0cc03dca
在容器的卷内创建文件测试,可以在宿主机内查看到文件
数据卷容器
多个mysql同部数据

#启动三个容器,通过自己写的镜像启动#创建第一个容器[root@docker-study ~]# docker run -it --name docker01 9a5e455a4d31[root@113e6c9e9339 /]# ls -ltotal 56......drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume01drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume02#创建第二个容器[root@docker-study ~]# docker run -it --name docker02 --volumes-from docker01 9a5e455a4d31[root@165fd8d636b6 /]# ls -ltotal 56。。。。。。drwxr-xr-x 20 root root 4096 Sep 15 14:17 vardrwxr-xr-x 2 root root 4096 Feb 11 06:13 volume01drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume02#在第一个容器的卷里面创建文件,然后在容器2里面查看是否可以同步过去#1.查看容器ID[root@docker-study ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES165fd8d636b6 9a5e455a4d31 "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes docker02113e6c9e9339 9a5e455a4d31 "/bin/sh -c /bin/bash" 5 minutes ago Up 5 minutes docker01#2.进入docker01,并创建一个文件[root@docker-study ~]# docker attach 113e6c9e9339[root@113e6c9e9339 /]# echo hahahahaha > volume01/test.txt#3.进入docker02查看,发现文件已经同步过来了[root@docker-study ~]# docker attach 113e6c9e9339[root@113e6c9e9339 /]# cat volume01/test.txthahahahaha#创建第三个容器[root@docker-study ~]# docker run -it --name docker03 --volumes-from docker01 ceshi/centos[root@945bfaf1b976 /]# ls -ltotal 56。。。。。。drwxr-xr-x 2 root root 4096 Feb 11 06:20 volume01drwxr-xr-x 2 root root 4096 Feb 11 06:13 volume02[root@945bfaf1b976 /]# ls volume01test.txt[root@945bfaf1b976 /]# echo "docker03 test" > volume01/docker03.txt#退出docker03,进入到docker01,并查看文件是否同步完成[root@945bfaf1b976 /]# [root@docker-study ~]#[root@docker-study ~]# docker attach 113e6c9e9339[root@113e6c9e9339 /]# ls -l volume01total 8-rw-r--r-- 1 root root 14 Feb 11 06:28 docker03.txt-rw-r--r-- 1 root root 11 Feb 11 06:20 test.txt#删除docker01,查看docker02、03是否还能使用[root@docker-study ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES945bfaf1b976 ceshi/centos "/bin/sh -c /bin/bash" 4 minutes ago Up 4 minutes docker03165fd8d636b6 9a5e455a4d31 "/bin/sh -c /bin/bash" 16 minutes ago Up 16 minutes docker02113e6c9e9339 9a5e455a4d31 "/bin/sh -c /bin/bash" 18 minutes ago Up 18 minutes docker01#删除docker01[root@docker-study ~]# docker rm -f 113e6c9e9339113e6c9e9339#进入docker02并查看文件[root@docker-study ~]# docker attach 945bfaf1b976[root@945bfaf1b976 /]# ls -l volume01total 8-rw-r--r-- 1 root root 14 Feb 11 06:28 docker03.txt-rw-r--r-- 1 root root 11 Feb 11 06:20 test.txt#进入docker03并查看文件[root@docker-study ~]# docker attach 165fd8d636b6[root@165fd8d636b6 /]# ls -l volume01total 8-rw-r--r-- 1 root root 14 Feb 11 06:28 docker03.txt-rw-r--r-- 1 root root 11 Feb 11 06:20 test.txt
结论:数据卷容器的生命周期一直持续到没有容器使用为止,如果数据持久化到了本地是不会被删除的。
Dockerfile
dockerfile是用来构建docker镜像的文件,命令参数脚本
构建步骤
1、编写一个dockerfile文件
2、docker build构建成为一个镜像
3、docker run运行一个镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
查看一下官方是怎么做的

Dockerfile的构建过程
基础知识
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发的,发布镜像就需要编写dockerfile文件
DockerFile:构建文件,定义了一切步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的
DockerFile的指令

FROM #基础镜像 ,一切从这里构建MAINTAINER #镜像是谁写的,姓名+邮箱RUN #镜像构建的时候需要运行的命令ADD #步骤,比如Tomcat镜像,这里Tomcat的压缩包就是要添加的内容WORKDIR #镜像的工作目录VOLUME #挂载的目录位置EXPOSE #指定暴露端口CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD #当构建一个被继承Dockerfile的时候,就会运行ONBUILD的指令。触发指令COPY #类似ADD命令,将文件拷贝到镜像中ENV #构建的时候设置环境变量
实战测试
Docker Hub中大部分镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置进行构建

#创建一个自己的centOS[root@docker-study ~]# mkdir dockerfile[root@docker-study ~]# vim mydockerfile-centos[root@docker-study ~]# cat mydockerfile-centosFROM centosMAINTAINER me<88888@qq.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATHCMD echo "----------end----------"CMD /bin/bash[root@docker-study ~]# docker build -f mydockerfile-centos -t mycentos:0.1 .此处报错尚未解决,宿主机系统centos7,容器镜像下载的7.9此处报错Linux8,appstream这些报错不理解Step 5/10 : RUN yum -y install vim---> Running in 60e3f59ba034CentOS Linux 8 - AppStream 46 B/s | 38 B 00:00Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlistThe command '/bin/sh -c yum -y install vim' returned a non-zero code: 1
CDM和ENTRYPOINT的区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令#创建一个CMD测试镜像[root@docker-study ~]# vim dockerfile-cmd-test[root@docker-study ~]# cat dockerfile-cmd-testFROM centosCMD ["ls","-a"][root@docker-study ~]# docker build -f dockerfile-cmd-test -t cmdtest .Sending build context to Docker daemon 80.9kBStep 1/2 : FROM centos---> 5d0da3dc9764Step 2/2 : CMD ["ls","-a"]---> Using cache---> 7dd3820076faSuccessfully built 7dd3820076faSuccessfully tagged cmdtest:latest#执行测试[root@docker-study ~]# docker run 7dd3820076fa....dockerenvbindevetchomeliblib64lost+foundmediamntopt#追加一个命令[root@docker-study ~]# docker run 7dd3820076fa -ldocker: 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中["ls","-a"] 命令,不是一个完整命令所以报错
测试ENTRYPOINT
[root@docker-study ~]# vim dockerfile-cmd-entrypointtest[root@docker-study ~]# docker build -f dockerfile-cmd-entrypointtest -t entrypoint-test .Sending build context to Docker daemon 81.92kBStep 1/2 : FROM centos---> 5d0da3dc9764Step 2/2 : ENTRYPOINT ["ls","-a"]---> Running in 83ff4c8c4adeRemoving intermediate container 83ff4c8c4ade---> b92863976e15Successfully built b92863976e15Successfully tagged entrypoint-test:latest[root@docker-study ~]# docker run b92863976e15....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar#追加命令是直接可以追加到entrypoint构建的镜像后面的[root@docker-study ~]# docker run b92863976e15 -ltotal 56drwxr-xr-x 1 root root 4096 Feb 12 03:19 .drwxr-xr-x 1 root root 4096 Feb 12 03:19 ..-rwxr-xr-x 1 root root 0 Feb 12 03:19 .dockerenvlrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bindrwxr-xr-x 5 root root 340 Feb 12 03:19 devdrwxr-xr-x 1 root root 4096 Feb 12 03:19 etcdrwxr-xr-x 2 root root 4096 Nov 3 2020 homelrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/liblrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64drwx------ 2 root root 4096 Sep 15 14:17 lost+founddrwxr-xr-x 2 root root 4096 Nov 3 2020 mediadrwxr-xr-x 2 root root 4096 Nov 3 2020 mntdrwxr-xr-x 2 root root 4096 Nov 3 2020 optdr-xr-xr-x 94 root root 0 Feb 12 03:19 procdr-xr-x--- 2 root root 4096 Sep 15 14:17 rootdrwxr-xr-x 11 root root 4096 Sep 15 14:17 runlrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbindrwxr-xr-x 2 root root 4096 Nov 3 2020 srvdr-xr-xr-x 13 root root 0 Feb 10 09:08 sysdrwxrwxrwt 7 root root 4096 Sep 15 14:17 tmpdrwxr-xr-x 12 root root 4096 Sep 15 14:17 usrdrwxr-xr-x 20 root root 4096 Sep 15 14:17 var
实战:Tomcat镜像
1、准备镜像文件 Tomcat压缩包,jdk的压缩包
2、编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件就不需要-f指定了
[root@docker-study tomcat]# pwd/root/build/tomcat[root@docker-study tomcat]# lltotal 154688-rw-r--r-- 1 root root 11579528 Feb 12 11:48 apache-tomcat-9.0.58.tar.gz-rw-r--r-- 1 root root 146815279 Feb 12 11:48 jdk-8u321-linux-x64.tar.gz[root@docker-study tomcat]# touch readme.txt[root@docker-study tomcat]# vim Dockerfile[root@docker-study tomcat]# cat DockerfileFROM centos:7 #此处如果写centos会报错MAINTAINER me<8888@qq.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u321-linux-x64.tar.gz /usr/localADD apache-tomcat-9.0.58.tar.gz /usr/localRUN yum -y install vimENV MYPATH /usr/localWORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_321ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.58ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out#创建镜像[root@docker-study tomcat]# docker build -t diytomcat .。。。。Successfully built 9e518e7c352bSuccessfully tagged diytomcat:latest[root@docker-study tomcat]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdiytomcat latest 9e518e7c352b 7 minutes ago 796MB[root@docker-study build]# docker run -it -p 9090:8080 --name diytomcat -v /home/build/tomcat/test:/usr/local/apache-tomcat-9.0.58/webapps/test -v /home/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.58/logs diytomcat#这个报错好像不用管,确认容器起来了就行tail: cannot open '/usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out' for reading: No such file or directorytail: cannot watch parent directory of '/usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out': No such file or directorytail: inotify cannot be used, reverting to polling#进入容器查看[root@5216f95820ac local]# lltotal 52drwxr-xr-x 1 root root 4096 Feb 12 10:41 apache-tomcat-9.0.58drwxr-xr-x 2 root root 4096 Apr 11 2018 bindrwxr-xr-x 2 root root 4096 Apr 11 2018 etcdrwxr-xr-x 2 root root 4096 Apr 11 2018 gamesdrwxr-xr-x 2 root root 4096 Apr 11 2018 includedrwxr-xr-x 8 10143 10143 4096 Dec 15 19:30 jdk1.8.0_321drwxr-xr-x 2 root root 4096 Apr 11 2018 libdrwxr-xr-x 2 root root 4096 Apr 11 2018 lib64drwxr-xr-x 2 root root 4096 Apr 11 2018 libexec-rw-r--r-- 1 root root 0 Feb 12 03:51 readme.txtdrwxr-xr-x 2 root root 4096 Apr 11 2018 sbindrwxr-xr-x 5 root root 4096 Nov 13 2020 sharedrwxr-xr-x 2 root root 4096 Apr 11 2018 src#确认Tomcat起来了[root@5b1fc5c271c3 local]# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 11:08 pts/0 00:00:00 /bin/sh -c /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-toroot 14 1 2 11:08 pts/0 00:00:02 /usr/local/jdk1.8.0_321/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcatroot 15 1 0 11:08 pts/0 00:00:00 tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.outroot 42 0 0 11:10 pts/1 00:00:00 /bin/bashroot 59 42 0 11:10 pts/1 00:00:00 ps -ef#在宿主机访问测试,也可以浏览器IP:端口访问[root@docker-study ~]# curl localhost:9090<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><title>Apache Tomcat/9.0.58</title><link href="favicon.ico" rel="icon" type="image/x-icon" /><link href="tomcat.css" rel="stylesheet" type="text/css" /></head>。。。。。。。
发布自己的镜像
发布到DockerHub
1、注册自己的账号 地址:https://hub.docker.com/
#需要先登录[root@docker-study ~]# docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in to a Docker registry.If no server is specified, the default is defined by the daemon.Options:-p, --password string Password--password-stdin Take the password from stdin-u, --username string Username#登录到自己的hub.docker账户后发布镜像[root@docker-study ~]# docker push 账户名/diytomcat:版本号Using default tag: latestThe push refers to repository [docker.io/library/diytomcat]6afe6382943f: Pushing [=> ] 6.03MB/210.5MB27a70cce5e52: Pushing [============> ] 4.013MB/16.06MBd1acb98e4e50: Pushing [> ] 2.751MB/365.3MB84c6af1e8525: Pushed174f56854903: Pushing [=> ]。。。。。。。
