Docker学习笔记(1)
1. Docker安装
1.1. Docker是什么
- 如何确保应用能够在不同的环境中运行和质量检测?并且在部署过程中出现版本配置问题,也无需重新编写代码和进行故障修复?使用容器Docker给出了一个标准化的解决方案:系统平滑移植,容器虚拟化技术
安装的时候,将原始环境一模一样的复制过来,开发人员利用Docker可以消除协作编码时“在我的机器上可以正常工作”的问题
- Docker包含两方面的技术:
- 镜像技术:打破代码即应用的观念,从系统环境开始,通过镜像将作业系统核心除外,运作应用所需要的系统环境,自底向上打包应用,达到应用程序跨平台的无缝衔接
- 容器虚拟化
- Docker是基于Go语言实现的云开源项目,做到一次镜像,处处运行。只需要一次配置好环境,换到其他主机即可一键部署,简化操作。解决了运行环境和配置问题的软件容器,方便持续继承并有助于整体发布的容器虚拟化技术
1.2. 传统虚拟机和容器的对比
- 虚拟机:基于安装在主OS上的虚拟机管理系统,如VirtualBox和VMWare,创建虚拟机,在虚拟机上安装从OS,在从OS上中安装部署各种应用
虚拟机的缺点:资源占用多;冗余步骤多; 启动慢
-
容器虚拟化:Linux容器(LXC),Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并且由该镜像提供支持进程所需要的全部文件,容器提供的镜像包含了应用的所有依赖项,因为在从开发到测试再到生产的整个过程中,都具有可移植性和一致性。Linux容器不是模拟一个完整的OS,而是对进程进行隔离。有了容器,就可以将软件运行所需要的所有资源打包到一个隔离的容器中,容器与虚拟机不同,不需要捆绑一整套OS,只需要软件工作所需要的库资源和设置。系统因此变得更为轻量并且保证部署在任何环境中的软件都能执行。
-
区别之处:传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整的OS,在该OS上运行所需要的应用进程;容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核也没有进行硬件虚拟;每个容器之间相互隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响,可以区分计算资源
-
Docker的优势:
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算资源利用
1.3. Docker三大组件以及工作原理
- CentOS上的Docker安装:window上先安装一个虚拟机,并在安装Linux系统的虚拟机上运行Docker
- 镜像: Image就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器,也相当于一个root文件系统。如官方镜像CentOS7包含了完整的一套root文件系统,相当于容器的源代码,Docker镜像文件类似于Java的类模板,而docker容器实例类似于Java中new出来的一个个实例对象
- 容器:Container独立运行的一个或者一组应用,应用程序或者服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是镜像创建的运行实例,类似于java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行的实体。容器为镜像提供了一个标准和隔离的运行环境,每个容器都是相互隔离的。容器可以看做是一个简易版本的Linux环境和运行在其中的应用程序
- 仓库:Repository是集中存放镜像文件的地方,类似于Maven仓库存放各种jar的地方,git仓库存放各种git项目,而DockerHub存放各种镜像模板。
- Docker的工作原理:Docker是一个Client-Server结构的系统,Docker守护者进程在主机上,然后通过Socket连接从客户端访问,守护者进程从客户端接受命令管理运行在主机上的容器。容器是一个运行时环境
- 用户使用Docker Client和Docker Daemon建立通信,并发送请求给后者
- Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求
- Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个job的形式存在
- Job运行过程中,当需要容器镜像时,从Docker Registry中进行下载,并通过镜像管理驱动Graph Driver将下载镜像以Graph的形式存储
- 当需要为Docker创建网络环境时,通过网路管理驱动Network Driver创建并配置Docker容器网络环境
- 当需要限制Docker容器运行资源或执行用户指令等操作时,通过Exec driver完成
- Libcontainer是一个独立的容器管理包,Network Driver以及Exec Driver都是通过Libcontainer来实现具体对同期进行的操作
1.4. centos7上安装Docker
docker的官方地址:https://docs.docker.com/engine/install/centos/
-
检查版本
cat /etc/redhat-release
版本7.x以上uname -r
-
卸载旧版本的docker:官网地址上有给出uninstall的命令
-
yum安装gcc相关:
yum -y install gcc
yum -y install gcc-c++
-
安装需要的软件包
-
设置stable镜像仓库:为加快下载镜像速度,使用阿里云的镜像云仓库,不使用官方的
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum软件包索引:
yum makecache fast
-
安装Docker CE:
yum install docker-ce docker-ce-cli containerd.io
-
启动Docker:
systemctl start docker
-
测试:
- 查看docker的版本
docker version
- 测试:
docker run hello-world
- 查看docker的版本
输出这段提示以后,HelloWorld就会停止运行,容器自动终止
- 卸载:
- systemctl stop docker
- yum remove docker-ce docker-ce-cli containerd.io
- rm -rf /var/lib/docker
- rm -rf /var/lib/containerd
1.5. 镜像加速器配置
- 登录阿里云开发者平台
- 点击控制台
- 选择容器镜像服务
- 获取加速地址
根据官网给出的配置步骤即可完成加速器的配置
1.6. Docker run的过程
Docker run命令,首先在本机中寻找该镜像,本机中有该镜像则以该镜像为模板生产容器实例运行;如果没有则取Docker Hub上查找该镜像,Hub上能够找到则下载镜像到本地并生产容器实例运行,反之返回失败错误,查不到该镜像
Docker比传统VM虚拟机快的原因:
- Docker有着比VM更少的抽象层:不需要Hypervisior虚拟机实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU和内存利用率上docker将会在效率上有明显优势
- docker利用的是宿主机的内核,而不需要加载OS内核:当新建一个容器时,docker不需要和VM一样重新加载一个OS内核。避免加载OS内核返回等比较费时费资源的过程,VM创建需要加载OS,返回新建过程是分钟级别的。而Docker直接利用宿主机的OS,省略了返回过程,新建一个Docker容器只需要几秒钟
2. Docker常用命令
2.1. 帮助启动类命令
- 启动docker:
systemctl start docker
- 停止docker:
systemctl stop docker
- 重启docker:
systemctl restart docker
- 查看docker状态:
systemctl status docker
- 开机启动:
systemctl enable docker
- 查看docker概要信息:
docker info
- 查看docker总体帮助文档:
docker --help
- 查看docker命令帮助文档:
docker 具体命令 --help
2.2. 镜像命令
- docker images:列出本地主机上的镜像
Repository:表示镜像的仓库源 Tag:镜像的标签版本号 Image id:镜像id created:镜像创建时间 size:镜像大小
同一个仓库可以有多个TAG版本,代表这个仓库源的不同版本,使用Repository+tag来定义不同的镜像。不指定一个镜像的版本标签,只是使用Ubuntu,docker将默认使用Ubuntu:latest镜像
使用 docker images -a:列出本地所有的镜像包括历史映像层
docker images -q:只显示镜像的id
- docker search --limit 5 镜像名:罗列出5个关于redis的镜像,默认罗列出25个镜像
其中的参数:
- Name:镜像名称
- Description:镜像说明
- stars:点赞数
- official:是否是官方的
- AutoMated:是否是自动构建的
- docker pull 镜像名[:TAG]:下载镜像,没有指明tag则默认下载最新的版本latest
- docker system df:查看镜像,容器,数据卷所占用的空间
- docker rmi 镜像名字/镜像id:删除某个镜像
- docker rmi -f 镜像id:强制删除
- docker rmi -f 镜像id1 镜像id2…:删除多个镜像
- docker rmi -f ${docker images -qa} :删除全部镜像
docker虚悬镜像
仓库名和tag都是none的镜像,称之为虚悬镜像dangling image,一般需要将其删除
2.3. 容器命令
-
在Docker中pull一个Ubuntu系统镜像
-
新建并且启动容器:docker run 【options】 image 【command】【arg…】
-
Options参数有:
- –name=容器名:为容器指定名称,不指定则默认随机分配名字
- -d:后台运行容器并返容器ID,也就是启动守护式容器(后台运行)
- -i(interactive):以交互式模式运行容器,通常与-t同时使用
- -t(tty):为容器重新分配一个伪输入终端,通常与-i同时使用,也就是启动交互式容器(前台有伪终端,等待交互)
- -P:随机端口映射
- -p:指定端口映射,如-p 8080:80或者-p ip地址:8080:80
如在centos7中的docker容器进入到Ubuntu镜像中:
docker run -it ubuntu /bin/bash
-
-
列出当前所有正在运行的容器:docker ps 【options】
- options参数有:
- -a:展示所有容器,包括已启动的和关闭的容器
- -l:显示最近创建的容器
- -n:显示最近n个创建的容器
- -q:静默模式,只显示容器编号
- options参数有:
-
退出容器:
- exit:run进去容器,exit退出,容器停止
- ctrl+p+q:run进去容器,快捷键退出,但是容器不停止
-
启动已经停止的容器:
docker start 容器id/容器名
-
重启容器:
docker restart 容器id/容器名
-
停止:
docker stop 容器id/容器名
-
强制停止容器:
docker kill 容器id/容器名
-
删除已经停止的容器:
docker rm 容器id/容器名
-
强制删除容器:
docker rm -f 容器id/容器名
docker ps -a -q | xargs docker rm:管道符之前查出来的id可作为后面的参数xargs进行删除
演示守护式容器(后台服务器)
-
查看容器日志:
docker logs 容器id
-
查看容器内运行的进程:
docker top
容器id -
查看容器内部细节:
docker inspect 容器id
-
进入正在运行的容器并以命令行交互:
docker exec -it 容器id bash(/bin/bash)
docker attach 容器id
使用==exec命令,是在容器中打开新的终端,并且可以启动新的进程,用exit退出容器终端不会导致容器的终止 ===
使用attach命令,直接进入容器启动命令的终端,不会启动新的进程,用用exit退出容器终端,容器也就终止
-
从容器内拷贝文件到主机上:
docker cp 容器id:容器内路径 目的主机路径
-
导入和导出容器:
docker export 容器id > 文件.tar
:export导出整个容器的内容留作为一个tar文件(导出容器)cat 文件名.tar | docker import - 镜像用户(类似于包名)/镜像名:镜像版本号
:import从tar包中的内容创建一个新的文件系统再导入为镜像(导入容器)