Docker 基本概念
Docker的使用广泛原因在于通过Docker打包的应用程序可以运行在任一版本的服务器上,大大提高了应用程序的可移植性,从而允许应用程序可以在在公共云、私有云或本地运行。 Docker还提供资源分离,因此可以在同一服务器上运行多个Docker容器而不会互相影响,能够为容器内的程序运行提供一个相对安全的环境,它具有最简单,最容易使用和最有效的功能。
Docker 具有三个重要概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。Docker 运行容器必须要有镜像,镜像存放的场所是仓库,镜像是Docker技术的重要部分。镜像(Image)、容器(Container)和仓库(Repository)关系图如图2-1所示。
![image.png]
这个图 我自认为画的还不错解释了仓库、镜像、容器之间的爱恨纠葛。
英文你应该可以差不多理解吧,我就不进一步解释了吧
😀 我用我自己的话描述一下吧。
仓库 仓库里面放了一堆镜像,在本地可以通过 pull 来将远程的镜像给拉去下来,当然也可以把本地的镜像通过 push 给上传上去,供别人使用。
镜像 我的理解呢,就是模板就是妈妈,根据妈妈可以生出无数个一模一样的小孩--容器,不管对容器怎么操作,修改内容,但是妈妈永远都是不会发生改变的。但是通过容器还可以再生成一个新的镜像,这个新的镜像跟设定的容器是一模一样的。emmm,感觉越来越讲不清楚了。 我用僵尸感染来描述吧,镜像就像僵尸妈妈,被他感染的人就是容器,会跟僵尸妈妈一摸一样,然后我们对僵尸小孩进行进化,给它多加几个手,操作完了呢,仅仅就这一个僵尸有多个手,我们想让所有的僵尸都变多手呢,我们就把这个僵尸小孩给它升级变成僵尸妈妈,这样的话,它感染的小孩也就会跟它一模一样了。解释的不清不楚,如果还是不了解的话,这个话题就掠过了哈。
容器 容器就是我们直接面对的应用层,不做过多描述。
概念
Docker镜像可以理解为是模具,它是Docker中最基础最不可或缺的部分,它会提供一些资源为容器。镜像就像没有运行的容器一样。镜像在创建之后不会被改变,其中并不包含任何动态数据。
Docker容器是通过运行Docker镜像后而产生的产物,相当于是通过模具塑造成型的物品。并且容器是动态的,因此就像在镜像的最顶层创建了一层可写层。
搭建web服务通过Docker技术来实现并不复杂,首先拉取一个合适的镜像,比如一个包含着apache服务的镜像,那在这个镜像就已经包含了apache的运行程序和配置数据。然后通过命令在镜像的基础上启动一个容器,容器启动成功之后,我们就可以通过访问启动时指定的端口访问到apache启动成功的界面。然后在把写好的网站程序放在指定的目录之下,配置权限等,就可以看到这个web网站被成功搭建起来了。这是在已有的镜像基础上启动容器,在容器内修改配置来实现服务。
除了可以利用仓库之中原本就存在的镜像,也可以自己创建一个镜像,创建镜像最简单的方式是利用Dockerfile,镜像的产生是基于一层一层的数据进行整合。Dockerfile就是将这些整合数据的命令汇总起来,逐步执行,最后生成所需要的镜像。
Dockerfile创建镜像的简单指令
FROM: 用于指定基础镜像,定制的镜像都是基于 FROM 的镜像
RUN: 用于执行后面的命令
COPY: 复制指令,将文件拷贝到镜像当中
ADD: 复制指令,将文件拷贝到镜像当中并解压
EXPOSE: 声明容器对外暴露的端口
WORKDIR: 指定工作的目录
CMD: 容器启动时执行的命令
写的一个简单的dockerfile 这个是启动一个apache solr 服务在 8983 端口
FROM ubuntu:16.04
#ENV DEBIAN_FRONTEND noninteractive
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN apt-get update -y
COPY solr-7.7.0.tgz /
COPY start.sh /
RUN apt install openjdk-8-jre-headless -y
RUN tar -zxvf solr-7.7.0.tgz
RUN chmod +x start.sh
EXPOSE 8983
CMD ["/start.sh"]
闲扯 : dockerfile 真是 yyds 我真的是 docker 永远的迷弟,首先就是便利! 短短的几行代码就可以启动服务,省却了大量搭建环境的时间。然后就是节省空间!小,然后好删除。真的好方便!!!! 兼容性强,支持各个平台,linux,windows 也是支持的! 我真是太爱docker 了。
Docker 命令
docker ps 显示正在运行的容器
docker ps -a 显示所有状态的容器
docker ps -n 3 显示最后被创建的 n 个容器
docker ps -l 显示最后被创建的容器
docker ps --no-trunc 显示完整输出
docker ps -q 只显示容器id
docker ps -s 显示容器文件大小
奇技淫巧
在所有容器中查看其中的tmp 文件
for con in `docker ps -q`;do echo $con; docker exec -it $con /bin/bash -c 'ls /tmp';done;
查看所有容器的启动命令
docker ps -a --no-trunc
docker inspect imageid
直接停止所有的容器
for con in `docker ps -a -q`;do echo $con;docker stop $con;done;
直接删除所有的容器
for con in `docker ps -a -q`;do echo $con;docker rm $con;done;
直接删除所有的镜像
for con in `docker images -q`;do echo $con;docker rmi $con;done;
停止所有容器
docker stop $(docker ps -a -q)
删除所有容器
docker rm $(docker ps -a -q)
删除所有镜像
docker rmi $(docker images -q)
删除镜像的时候可能会出现好几个镜像名却是同一个镜像id,删除的时候需要
docker rmi -f 镜像id
是基于 linux 命令进行的变形,主要是停止所有容器的命令,感觉很有用处!