docker初学小结

基础概念

百度:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
教程:docker:解决了运行环境和配置问题软件容器,方便做持续集成化并有助于整体发布的容器虚拟化技术
小白理解:将全部内容(运行文档,配置环境,运行环境等等)打包到一起,构成一个镜像文件,这样的话从一台计算机移到另一台计算机几乎不会出现问题

理念

docker实现"一次封装,到处运行",docker是基于Go语言实现的云开源项目
在这里插入图片描述三要素:镜像,容器,仓库
对于镜像的理解:
在这里插入图片描述对于容器的理解:
一个容器可以运行一种服务,当需要用到时,用docker创建一个运行实例,这就是容器,可以把容器看成一个简易版的linux环境
对于仓库的理解:
就是一堆镜像存放的地方,我们可以把镜像发布到仓库中,用的时候拉下来即可。

同虚拟机的区别

(1)虚拟机需要软件和硬件,而docker无需硬件,大大节省了空间
(2)虚拟机需要重新加载系统内核,docker与宿主机共用一个操作系统
在这里插入图片描述

运用

输出helloworld镜像

语句

docker run hello-world

在这里插入图片描述

配置加速器

由于docker是外国的,下载时比较慢,我们需要借助国内的镜像来下载其他插件,这样比较迅速省时,具体操作如下
进入docker目录下查看是否存在daemon.json文件
在这里插入图片描述我的之前没有,是自己创建的文件,语句为

touch /etc/docker/daemon.json

在这里插入图片描述然后以vim编辑文件,语句为

vim daemon.json

在这里插入图片描述进入后输入i进入编辑模式,输入以下内容

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

在这里插入图片描述
然后按esc,输入:wq!(含义是保存并强制退出)
此时再输入以下语句(重启服务)

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

配置完毕

帮助命令

<1>显示版本信息

docker version

在这里插入图片描述
<2>显示系统信息

docker info  

在这里插入图片描述<3>显示docker命令

docker --help

在这里插入图片描述

镜像命令

查看本机镜像

docker images

在这里插入图片描述
REPOSITORY:镜像的仓库源
TAG:镜像的标签
IMAGES ID:镜像ID
CREATED: 镜像创建时间
SIZE:镜像大小

可选项

-a 显示所有镜像 可以把镜像看成一个千层饼,上面的hello-world只是最外层
-q 显示镜像id
--digests 显示镜像的摘要信息(注释)
 --no-trunc 显示完整的镜像信息

示例如下

docker images -aq

docker images --digests 

在这里插入图片描述

 docker images --digests --no-trunc 

在这里插入图片描述

搜索其他镜像

docker search xxx(镜像名字)

示例:

docker search tomcat

在这里插入图片描述常用可选项

-s 列出收藏数不小于指定值的镜像
--no-trunc 显示完整的镜像描述

注:-s已弃用,移到–filter中使用
示例

docker search --filter stars=30 tomcat    

在这里插入图片描述

下载镜像

docker pull

示例:

docker pull tomcat

在这里插入图片描述

删除镜像

docker rmi

可选项

-f //强制删除

示例:

docker rmi hello-world

在这里插入图片描述删除多个时中间以空格分开即可,示例

docker rmi -f hello-world nginx

删除全部的语句,示例

docker rmi -f$(docker images -qa)

容器命令

前提:有镜像
有镜像才能创建容器,此为根本前提

新建并启动容器

docker run image

常用项

-i //以交互模式运行容器,通常与-t联用
-t //为容器重新分配一个伪终端
-d //以后台模式启动容器,不在界面显现
-v // /宿主机目录:/容器目录
--name="xxx" //为容器指定名称为xxx

示例1

 docker run -it 5d0da3dc9764(centos镜像id)

在这里插入图片描述此时相当于在docker中进入到了centos的终端中。
发现进入后的字符与镜像id不同,在root终端中查看当前容器,可以发现这个root后的字符是容器id
在这里插入图片描述示例2:

