docker基础全面讲解
31、为什么会有docker出现?
安装的时候,把原始环境一模一样的复制过来,开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题
2、Docker
一次构建,处处运行
一句话:
3、Docker安装:
Docker三要素:
镜像、容器、仓库
镜像:
镜像相当于类、容器相当于对象。
容器:
仓库:
文档详细安装docker步骤(centOS 7):https://docs.docker.com/install/linux/docker-ce/centos/
镜像加速器:
docker run hello-world:
运行过程:
4、docker相关命令(常用命令)
帮助命令:
镜像命令:
docker images
docker images -a
docker search +"镜像名字":如docker search tomcat
docker pull +"镜像名字":拉取镜像,如docker pull tomcat
docker rmi -f +"镜像名字":删除镜像
镜像删除
容器命令
运行镜像,docker run -it "镜像ID",之后进入镜像容器,如下图中所标柱的是容器ID
docker ps:是列出当前所有正在运行的容器
dokcer rm -f $(docker ps -q):是删除当前所有正在运行的容器
docker run -it “镜像ID” 就是登录docker里面对应的镜像
如下所示:
启动关闭的容器:docker start "容器id或容器名"
重启容器:docker restart "容器id或容器名"
如果使用docker stop的话停止时间较长,如果使用docker kill的话会立即停止。
容器删除
容器删除与镜像删除有区别:
docker rmi是删除镜像,docker rm 是删除容器。
重要
1、命令docker run -d "镜像"
前台交互:docker run -it,伪终端
不与前台交互:docker run -d
2、查看容器日志:
启动进程,此时docker ps,会发现容器并没退出,因为与前台进行了交互,有命令显示在终端
3、查看容器内运行的进程
4、进入正在运行的容器并以命令行交互,下面以退出容器的第二种方式来进行说明
a、attach命令重新进入退出的容器
b、exec命令重新进入退出的容器
使用exec时,相当于进入了这个容器里面做了这么一件事,将结果返回给宿主机
当在后面加上/bin/bash时,结果和使用attach是一样的效果,都可以进入退出的容器,所以exec比attach的功能要大一些。
5、从容器内拷贝文件到主机上
注意容器ID后面需要加上双引号,双引号后面跟的是需要复制文件的路径,再后面的是文件复制到目标路径
docker 镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统叫UnionFS(联合文件系统)
为什么tomcat镜像会有500M这么大呢?
下面就是解释,tomcat镜像是由多层文件系统构成(分层镜像)
为什么Docker镜像要采用这种分层结构呢?
Tomcat启动:
小写的p是指定端口
大写的p是随机端口
通过在浏览器中输入ip://8888得出,说明tomcat启动成功,并已经映射端口成功
当是大写的-P时:
docker run -it -P tomcat
可以看出是随机分配的端口:32769,经测试,也是成功的
commit提交
演示:
1、docker pull tomcat下载tomcat镜像到本地并成功运行
2、故意删除上一步镜像生产tomcat容器的文档
3、
格式:
commit总结:docker commit提交容器副本使之成为一个新的镜像,好处就是可以自定义自己所需要的镜像
容器数据卷
容器卷添加
a、直接命令添加:
查看容器卷是否挂载成功
通过docker inspect 容器id来查看,若有如下所示情况,则挂载成功
挂载成功后会在容器与宿主机之间实现数据共享。
容器停止退出后,主机修改后数据也是同步的.
附:容器退出后(exit),重新进入:
1、docker ps -l,得出退出的容器
2、然后获取容器ID,docker start 容器ID
3、重新进入容器ID
ro:read only(只读),只允许主机单向操作,不允许容器操作
b、DockerFile添加:
DcokerFile可以说是对镜像源码级的描述,它有自己的一套语法规则。
1、根目录下新建mydockerwen文件夹并进入:
2、可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
3、File构建
#volumn test
FROM centos
VOLUME ["/dataVolumnContainer1","/dataVolumnContainer2"]
CMD echo "finished,---------success1"
CMD /bin/bash
4、build后生成镜像
注意:这个是在容器下面的,宿主机里面并没有生成的目录
所以需要考虑这样是否具有与宿主机进行双向通信的可能?
基于这种考虑,宿主机也考虑到了,会有默认路径存在
DockerFiile解析
下面是centos的dockerFile文件
执行流程:
DockerFile构建过程解析小总结:
1、dokcerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
案例:
2、构建三步骤:
a、编写DockerFile文件
FROM centos
ENV mypath /usr/local
WORKERDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash
b、docker build
c、docker run
pwd后,进入的是自定义的落脚点
即落脚点生效
命令解释:
1、DockerFile中可以有多个CMD指令,但只有最后一个CMD生效,CMD会被docker run 之后的参数替换
比对tomcat的DockerFile文件可知,在CMD ["catalina.sh","run"]后面加上了CMD ls -l,是将前者给抵消,所以tomcat未启动。
2、ENTRYPOINT
docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合。
制作CMD版本可以查询IP信息的容器
从上面可以看出这个是有问题的。
制作ENTRYPOINT版本的可以查询IP信息的容器
以下就解决了-i的问题
3、命令综合应用
自定义镜像tomcat8
a、编写dockerfile文件
FROM centos
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把Java与tomcat添加到容器中
ADD jdk-8u231-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.47.tar.gz /usr/local
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置Java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_231
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.47
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.47
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听时的端口
EXPOSE 8080
#启动运行tomcat
#ENTRYPOINT ["/usr/local/apache-tomcat-8.5.47/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-8.5.47/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-8.5.47/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.47/bin/logs/catalina.out
其中COPY与ADD的区别是:
COPY只是单纯的复制,ADD是复制加解压缩
b、build
c、运行(宿主机与容器卷进行双向通信)
docker run -d -p 9080:8080 --name ltm8
-v /mydocker/tomcat9/test:/usr/local/apache-tomcat-8.5.47/webapps/test
-v /mydocker/tomcat9/tomcat9logs:/usr/local/apache-tomcat-8.5.47/logs --privileged=true
tomcat-lxc
运行上述代码可以访问:
暂时告一段落。。。