Docker深入
前面讲解了Docker的基本概念以及Docker的安装,还简单跑了一个例子,相信能够对Docker有一个大致的了解
本章将对Docker进一步的探索
DockerFile
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
DockerFile就是用来构建Docker镜像的,现在DockerHub上面有很多镜像,但是有时候我们会根据需求来自定义镜像,(比如说我们要改造Centos)常用两种方法:
- 我们在DockerHub上面拉取一个镜像下来,然后进入容器里面进行修改,接着进行docker commit(形成新的一个镜像)
- 我们自己编写DockerFile文件,因为所有镜像本质都是DockerFile,编写完自己构建出一个镜像
DockerFile和 docker commit 的区别:
DockerFile更加灵活,我可以随时根据需求来更改我的文件而docker commit,不具备重复性,什么意思呢,就是说,在DockerFile我不要一个东西,只是删除一行就好了(因为这是构建文件,我把某一块去掉就可以了),但是如果用docker commit就不行了,你安装了好些东西,要删除可能得一个个卸载,而且有时候你想要回复到之前某个点的,就非常困难了,所以:构建镜像不推荐docker commit,请使用DockerFile
构建DockerFile三步骤
- 编写DockerFile文件
- docker build
- docker run
写一个例子吧:
新建一个DockerFile文件编写以下内容
From centos
ENV mypath /tmp
WORKDIR $mypath
EXPOSE 80
CMD /bin/bash
执行docker build命令
我这里遇到过一个小问题,很多也遇到了,就是build的时候报错
docker build -f 文件所在的位置 -t 名字:版本号 .
如果文件在当前目录下可以省略-f
$ docker build -f /dockerFile/DockerFile -t mycentos:2.2 .
重要的事情说三遍
最后面有小数点!!!
最后面有小数点!!!
最后面有小数点!!!
//不加小数点报错:
$ "docker build" requires exactly 1 argument(s).
//没启动docker报错:
$ Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
可以看到当前的目录是tmp,因为我构建镜像的时候就设置了WORKDIR
简单的例子讲完了:
现在看看常用的构建文件命令:
- FROM 基础镜像,当前镜像是基于哪个镜像,可以想象成类与类之间的继承关系
- MAINTAINER,镜像的维护者的姓名和邮箱地址
- RUN,容器构建时需要运行的命令
- EXPOSE,当前容器对外暴露出的端口
- WORKDIR,指定创建容器后,终端默认登陆进来的工作目录
- ENV,用来构建镜像过程中设置环境变量
- ADD,将宿主机的目录下的文件拷贝到镜像里面并且ADD命令会自动处理URL和解压tar
- COPY,类似ADD,拷贝文件和目录到镜像中。<源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
- VOLUME,容器数据卷,用于保存和持久化工作
- CND,指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,会被docker run 后面的参数给覆盖
- ENTRYPOINT,和CMD一样是指定一个容器启动时要运行的命令,区别在于不会被覆盖,都能执行
- ONBUILD,当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
这个可能就需要多做才能熟悉其命令了
比如说我们拉取的Centos都是比较纯净的
怎么说呢,什么东西都没有装就对了
比如下面
From centos//继承原生centos
RUN yum -y install vim //安装vim
CMD /bin/bash //docker run的时候执行 /bin/bash
最后写一个命令稍微复杂一点的
#继承原生Tomcat
FROM centos
#设置作者和邮箱
MAINTAINER ymbcxb<353560278@qq.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local中
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD apache-tomcat-9.0.17.tar.gz /usr/local/
ADD jdk-8u201-linux-x64.tar.gz /usr/local/
#安装VIM编辑器
RUN yum -y install vim
#设置工作访问时候的落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置Java与Tomcat的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.17
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.17
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat用ENTRYPOINT 和 CMD都可以
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.17/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.17/bin/startup.sh","run"]
#启动tomcat并且打印日志
CMD /usr/local/apache-tomcat-9.0.17/bin/startup.sh && tail - F /usr/local/apache-tomcat-9.0.17/bin/logs/catalina.out
温馨提示:记得将对应的Jar包和Tomcat的包和c.txt放到当前目录下
运行
$ docker run -it -p 9080:8080 -d mytomcat:1.0
然后在浏览器输入对应的网址就可以看到,LinuxIp:9080
执行以下命令进入
$ docker exec -it cotainerId /bin/bash
查看到是存在cincontainer.txt
总结:
关于命令的学习,还是需要多琢磨琢磨,比如你可以手写一个Centos(安装了openssh)这样子,下次你需要用虚拟机的时候只用开启多一个容器,就够了就可以进行SSH连接来玩,玩坏了不过删容器而已,比传统的下载一个虚拟机镜像要方便多了,大大大大大地提高学习效率。