docker run -it  --name quan9i 5d0da3dc9764    

在这里插入图片描述查看当前容器,可以发现名字变为quan9i(不设置时系统自动随机生成)
在这里插入图片描述示例3

docker run -d centos 

在这里插入图片描述
此时查看当前容器,发现没有正在运行的容器,这是因为docker的机制是如果只有后台运行,没有前台进程,就会立即关闭
在这里插入图片描述那么该如何让它保存开启呢,具体示例如下

docker run -d centos /bin/sh -c "while true;do echo hello quan9i;sleep 2;done"

在这里插入图片描述

查看日志
docker logs 0cbe0a5786ad      

在这里插入图片描述
常用可选项

-t //添加时间戳
-f //跟随最新的日志打印,即 及时更新
--tail x //显示最后x条

示例

docker logs -t -f --tail 6 0cbe0a5786ad  

在这里插入图片描述ctrl+c即可退出

查看容器内运行的进程
docker top 容器id

示例

 docker top 0cbe0a5786ad

在这里插入图片描述
之所以能这样使用是因为容器相当于linux的精简版,可以执行linux的部分命令

查看容器内部细节
docker inspect 容器id

示例

 docker inspect 0cbe0a5786ad

在这里插入图片描述

进入正在运行的容器并以命令行交互

语句1

docker exec -it 容器id bashshell

语句2

docker attach 容器id //重新进入容器,适用于ctrl+p+q退出容器方式

两个的区别在于
(1)attach直接进入容器终端,不会启动新的进程
(2)exec是在容器内打开新的终端,并且启动新的进程
简单的说,exec可以得到输出结果并返回到当前界面,而attach是进入终端后再进行执行
用成语讲:隔山打牛
示例:

docker attach  cd10d1992eb4  
ls -l /tmp
docker exec -t cd10d1992eb4 ls -l /tmp  

在这里插入图片描述

从容器内拷贝文件到主机

语句

docker  cp 镜像id:容器内路径 目的主机路径

示例

docker cp cd10d1992eb4: /tmp/yum.log /root       

列出当前容器

docker ps //默认显示当前正在运行的容器

常用可选项

-l //显示上一次的容器信息
-a //显示之前全部的容器信息
-n x //显示前x次的容器信息
-q //只显示容器编号

示例:

docker ps -a
docker ps -ql

在这里插入图片描述

退出容器

方式1

exit  //退出并关闭容器

在这里插入图片描述
在这里插入图片描述
方式2

ctrl+p+q //退出容器但不关闭容器

示例

在这里插入图片描述

启动容器

docker start 容器id或容器名

示例

docker start aad8f225fee0

在这里插入图片描述

重启容器

docker restart 容器id

示例

docker restart 70d3b31e8fe3    

在这里插入图片描述可以发现时间由8分钟变成了4秒钟,说明重启成功

停止容器

方式1

docker stop 容器名

方式2

docker kill 容器名

方式1可以理解为电脑正常关机,而方式2可以理解为直接拔掉电源,比较迅速
示例

docker stop aad8f225fee0
docker kill 70d3b31e8fe3

在这里插入图片描述

删除已停止容器

rmi为删除镜像,rm为删除容器
方法一:
注:法一已被弃用,执行无效

docker rm -f$(docker ps -a -q) 

方法二:

docker ps -a -q| xargs docker rm //删除全部镜像

示例
在这里插入图片描述

docker镜像

镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

(1)UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统加载起来,这样最终的文件系统会包含所有的底层文件和目录
(2)Docker镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。
主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就行,因为底层直接用host和kernel,自己只需要提供rootfs就行。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

镜像采用了分层结构,采用这种结构最大的好处就是共享资源,举个例子,当下载一个插件时,他自己的缓存也存在于此,删除这个插件后,再下载这个插件或者需要用到支持此类资源的插件时,速度会快很多,这是因为共享一套底层资源(小白理解,有误轻喷)

当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”,例如下载的tomcat就是容器层
在这里插入图片描述

镜像commit

开启交互终端
法一

docker run -it -it -p 8888:8080 tomcat //开放的端口是8888,映射到docker的8080端口

执行结果
在这里插入图片描述法二

docker run  -it -P tomcat   (这里的p是大写)

可以看见端口是49154
在这里插入图片描述
访问与上相同

开启副本

docker commit -a="作者信息" -m="大致信息"  容器id 版本号

示例:

docker commit -a="zzyy" -m="tomcat without docs"  ca7c25a3947f atguigu/mytomcat:1.2 

在这里插入图片描述此副本与原先的区别在于没有doc

容器数据卷

概念

Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。

作用

1、数据的持久化
2、容器间继承+共享数据

容器内添加

直接命令添加

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
示例:

 docker run -it -v  /myDataVolume: /dataVolumeContainer centos

在这里插入图片描述
发现已经进入到了容器中
此时打开另一个终端(此后称为host终端,第一个称为容器终端),输入ll查看数据卷是否写入
在这里插入图片描述
可以发现中间已经存在了myDataVolume
查看数据卷是否挂载成功

docker inspect 0e82da803fbc 

在这里插入图片描述小知识,下图中的RW:true说明有写入的权限,即可读可写
在这里插入图片描述

输入后发现binds后是我们刚刚写入的,说明挂载成功
此时呢,我们在host终端创建文件
在这里插入图片描述
然后去容器终端查看
在这里插入图片描述发现存在host.txtx文件,此时我们使用vi编辑host文件,在其内写入container updater 01 ,保存并退出,再创建一个新文件container.txt
在这里插入图片描述
回到host终端查看
在这里插入图片描述
发现写入成功,即说明容器和宿主机之间实现了数据共享
此时回到容器终端,停止容器并退出
在这里插入图片描述回到host终端,在其内新建host02文件并更改host文件内容,内容更改为
container update 01
host update 01
在这里插入图片描述
此时在回到容器终端,打开容器,查看文件内容
在这里插入图片描述
发现改动了,说明容器停止退出后,主机修改后数据同步
带权限的命令添加

 docker run -it -v  /myDataVolume: /dataVolumeContainer ro centos

其仅仅少了写入权限,即可以在host终端写入和编辑文件,而容器终端只有查看的权利,没有写入和编辑的权利

dockerflie添加

首先在根目录下新建mydocker文件并进入
在这里插入图片描述
然后再使用vim创建并编辑Dockfile文件
在这里插入图片描述
在里面写入如下内容

# volume txt
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] //添加两个数据卷
CMD echo"finished,------successs1"  //
CMD /bin/bash   

上述内容其含义类似于

docker run -it -v /host1:/dataVolumeContainer1 -v/host2:/dataVolumeContainer2 centos /bin/bash

知识小扩充:
FROM:定制的镜像都是基于 FROM 的镜像,这里的 centos 就是定制需要的基础镜像。后续的操作都是基于 centos。
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。
RUN 是在 docker build。

此时file搭建完毕,开始bulid生成镜像

 docker bulid -f /mydocker/Dockerfile -t zzyy/centos . //.代表当前路径,也可填写其他

在这里插入图片描述
此时查看容器镜像,可以看见镜像已经生成
在这里插入图片描述最后呢,进行run容器

docker run -it zzyy/centos

在这里插入图片描述此时查看目录
在这里插入图片描述发现两个数据卷已经成功写入
那此时存在一个问题,就是数据卷的主机路径在哪里,我们重新打开一个终端,在终端下输入如下语句进行查看

docker inspect 容器id

在这里插入图片描述然后查找可以发现其路径,在Mounts的source中
在这里插入图片描述
用dockerfile搭建数据卷完成

数据容器卷

