文章目录
一,Docker简介
Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
是在Linux容器里运行应用的开源工具
是一种轻量级的”虚拟机“
Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器。
二,Docker与虚拟机的区别
特性 | Docker | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎五 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量 | 上千个 | 几十个 |
隔离性 | 资源隔离/限制 | 完全隔离 |
三,容器核心技术
docker本质就是宿主机的一个进程,docker是通过namespace(命名空间)实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。
四,Docker核心概念
●镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker容器引擎的只读模板。
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
●容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
●仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker
五,安装Docker
1.关闭防火墙,关闭文件防护
[root@zqh ~]# systemctl stop firewalld
[root@zqh ~]# setenforce 0
2.安装依赖包
[root@zqh ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils:提供了yum-config-manager 工具。device mapper:
是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。device mapper存储驱动程序需要 device-mapper-persistent-data和 lvm2。
设置阿里云镜像源
[root@zqh ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker-CE并设置为开机自动启动
[root@zqh ~]# yum install -y docker-ce docker-ce docker-ce-cli containerd.io
[root@zqh ~]# systemctl start docker.service
[root@zqh ~]# systemctl enable docker.service
####
安装好的Docker系统有两个程序,Docker服务端和ocker客户端。其中Docker服务端是一个服务进程,负责管理所有容器。
Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。大部分情况下Docker服务端和客户端运行在一台机器上。
查看docker信息
查看docker状态,数量信息,容器信息,镜像信息
六,Docker镜像操作
1.搜索镜像
格式:
docker search 关键字
2.获取镜像
格式:
docker pull 仓库名称[:标签]
##如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为latest标签
3.查看镜像
docker imager
查看镜像详细信息
docker inspect 镜像id或名称
4.镜像加速
登入阿里云网站
5.查看镜像信息
6.修改镜像名字和标签
格式:
docker tag 旧名:旧标签 新名:新标签
7.删除镜像
第一种方法:
docker rmi 库名:标签
第二种方法通过id号强制删除
docker rmi 镜像id号 -f
##注意,如果这个镜像在被容器使用,那么用-f就会把容器也会删掉
8.镜像导出导入到本地
(1)先导出镜像
docker save -o 自定义文件名.tar 库名:标签
[root@zqh ~]# docker save -o nginx-1.14.tar nginx:1.14
(2)再导入镜像
9.将镜像导出到官网自己的库中
先登入官网注册账号
返回服务端
[root@zqh ~]# docker login
[root@zqh ~]# docker tag nginx:1.14 zqhh/nginx:1.14
##将发布的镜像改到自己账户名下
[root@zqh ~]# docker push zqhh/nginx:1.14
切换到web界面查看
七,Docker容器操作
1.容器创建
新创建的容器默认处于停止状态,不运行任何程序,需要再其中发起一个进程来启动容器
格式:
docker create [选项] 镜像
常用选项:
-i:让容器开启标准输入
-t:让Docker分配一个伪终端tty
-it:合起来实现和容器交互的作用,运行一个交互式会话shell
[root@zqh ~]# docker create -it nginx:latest /bin/bash
2.查看所有容器以及状态
docker ps -a
3.启动容器
docker start 容器id
4.停止容器
docker stop 容器id
或
docker kill 容器id
两者区别是 docker stop 想当于给程序发送一个指令,等程序处理完进程后 关闭程序
而 docker kill 是不管三七二十一,直接强制删除
5.创建并启动容器
可以直接执行 docker run命令,等同于先执行docker create命令,再执行 docker start命令。
心
注意:容器是一个与其中运行的 shell命令共存亡的终端,命令运行容器运行,命令结束容器退出。
docker容器默认会把容器内部第一个进程,也就是 pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
当利用 docker run来创建容器时,Docker在后台的标准运行过程是:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
(5)分配一个地址池中的IP地址给容器;
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。
(1)在后台持续运行docker run创建的容器
[root@zqh ~]# docker run -d centos:7 /bin/bash -c "while true; do echo helloworld; done"
6.修改容器名称
(1)先停止一个容器
[root@zqh ~]# docker stop 4c9f41540e7f
(2)修改容器名称
[root@zqh ~]# docker run -itd --name zqh1 centos:7 /bin/bash
7.进入容器
[root@zqh ~]# docker exec -it zqh1 bash
(1)如何创建完容器直接进入容器(一条命令搞定)
[root@zqh ~]# docker run -it centos:7 bash
8.实现容器和宿主机之前的文件传输
宿主机导入文件到容器
docker cp 文件 容器id号:/容器目录/
容器导出文件到宿主机并改名
docker cp 容器id号:/容器目录/文件 宿主机目录/新文件名
9.容器的导出与导入
node1:192.168.100.142
node2:192.168.100.140
用户可以将任何一个 Docker容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export
命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
导出格式
docker export 容器id/名称 > 文件名
导入格式
cat 文件名 | docker import - 镜像名称:标签
##导入后会生成镜像,但不会创建容器
需求:现在需要将node1当中的 zqhh1容器进行迁移到node2 主机上
操作如下:
node1上操作
[root@zqh ~]# docker export c4b00385104e > zqh.tar
[root@zqh ~]# scp zqh.tar 192.168.100.140:/opt
node2上操作
[root@bogon opt]# cat zqh.tar | docker import - zqh:aa
[root@bogon opt]# docker run -itd zqh:aa bash
[root@bogon opt]# docker exec -it 8e5d07246112 bash
[root@8e5d07246112 /]# cd /opt/
[root@8e5d07246112 opt]# ls
aa.txt passwd.txt
10.删除容器
docker rm 容器id
删除正在运行的容器,需要先停止容器 或者加-f 强制删除
如何一次性删除全部容器
[root@zqh ~]# docker ps -a | awk 'NR>=2 {print $1}' | xargs docker rm -f