一、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容器安装与基本使用_docker

docker服务相当于鲸鱼,container容器就是集装箱

container:容器,集装箱

docker:码头工人

docker源代码:​​https://github.com/moby/moby​

2、Docker容器技术和虚拟机

相同点:docker容器技术和虚拟机技术,都是虚拟化技术

Docker容器安装与基本使用_nginx_02

Docker没有自己的系统,与OS共享资源,所以docker效率比虚拟机高

3、Docker架构

Docker容器安装与基本使用_docker_03

工作流程:服务器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​​控制台,使用支付宝账户登录,左侧的加速器帮助页面会为你独立分配加速地址

Docker容器安装与基本使用_docker_04

[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的网络结构:

Docker容器安装与基本使用_nginx_05