容器数据卷
初识Dockerfile
命令脚本→构建镜像→启动容器→查看
Dockerfile 就是用来构建docker镜像 的构建文件!就是命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个命令,每个命令都是一层!
#创建一个dockerfile文件,名字可以随机,建议就用dockerfile #文件中的内容 指令(都是大写) 参数 FROM centos #基于centos镜像 VOLUME ["volume01","volume02"] #匿名挂载,容器内的目录 CMD echo "----end----" CMD /bin/bash #这里的每个命令都是镜像的一层 #构建镜像 docker build -f /home/docker-test-volume/dockerfile1 -t duanqiao/centos .
#启动自己写的容器 docker run -it 镜像ID /bin/bash
这个卷和外部一定有一个同步的目录!
cd volume01 #进入volume01 touch container.txt #新建文件
查看一下卷的挂载路径
docker inspect 容器ID
测试一下刚才的文件是否同步出去了
这种方式未来用的特别多,因为我们通常会自己构建镜像
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
数据卷容器
docker run -it --name docker02 --volumes-from docker01 duanqiao/centos
多个MySQL同步数据
--volumes-from #启动三个容器,通过自己构建的镜像 docker run -it --name docker01 duanqiao/centos #启动docker01 docker run -it --name docker02 --volumes-from docker01 duanqiao/centos #(镜像ID) #启动docker02并挂载到docker01,此时docker01就是数据卷容器 #测试在docker01内的volume01下创建文件docker01.txt,在docker02下的volume01 查看 docker run -it --name docker03 --volumes-from docker01 duanqiao/centos #测试在docker03内的volume01下创建文件docker03.txt,在docker01和docker02下的volume01 查看
#测试:删除docker01,在docker02和docker03下查看文件还在不在 #测试依旧可以访问
多个mysql实现数据共享
[root@localhost home]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 [root@localhost home]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7 #mysql02挂载到mysql01 # 这个时候,可以实现两个容器数据同步!
结论:
容器之间配置信息的传递,数据卷容器的生命周期是一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这时候本地数据是不会丢失的
Dockerfile
dockerfile介绍
dockerfile是用来构建docker镜像文件的文件!它就是一个命令脚本
构建步骤: 1. 编写一个dockerfile文件 2. docker build 构建成为一个镜像 #docker build -f /home/docker-test-volume/dockerfile1 -t duanqiao/centos . 3. docker run 运行镜像 #docker run -it --name docker01 duanqiao/centos 4. docker push 发布镜像(dockerhub 阿里云镜像库)
查看一下官方是怎么做的
很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,能我们一样可以!
Dockerfile构建过程
基础知识
-
每个保留关键字(指令)都是必须大写字母
-
执行从上到下顺序执行
-
#
表示注释 -
每个指令都会创建提交一个新的镜像层,并提交
DockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!
Docker镜像逐渐成为企业的交互标准,必须要掌握!
步骤:开发,部署, 运维… 缺一不可!
DockerFile: 构建文件, 定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!
docker build -f /dockerfile文件路径 -t 名称标签
Docker容器:容器就是镜像运行起来提供服务器
dockerfile指令
FROM #基础镜像,一切从这里开始构建 MAINTAINER #镜像是谁写的,姓名+邮箱 RUN #镜像构建的时候需要运行的命令 ADD #步骤:tomcat镜像,这个tomcat的压缩包,添加内容 WORKDIR #镜像的工作目录 VOLUME #挂载的目录 EXPOSE #暴露的端口 CMD #指定这个容器启动时运行的命令 例:CMD echo,只有最后一个会生效,可被替代 #例 ls -a docker run ls -l 就会直接替换-a ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令 #例 ls -a docker run ls -l ls -a -l ONBUILD #当构建一个被继承的dockerfile的时候就会运行ONBUILD的指令。触发指令(了解即可) COPY #类似ADD,将我们的文件拷贝到镜像中 ENV #构建的时候设置环境变量
实战测试
Dockerhub中90%的镜像都是从这个FROM scratch基础镜像 开始的
创建一个自己的centos
#1 编写dockerfile文件 [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# cat mydockerfile FROM centos #基于centos创建 MAINTAINER duanqiao<1173232150@qq.com> #镜像是谁写的,名字+邮箱 ENV MYPATH /usr/loacl WORKDIR $MYPATH RUN yum -y install vim #安装vim编辑器 RUN yum -y install net-tools #安装ifconfig命令 EXPOSE 80 #暴露80端口 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash dokcer build -f mydockerfile -t juyou/centos . #ERROR: failed to solve: process “/bin/sh -c yum -y install vim“ did not complete s.... #是因为Docker默认拉取的是centos最新版,此时需要我们指定一下拉取的版本就比如:docker pull docker pull centos:7.9.2009 FROM centos:7 MAINTAINER duanqiao<1173232150@qq.com> #镜像是谁写的,名字+邮箱 ENV MYPATH /usr/loacl WORKDIR $MYPATH RUN yum -y install vim #安装vim编辑器 RUN yum -y install net-tools #安装ifconfig命令 EXPOSE 80 #暴露80端口 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash
问题:
解决:
#2. 通过这个文件构建镜像 # 命令 docker build -f mydockerfile(dockerfile 文件路径) -t juyou/centos 镜像名:[tag] #3. 测试运行
与原生centos对比:进去之后是根目录,没有ifconfig、vim
我们可以列出本地进行的变更历史
# 命令 docker history IMAGE ID docker history REPOSITORY:[TAG] # 需要指定版本号,不然默认最新找不到 # 研究一下 mycentos 怎么做的?
CMD和ENTRYPOINT的区别
CMD #指定这个容器启动时运行的命令 例:CMD echo,只有最后一个会生效,可被替代 #例 ls -a docker run ls -l 就会直接替换-a ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令 #例 ls -a docker run ls -l ls -a -l
# 测试CMD vim docker-cmd-test FROM centos CMD ["ls","-a"] # 构建镜像 docker build -f docker-cmd-test -t cmd/centos . #run 运行,发现我们的命令ls -a生效 [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run 7d202bdf002b . .. .dockerenv bin dev etc home lib lib64 #想追加一个命令 -l,理想的影视 ls -al [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run 7d202bdf002b -l docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown. #用CMD的情况下 -l 替换了CMD ["ls","-a"]这条命令,而-l不是命令所以报错
#测试ENTRYPOINT vim dockerfile-ENT-test FROM centos ENTRYPOINT ["ls","-a"] #构建镜像 出现了一个小错误,原因镜像名称必须小写 [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker build -f dockerfile-ENT-test -t ENT/centos . [+] Building 0.0s (0/0) docker:default ERROR: failed to solve: invalid reference format: repository name must be lowercase [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker build -f dockerfile-ENT-test -t ent/centos . [+] Building 0.0s (5/5) FINISHED docker:default => [internal] load build definition from dockerfile-ENT-test 0.0s => => transferring dockerfile: 82B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/centos:latest 0.0s => CACHED [1/1] FROM docker.io/library/centos 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:b325f5b972337e763ad3b2c0f1a720eb2d5b11a39b3d88008cc5a0 0.0s => => naming to docker.io/ent/centos #run运行,追加命令之后发现了不一样, [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run ent/centos . .. .dockerenv bin dev etc home lib lib64 [root@iZbp12ek0pnkij5zwark6lZ dockerfile]# docker run ent/centos -l total 0 drwxr-xr-x 1 root root 6 Jul 11 07:13 . drwxr-xr-x 1 root root 6 Jul 11 07:13 .. -rwxr-xr-x 1 root root 0 Jul 11 07:13 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x 5 root root 340 Jul 11 07:13 dev drwxr-xr-x 1 root root 66 Jul 11 07:13 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
实战Tomcat镜像
#上传apache-tomcat-9.0.65.tar.gz jdk-8u371-linux-x64.tar.gz
-
准备镜像文件tomcat压缩包,jdk的压缩包
-
编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了
#编写dockerfile文件 [root@iZbp12ek0pnkij5zwark6lZ tomcat]# cat Dockerfile FROM centos MAINTAINER duanqiao<1173232150@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u371-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.65.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_11 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.65 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.65 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.65/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.65/bin/logs/catalina.out
-
构建镜像
docker build -t diytomcat . #由于Dockerfile是官方命名,所以不需要-f