一、Docker概述
1、docker概述
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口,几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言,框架或包装系统。
沙盒也叫沙箱(sandbox),在计算机领域指一种虚拟技术,且多用于计算机安全技术,安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源。
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的container中,然后发布到任何流行的Linux机器上。docker镜像一次构建,到处运行。
LXC为Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
LXC主要通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。
Docker官方网站:https://www.docker.com/
docker服务相当于鲸鱼,container容器就是集装箱
container:容器,集装箱
docker:码头工人
docker源代码:https://github.com/moby/moby
2、Docker容器技术和虚拟机
相同点:docker容器技术和虚拟机技术,都是虚拟化技术
Docker没有自己的系统,与OS共享资源,所以docker效率比虚拟机高
3、Docker架构
工作流程:服务器A上运行docker engine服务,在docker engine上启动很多容器container,从外网Docker Hub上把image操作系统镜像下载下来,放到container容器运行,这样一个容器实例就运行起来了。最后,通过Docker client对docker容器虚拟化平台进行控制。
docker hub:docker hub是docker官方的镜像存储站点,其中提供了很多常用的镜像供用户下载。通过docker hub用户也可以发布自己的docker镜像,用户需要注册一个账户,在网站上创建一个docker仓库。
4、Docker核心技术
1.Namespace:实现container的进程,网络,消息,文件系统和主机名的隔离
2.Cgroup:实现对资源和配额的度量
Cgroup的配额,可以指定实例使用的CPU个数,内存大小等,就像VMware中的硬件配置参数。
5、Docker特性
文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里
资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup
网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stder/stdin),用于实时检索或批量检索
变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器,无需使用模板或手动配置
交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell
Docker优点:
1.比VM小,比VM快,Docker容器的尺寸减小,相比整个虚拟机大大简化了分布到云和从云分发的时间和开销。Docker启动一个容器实例时间很短,一到两秒就可以启动。
2.对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT的发布速度更快。
Docker是一个开放的平台,构建,发布和运行分布式应用程序。
Docker使应用程序能够快速从组件组装和避免开放和生产环境之间的摩擦。
3.可以在部署公司局域网或云或虚拟机上使用它。
4.使用Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统,然后,在部署时一切还是一样的,因为都在Docker的容器上运行。
5.Google,微软azure,亚马逊,IBM等都支持Docker
6.Docker支持Unix/Linux操作系统,也支持Windows或Mac
Docker缺点:
1.Docker用于应用程序时是最有用的,但并不包含数据。日志跟踪和数据库等通常应放在Docker容器外。一个容器的镜像通常都很小,不适合存储大量数据,存储可以通过外部挂载的方式使用。如:NFS、ipsan、MFS等。
oracle不适合使用docker来运行,太大了,存储的数据太多
二、部署docker容器虚拟化平台
1、安装docker环境依赖
[root@nginx ~]# yum install -y yum-utils device-mapper-persistrnt-data lvm2
2、配置国内docker-ce的yum源
[root@nginx ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@nginx ~]# ls /etc/yum.repos.d/docker-ce.repo
/etc/yum.repos.d/docker-ce.repo
[root@nginx ~]# yum install docker-ce docker-ce-cli containerd.io -y
###docker-ce-cli作用是docker命令行工具包
###containerd.io作用是容器接口相关包
###yum info 软件包名 -->可以查看一个包的具体作用
[root@nginx ~]# systemctl start docker && systemctl enable docker
[root@nginx ~]# cat /proc/sys/net/ipv4/ip_forward
1 #安装完docker后会自动把ip_forward转发功能打开
[root@nginx ~]# docker version #显示docker版本信息
[root@nginx ~]# docker info #查看docker信息,显示docker系统信息,包括镜像和容器数
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.21
Storage Driver: overlay2
Backing Filesystem: xfs
Docker Root Dir: /var/lib/docker #默认的docker的家目录
Debug Mode: false
Registry: https://index.docker.io/v1/ #默认去这个网站找docker镜像
3、下载docker镜像
[root@nginx ~]# docker search centos #搜索
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos DEPRECATED; The official build of CentOS. 7428 [OK]
kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 26
couchbase/centos7-systemd centos7-systemd images with additional debug… 6 [OK]
dokken/centos-7 CentOS 7 image for kitchen-dokken
NAME:docker镜像名字
DESCRIPTION:描述
STARS:受欢迎程度
OFFICIAL:是否官方提供
下载方法一:
docker pull centos #直接从公网docker hub 拉取下载image
Using default tag:latest
Error response from daemon:Get https://registry-1.docker.io/v2/: net/http:TLS handshake timeout
#如果网络慢,网络卡会报错,导致无法连接到docker hub下载镜像,可以多拉取几次。
方法二:使用阿里云docker镜像加速器,提升pull速度
首先登录容器Hub服务 https://cr.console.aliyun.com控制台,使用支付宝账户登录,左侧的加速器帮助页面会为你独立分配加速地址
[root@nginx ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 15 months ago 231MB
方法三:把下载好的image镜像导入image
参数:docker load -i 镜像路径
方法四:直接下载其他站点的镜像
docker pull hub.c.163.com/library/tomcat:latest
docker下载完成后要配置允许路由转发
[root@nginx ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@nginx ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@nginx ~]# cat /proc/sys/net/ipv4/ip_forward
1 #结果为1表示路由转发功能开启
[root@nginx ~]# systemctl stop firewalld && systemctl disable firewalld.service
[root@nginx ~]# systemctl restart docker
###关闭防火墙,要把docker服务重启,不然docker的ip包转发功能无法使用。即使防火墙关闭,docker会调用内核模块netfilter增加规则。
docker镜像相当于,对程序+程序依赖的库打一个包
软件是依赖操作系统中的库或二进制文件,如果我把软件所依赖的库和二进制文件打包在一起发布,不用物理机系统上的文件,不依赖操作系统。
三、docker平台基本使用方法
1、docker常用参数:run
run -->运行
-i -->以交互模式运行容器,通常与-t同时使用
-t -->为容器重新分配一个伪输入终端,通常与-i同时使用
-d -->后台运行容器,并返回容器ID
-c -->后面跟待完成的命令
[root@nginx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 15 months ago 231MB
[root@nginx ~]# docker run -it centos /bin/bash #启动一个实例
[root@8eafc7b19905 /]# cat /etc/redhat-release
CentOS Linux release 8.4.2105
[root@nginx ~]# ps -aux | grep bash #在物理机上可以看到docker的进程
root 639 0.0 0.0 115256 936 ? S 12月14 0:02 /bin/bash /usr/sbin/ksmtuned
root 1545 0.0 0.0 51332 584 ? Ss 12月14 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 5723 0.0 0.5 944960 21600 pts/2 Sl+ 20:43 0:00 docker run -it centos /bin/bash
[root@nginx ~]# docker run -d centos /bin/bash -c 'while true;do echo hello world; sleep 1; done'
48c80152af7789f6640038516e7a9963537720bf78cb1ca440c9373a0736d66d #docker实例ID
2、从一个容器中取日志,查看输出的内容 --可用于后期检查docker实例在标准输出中弹出的错误信息或正常信息
语法: docker logs 容器实例的NAME/ID
[root@nginx ~]# docker logs 48c80152af7789f6640038516e7a9963537720bf78cb1ca440c9373a0736d66d
hello world
hello world
hello world
hello world
hello world
hello world
hello world
[root@nginx ~]# docker logs 48c80152af7789f66400 ####ID唯一不用输入全部字符也可以查看
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
3、查看正在运行的容器
列出所有运行中的容器
[root@nginx ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48c80152af77 centos "/bin/bash -c 'while…" 7 minutes ago Up 7 minutes stupefied_brahmagupta
列出所有容器(包含沉睡/退出状态的容器)
docker ps -a
4、终止容器
docker kill ID
5、container容器端口映射
docker run -d -p 80:80 容器NAME
-p -->物理机的80端口:容器实例的80端口 , 把容器中的80端口映射到物理机上的80端口
单台docker的网络结构: