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

运行上述代码可以访问:

 

暂时告一段落。。。

原文地址:https://www.cnblogs.com/lxc116317/p/11813405.html