Docker虚拟技术简介、常用服务安装

    科技2024-09-30  26

    Docker虚拟技术简介、常用服务安装

    什么是Docker

    官网的介绍是“Docker is the world’s leading software container platform.” 官方给Docker的定位是一个应用容器平台

    所谓应用,即我们经常使用的Mysql Redis MongoDB ElasticSeacrh Tomcat Nginx 等…

    Docker为这些应用准备各自的环境,你可以直接从DockerHub中Pull下来进行使用,这点类似Github

    Docker解决了什么问题

    合作开发的时候,在本机可以跑,别人的电脑跑不起来

    拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、spring等等。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序直接打包成镜像,直接运行在容器中即可

    Docker的便利性

    服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了

    这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序

    Docker的隔离性

    公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器

    在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率

    有了Docker,集群部署将变得非常容易

    Docker和虚拟机的区别

    比较上面两张图,我们发现

    虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。

    Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。

    在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存

    传统虚拟机与Docker容器的参数对比:

    传统虚拟机Docker容器磁盘占用几个GB到几十个GB左右几十MB到几百MB左右CPU内存占用虚拟操作系统非常占用CPU和内存Docker引擎占用极低启动速度(从开机到运行项目)几分钟(从开启容器到运行项目)几秒安装管理需要专门的运维技术安装、管理方便应用部署每次部署都费时费力从第二次部署开始轻松简捷耦合性多个应用服务安装到一起,容易互相影响每个应用服务一个容器,达成隔离系统依赖无需求相同或相似的内核,目前推荐是Linux

    Docker的架构原理

    是否类似Git的感觉呢?

    镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置tar:一个对镜像打包的文件,日后可以还原成镜像

    Docker的镜像原理

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

    UnionFS(联合文件系统)

    Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

    Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

    docker的镜像实际是由一层一层的文件系统组成。

    docker的镜像实际是由一层一层的文件系统组成

    bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel(内核),Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。

    rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。

    我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host(主机)的Kernal,自己只需要提供rootfs就行了。

    由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。

    分层的好处:

    资源共享

    如果有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

    Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层

    Docker的安装(centos7.x)

    注意:

    Docker要求你的CentOS至少是7以上的版本以下操作皆为官网步骤简化

    1.卸载原Docker(新系统可忽略)

    $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine

    2.安装docker依赖

    $ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2

    3.设置docker的yum源

    $ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo

    4.安装最新版docker

    $ sudo yum install docker-ce docker-ce-cli containerd.io

    4.选 指定版本安装docker

    $ yum list docker-ce --showduplicates | sort -r #列出docker所有版本 $ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io #选择对应版本进行安装 #$ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io

    5.启动与关闭

    $ sudo systemctl start docker $ sudo systemctl stop docker

    6.测试

    $ sudo docker run hello-world

    若安装成功,显示如下

    阿里镜像加速服务

    Docker的镜像源在国外,国内拉取镜像的速度很慢,使用阿里加速服务

    阿里镜像加速服务

    常用命令

    辅助命令

    docker version -------------------------- 查看docker的信息 docker info -------------------------- 查看更详细的信息 docker --help -------------------------- 帮助命令

    镜像Images命令

    # 1.查看本机中所有镜像 docker images -------------------------- 列出本地所有镜像 -a 列出所有镜像(包含中间映像层) -q 只显示镜像id # 2.搜索镜像 docker search [options] 镜像名 ------------------- 去dockerhub上查询当前镜像 -s 指定值 列出收藏数不少于指定值的镜像 --no-trunc 显示完整的镜像信息 # 3.从仓库下载镜像 docker pull 镜像名:版本号 ----------------- 下载镜像 # 4.删除镜像 docker rmi 镜像名 -------------------------- 删除镜像 -f 强制删除

    容器常用命令

    # 1.运行容器 docker run 镜像名 -------------------------- 镜像名新建并启动容器 --name 别名为容器起一个名字 -d 启动守护式容器(在后台启动容器) -p 映射端口号:原始端口号 指定端口号启动 #例:docker run -it --name myTomcat -p 8888:8080 tomcat #只有映射了端口号,你才能从外部访问该服务,否则该服务只存在于docker虚拟机中 # 2.查看运行的容器 docker ps -------------------------- 列出所有正在运行的容器 -a 正在运行的和历史运行过的容器 -q 静默模式,只显示容器编号 # 3.停止|关闭|重启容器 docker start 容器名字或者容器id --------------- 开启容器 docker restart 容器名或者容器id --------------- 重启容器 docker stop 容器名或者容器id ------------------ 正常停止容器运行 docker kill 容器名或者容器id ------------------ 立即停止容器运行 # 4.删除容器 docker rm -f 容器id和容器名 docker rm -f $(docker ps -aq) -------------------------- 删除所有容器 # 5.查看容器内进程 docker top 容器id或者容器名 ------------------ 查看容器内的进程 # 6.查看查看容器内部细节 docker inspect 容器id ------------------ 查看容器内部细节 # 7.查看容器的运行日志 docker logs [容器id或容器名]------------------ 查看容器日志 -t 加入时间戳 -f 跟随最新的日志打印 --tail 数字 显示最后多少条 # 8.*** 进入容器内部查看容器的运行日志 docker exec -it bash -i 以交互模式运行容器,通常与-t一起使用 -t 分配一个伪终端 shell窗口 /bin/bash # 9.容器内安装软件 由于docker镜像使用ubuntu系统,故需要使用ubuntu的安装指令 apt-get update apt-get install 安装包名称 # 10.退出容器 exit

    容器进阶命令

    # 1.从容器中复制文件到宿主机目录中 docker cp 容器id:容器内资源路径 宿主机目录路径 # 2.设置容器和宿主机共享目录(挂载) docker run -it -v /宿主机的路径:/容器内的路径:ro(只读) 镜像名 注意: 宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容 运行 docker inspect 容器id 命令 检查json串里有没有以下内容,如果有则证明卷挂载成功。 "Mounts": [ { "Type": "bind", "Source": "/hostDataValueme", "Destination": "/containerDataValueme", "Mode": "", "RW": true, "Propagation": "rprivate" } ] # 3.打包镜像 docker save 镜像名 -o 名称.tar # 4.载入镜像 docker load -i 名称.tar

    Docker安装常用服务

    安装MySQL

    # 1.拉取mysql镜像到本地 docker pull mysql:tag (tag不加默认最新版本) # 2.运行mysql服务 docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:tag # -p表示docker内3306端口映射到宿主机3306端口 # 3.进入mysql容器 docker ps # 查看启动的服务id或name docker exec -it 容器名称|容器id bash # 6.将容器数据位置与宿主机位置挂载保证数据安全 实现配置文件与核心数据在docker虚拟机与宿主机之间共享 docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:tag

    安装Redis

    # 1.在docker hub搜索redis镜像 docker search redis # 2.拉取redis镜像到本地 docker pull redis # 3.启动redis服务运行容器 docker run --name redis -p 6379:6379 -d redis:tag (暴露外部宿主机端口为6379进行连接) # 4.查看启动日志 docker logs -t -f 容器id|容器名称 # 5.进入容器内部查看 docker exec -it 容器id|名称 bash # 6.加载外部自定义配置启动redis容器 默认情况下redis官方镜像中没有redis.conf配置文件 需要去官网下载指定版本的配置文件 1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz 下载官方安装包 2. 将官方安装包中配置文件进行复制到宿主机指定目录中如 /root/redis/redis.conf文件 3. 修改需要自定义的配置 bind 0.0.0.0 开启远程权限 appenonly yes 开启aof持久化 4. 加载配置启动 docker run --name redis -v /root/redis:/usr/local/etc/redis -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf # 7.将数据目录挂在到本地保证数据安全 docker run --name redis -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf

    安装Nginx

    # 1.在docker hub搜索nginx docker search nginx # 2.拉取nginx镜像到本地 docker pull nginx # 3.启动nginx容器 docker run -p 80:80 --name nginx01 -d nginx # 4.进入容器 docker exec -it nginx01 /bin/bash 查找目录: whereis nginx 配置文件: /etc/nginx/nginx.conf # 5.复制配置文件到宿主机 docker cp nginx01(容器id|容器名称):/etc/nginx/nginx.conf 宿主机名录 # 6.挂在nginx配置以及html到宿主机外部 docker run --name nginx02 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx

    安装Tomcat

    # 1.在docker hub搜索tomcat docker search tomcat # 2.下载tomcat镜像 docker pull tomcat # 3.运行tomcat镜像 docker run -p 8080:8080 -d --name mytomcat tomcat # 4.进入tomcat容器 docker exec -it mytomcat /bin/bash # 5.将webapps目录挂载在外部 docker run -p 8080:8080 -v /root/webapps:/usr/local/tomcat/webapps -d --name mytomcat tomcat

    Processed: 0.009, SQL: 8