概念:容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。
小白理解:建造一个容器作为父容器,其他容器同步于父容器,实现数据共享
示例:
首先创建一个父容器并创建doc1_add.txt文件

 docker run -it --name doc1  zzyy/centos

在这里插入图片描述
此时创建第二个容器

docker run -it --name dc02 --volumes-from doc1  zzyy/centos

再进入到数据卷2下
在这里插入图片描述创建一个doc2_add.txt文件,此时查看目录
在这里插入图片描述
可以发现父容器的数据也在此内(dco1_add.txt也写入到了其中)
同理创建第三个并写入doc3_add.txt文件

docker run -it --name dc03 --volumes-from doc1  zzyy/centos 

在这里插入图片描述

再进入到父容器中,可以看见三个文件都存在,说明数据实现共享
在这里插入图片描述
如果删除了父目录,那文件还会存在吗,接下来进行尝试

docker rmi -f 8925ea083cdf    

在这里插入图片描述进入第二个或者第三个容器

docker attach 5410be23987d

在这里插入图片描述
可以发现文件仍然存在,因此只要容器没有删除完全,文件就不会消失。
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器为止

docker file

概念

docker file是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本

三步骤

编写dockerfile文件
docker bulid
docker run

dockerfile 构建过程解析

dockerfile内容基础知识

1、每条指令都必须为大写字母且后面至少跟随一个参数
2、代码从上至下,顺序执行
3#表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交(千层饼,自下往上叠加)

dockerfile执行大致流程

1、docker从基础镜像运行一个容器
2、执行一条语句并对容器做出修改
3、执行类似docker commit的操作提交一个新的镜像层
4、docker再基于刚提交的镜像运行一个容器
5、执行dockerfile中的下一条指令直至所有指令都执行完成

dockerfile保留字指令

FROM xx //指出当前新镜像是基于哪个镜像的
MAINTAINER xx //指出镜像维护者的名字和邮箱地址
RUN xx //容器构建时需要执行的命令
EXPOSE xx //当前容器对外暴露出的端口
WORKDIR xx //指定在创建容器后,,终端默认登录的进来工作目录,一个落脚点
ENV xx //用在构建镜像过程中设置环境变量
ADD xx //将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包(拷贝加解压)
COPY xx //类似ADD,拷贝文件和目录到镜像中。
VOLUME xx //容器数据卷,用于数据卷保存和持久化工作
CMD xx //指定一个容器启动时要运行的命令,dockerfile中可有多条指令,但只有最后一个生效
ENTRYPOINT xx //指定一个容器时要运行的命令,和CMD一样,但在docker run后不会被替换
ONBULID xx //当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后其onbulid被触发

可以参考一下Ubuntu的dockerfile

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
	&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
	&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
	&& chmod +x /usr/sbin/policy-rc.d \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
	&& dpkg-divert --local --rename --add /sbin/initctl \
	&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
	&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
	&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
	&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
	&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
	&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
	&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
	&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
	&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests

# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good
# (see also https://bugs.launchpad.net/cloud-images/+bug/1699913)

# make systemd-detect-virt return "docker"
# See: https://github.com/systemd/systemd/blob/aa0c34279ee40bce2f9681b496922dedbadfca19/src/basic/virt.c#L434
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container

CMD ["/bin/bash"]

dockerfile案例

自定义镜像
下面以centos为例
docker安装的精简版的centos,其自身只保留了内核,对于一些系统认为不是很重要的东西被舍弃掉了,如下图所示
在这里插入图片描述

我们在进入centos后,发现vim无法使用,而且ifconfig也无法使用,且默认路径是/,那如果我们想使用ifconfig、自定义根目录,该如何做呢,这时候我们可以自己做一个镜像,话不多说,dockerfile如下

FROM centos  //来源于centos
MAINTAINER quan9i<quan9i@qq.com> //作者是quan9i,后面是邮箱

ENV MYPATH /usr/local  //配置环境变量
WORKDIR $MYPATH //指定默认路径

RUN yum -y  install vim  //安装vim的命令
RUN yum -y  install net-tools //安装 

EXPOSE 80 //暴露端口为80
CMD echo $MYPATH 
CMD echo "success------ok"
CMD /bin/bash

此时保存并退出,然后开始构建镜像

docker build -f /mydocker/Dockerfile2 -t quan9i/centos . 

在这里插入图片描述
完成后run容器进入即可发现vim和ifconfig可以使用

CMD和ENTRYPOINT的区别(实例)

为了演示两者的区别,接下来以tomcat和centos演示一下:
查看一下tomact的dockerfile(重点看的是最后CMD,前面太多,不进行全部复制)

ENV CATALINA_HOME /usr/local/tomcat //配置环境
ENV PATH $CATALINA_HOME/bin:$PATH //默认路径
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

EXPOSE 8080
CMD ["catalina.sh", "run"] //启动容器的命令

我们在启动tomcat时,在后面追加一个ls-l命令,代码如下

docker run -it -p 8888:8080 tomcat ls -l   

执行结果
在这里插入图片描述
根据webapps、work这些可以判断是tomcat里的,此时查看运行容器
在这里插入图片描述发现没有容器在运行,说明之前的CMD命令被ls-l这条命令替代了,没有发挥其作用
此时呢,就相当于上述的dockerfile是这样的

ENV CATALINA_HOME /usr/local/tomcat //配置环境
ENV PATH $CATALINA_HOME/bin:$PATH //默认路径
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

EXPOSE 8080
CMD ["catalina.sh", "run"] //启动容器的命令
CMD ls-l

此时可见CMD的命令会被覆盖

此时再创建简单的CMD版查询ip和ENTRYPOINT版查询ip观察区别
首先创建dockerfile文件,编辑内容如下

FROM centos //来自于centos
RUN yum install -y curl  //用yum安装curl
CMD [ "curl", "-s" ,"http://ip.cn"] // 执行查询ip的命令

此时开始构建镜像

 docker build -f /mydocker/Dockerfile3 -t myip .
 //-f 后加路径
// -t 命名

此时运行容器
在这里插入图片描述

就会执行查询ip的命令
但是此时没有显示http报文头信息,如果想要显示头部段信息的话,需要加上-i
再次运行并在尾部加上-i,代码

docker run myip -i

执行结果如下
在这里插入图片描述
发现报错了,这是因为cmd是覆盖,后面的-i替换了之前的cmd命令
"curl", "-s" ,"http://ip.cn"
此时的dockerfile相当于

FROM centos //来自于centos
RUN yum install -y curl  //用yum安装curl
CMD [ "curl", "-s" ,"http://ip.cn"] // 执行查询ip的命令
CMD  -i

这是CMD版本的查询ip,接下来创建ENTRYPOINT的dockerfile
内容如下

FROM centos //来自于centos
RUN yum install -y curl  //用yum安装curl
ENTRYPOINT[ "curl", "-s" ,"http://ip.cn"] // 执行查询ip的命令

然后开始构建

docker build -f /mydocker/Dockerfile4 -t myip2 .     

运行容器
在这里插入图片描述
发现都能正常执行,原有的没有受到影响,且可以正常使用-i
此时的dockerfile文件就相当于CMD版本的

FROM centos 
RUN yum install -y curl  
ENTRYPOINT[ "curl", "-s" ,-i "http://ip.cn"]

由此可见CMD和ENTRYPOINT的区别在于前者是覆盖,后者是追加

ONBULID命令案例

温习定义

ONBULID xx //当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后其onbulid被触发

首先创建一个父dockerfile文件

FROM centos
RUN yum install -y curl
CMD [ "curl", "-s" ,"http://ip.cn"]
ONBUILD RUN echo "father onbuild------886"

构建父镜像

docker build -f /mydocker/Dockerfile4 -t myip_father . 

此时docker images可以发现镜像已经搭建完成
然后此时再新建一个dockerfile文件,文件内容如下

FROM myip_father //不再基于centos,而基于刚刚创建的镜像
RUN yum install -y curl 
CMD [ "curl", "-s" ,"http://ip.cn"]

此时构建镜像

docker build -f /mydocker/Dockerfile5 -t myip_son .  

在这里插入图片描述
红色部分就是子类在执行时,父类的onbuild被触发

自定义centos9

首先创建文件夹,代码如下

mkdir -p /zzyyuse/mydockerfile/tomcat9

mkdir小科普

-p 递归创建出具有嵌套叠层关系的文件目录。
[root@linuxprobe linuxprobe]# mkdir -p a/b/c/d/e
[root@linuxprobe linuxprobe]# cd a
[root@linuxprobe a]# cd b
[root@linuxprobe b]#

此时cd到当前路径,创建c.txt文件

cd  /zzyyuse/mydockerfile/tomcat9
touch c.txt

再将文件拷贝到当前路径

cp opt/apache-tomcat-9.0.8.tar.gz  /zzyyuse/mydockerfile/tomcat9
//将opt文件夹中的apache文件复制到当前文件夹中
cp java/jdk-8u171-linux-x64.tar.gz  /zzyyuse/mydockerfile/tomcat9\
//将java文件夹中的jdk文件复制到当前文件夹中

在这里插入图片描述

此时再创建dockerfile文件,编辑内容如下

FROM centos //基于centos
MAINTTAINER zzyy<zzyybs@126.com>//维护者名字和邮箱
COPY c.txt /usr/local/cincontainer.txt//复制文件并重命名
ADD jdk-8u171-linux-x64.tar.gz  /usr/local/
ADD apache-tomcat-9.0.8.tar.gz  /usr/local/
//把java和tomcat添加到容器中
RUN yum -y install vim//安装vim编辑器
ENV MYPATH /us/local //配置环境变量
WORKDIR $MYPATH //默认当前路径
ENV  CLASSPATH $JAVA_HOME/lib/dt,jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
//配置java与tomcat环境变量
EXPOSE 8080 //容器运行时监听的端口
#ENTRYPOINT ["usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
//追加读日志

此时开始构建镜像

docker bulid -t zzyytomcat-9 .
//此时没写-f ,在本目录下时,不写默认读取的就是此dockerfile

安装完成后docker images查看
在这里插入图片描述
然后运行容器,代码如下

docker run -d -p 9080:8080 --name myt9
//-d 守护式进程(后台运行) -p 端口映射 --name 容器命名
-v /zzyyuse/mydockerfile/tomcat9/test: /usr/local/apache-tomcat-9.0.8/webapps/test
-v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/ : /usr/local/apache-tomcat-9.0.8/logs
//-v 添加数据卷  ,后面文件会同步到前面
--privilegd=true
//偶尔会出现报错,这个命令可以解决报错问题
zzyytomcat9
//镜像名

再docker ps
如下图所示
在这里插入图片描述发现已经运行,再进行验证,在虚拟机中访问localhost:9080
在这里插入图片描述

构建成功,我们是以后台进程式的方法启动的容器,那如果想要进行ls命令该怎么做呢?
答案是利用exec,构造代码如下

docker exec 容器id ls -l

执行结果如下
在这里插入图片描述
此时如果想要将web服务test发布的话,该如何操作呢
首先进入test文件下,再创建WEB-INF文件夹
在这里插入图片描述
然后在其内创建并编辑web.xml文件,内容如下

<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	
	xmlns="https://java.sun.com/xml/javase"
	xsi:schemal_ocation="http://java.sun.com/xml/ns.javaee http: //java.sun.com/xml/ns/javaee/wev-app_2_5.xsd"
	id="WebApp_ID version="2.5">

	<display-name>test</display-name>

<web-app>

此时呢,再创建并编辑a.jsp文件,其内容如下

