什么是Docker ?
基本概念
简单来说就是一个装应用的容器,可以把你想装的统统打包丢进去。Docker 在容器的基础上,又进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,这使得 Docker 技术比虚拟机技术更为轻便、快捷。
Docker 与传统虚拟化方式的不同之处在于,传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的操作系统,再在该系统上运行所需的应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统的虚拟机更为轻便。
Docker三要素
镜像 :
Docker 镜像,相当于一个特殊的文件系统,可以提供用户提供空间支持。除了提供容器运行时所需的程序、库、资源配置等文件外,还包含了一些为运行时准备的配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建后也不会改变。
严格来说,镜像是一个分层存储的架构。它在构建时,会一层一层构建,前一层是后一层的基础。每层构建完成后就不会再发生改变,后一层上的任何改动仅发生在这一层。比如,删除前一层文件的操作,实际上只是在当前层做一个“上层已删除”的标记,而不会真正把上层文件删掉。在最终容器运行的时候,虽然不会看到这个文件,但实际上它将一直跟随着镜像。因此,在构建镜像时应该额外小心,不要把无用的数据留到下一层去清理。
容器 :
镜像
与 容器
的关系,就像 Java 中 类
与 实例
的关系。镜像是静态的定义,容器是镜像运行时的实体。容器的本质是一个进程,是真正跑项目程序、消耗机器资源、提供服务的部分,相当于一个小虚拟机,为镜像提供隔离的运行环境。
和镜像相同,容器采用的也是分层存储架构,每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,即容器存储层。容器存储层的生命周期和容器一样,当容器消亡时,该存储层将随之消亡,保存于其中的信息也一同丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷
,或绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
仓库 :
Docker 的仓库用来存放镜像。与 Git 类似,它提供一个集中存储、分发镜像的服务,使得我们可以从中心仓库或个人仓库自由拉取镜像,也可以将制作好的镜像提交到远程仓库。
Docker的安装、换源、与扩权
安装
deepin 下直接安装就好啦,其他版本可以参考 官方文档 。
出现这个就说明安装成功 :
换源
因为docker的默认镜像源下载比较慢,所以一般会换成国内的镜像源。以阿里为例,进入它的 容器镜像服务,找到自己的镜像加速器。
然后将它添入 /etc/docker/daemon.json(没有就自己创建一个)。
最后重启一下,就可以正常使用了 :
扩权
默认情况下docker是只能通过root权限访问的,就像下图,或者是 sudo -s
之后再进行操作。
通过放大 docker.sock( Docker 守护进程 ( Docker daemon ) 默认监听的 Unix 域套接字,容器中的进程可以通过它与 Docker 守护进程进行通信 )的访问权限,可以使普通用户也能直接使用 docker 命令 :
常用的Docker命令
拉取镜像
docker pull [OPTIONS] IMAGE [:TAG]
- OPTIONS :可选参数,-xx 这种
- IMAGE :需要拉取的镜像的名称
- TAG :可选项,可以指定镜像的某一个版本,不选就是默认版本
查看镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
- REPOSITORY :可以指定查看某一个镜像的版本
- 不过一般用
docker images
就够啦
运行镜像
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG..]
- IMAGE :镜像名称
- COMMAND :镜像运行时可执行的命令
- ARG :执行命令时可选的参数
在一个运行的容器中运行某些命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG..]
- CONTAINER :容器名称或容器id
- COMMAND :要运行的终端指令
命令补充
查看目前正在运行的容器
docker ps
前台运行与后台运行
docker run (-d) IMAGE
- 比如说前台 :
docker run nginx
- 对应的后台 :
docker run -d nginx
- 注 :后台运行成功后返回的字符串是这个容器的 id
进入一个容器
docker exec -it [容器id] bash
- -i :保证我们的输入有效
- -t :分配一个伪终端
- 然后就可以得到一个 linux 了!(大概
绑定端口
docker run -d -p [主机端口:容器端口] [容器名或id]
- -p :开放一个容器的端口到主机上
- 比如这样 :
docker run -d -p 8080:8080 nginx
重启容器
docker restart [容器id]
停止容器
docker stop [容器id]
停止后再次运行容器
docker start [容器id]
删除容器
docker rm [容器id]
删除镜像
docker rmi [镜像id]
注意删除镜像前要先删除容器,而删除容器前要先停止容器。
删除全部容器
首先停止全部容器 :
docker stop $(docker ps -a -q)
然后进行删除 :
docker rm $(docker ps -a -q)
-- tbc --