<%@ page language="java" contentTYPE="text/html";charset="UTF-8" pageEncoding="UTF-8"%>
<! DOCTYPE html PUBLIC "-//w3c//DTD html 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
   			<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
           	<title>Insert title here</title>
    </head>
    <body>
    ----------welcome-----------
           <%= "i am in docker tomcat self"%>
          <br>
          <br>
          <%system.out.println("==========docker tomcat self");%>
    </body>
</html>

重启容器,然后在虚拟机中访问
在这里插入图片描述

此时你再在虚拟机的内容里多两个换行符(< br>)会同步到centos中,那就会在访问时生效
此时再查看catlina.out文件,代码如下

cat catlina.out

执行结果如下
在这里插入图片描述
我访问了三次,后台日志记录了三次

docker安装mysql

docker安装mysql
首先呢搜索mysql,代码如下

docker search mysql

执行结果如下
在这里插入图片描述此时我们如果想要下载5.6的版本该怎么办呢,后面加上版本号即可,代码如下

docker pull mysql:5.6

在这里插入图片描述
下载完成,接下来运行容器,代码如下

docker run -p  1111:3306  --name mysql
//虚拟机的1111端口映射mysql的3306端口 ,给容器命名为mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-v /zzyyuse/mysql/logs:/logs
-v /zzyyuse/mysql/data:/var/lib/mysql
//添加三个数据卷
-e MYSQL_ROOT_PASSWORD=123456
//初始化mysql密码为123456
-d 
//以守护式进程运行(后台运行)
mysql:5.6
//镜像名称

执行结果如下
在这里插入图片描述
此时该如何启动容器,那当然是exec,代码如下

docker exec -it 8e37864ac5d1 /bin/bash

在这里插入图片描述
此时呢,通过密码进入mysql,代码如下

mysql -u root -p	

注:密码默认是不回显的,直接输入即可
在这里插入图片描述
此时先新建一个数据库

create database db01;

建表

create table t_book(id int not null primary key,bookName varchar(20) );

插入字段

insert into t_book values(1,'java');

在这里插入图片描述
此时呢,我们尝试在外部进行连接(虚拟机ip可通过 ifconfig指令查看,显示的docker中inet后的数字就是ip)
在这里插入图片描述连接后,可以发现刚刚编写的内容
在这里插入图片描述
此时你把java改成tomcat
在这里插入图片描述
再从mysql里面看
在这里插入图片描述
完成了外部机器连接mysql
此时想要备份的话,如下操作即可

docker exec 容器id sh -c 'exec mysqldump --all-databases -u root -p"123456" '>/zzyyuse/all-database.sql
//含义是让全部数据库以root名字和123456为密码登录,然后将数据同步到文件夹zzyyuse下的all-database.sql文件中

此时切换到这个目录下

cd /zzyyuse/

查看文件

cat  all-database.sql

在这里插入图片描述数据已全部备份到此文件中

本地镜像发布到阿里云上

首先呢,我们复习一下commit,使用commit构建一个镜像

docker commit -a zzyy -m "new centos with xx and xx" bbb491fa56fc  mycentos 
//-a 描述作者信息 -m 描述大致信息

执行结果如下
在这里插入图片描述
此时打开阿里云,在里面搜索容器镜像服务
在这里插入图片描述
然后创建个人版,然后开始创建个人仓库
在这里插入图片描述
再选本地仓库
在这里插入图片描述此时给出了以下几个代码
在这里插入图片描述按1、3步骤操作即可,但是第一个命令执行时会报错,如下图
在这里插入图片描述
这是因为没有设置固定密码的问题,找到刚刚的个人版那里,点击进去,选最下方的访问凭证,设置固定密码即可
在这里插入图片描述
然后最终设置完毕后在阿里云镜像仓库中就可以找到自己搭建的镜像啦,docker初学就到这里结束,本人只是小白,有问题还请各位大佬多多指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值