Docker入门指南(1):Docker简介与原理

转载请声明出处:https://blog.csdn.net/AndrExpert/article/details/96747141

 Docker是基于Go语言实现的云开源项目,它的主要目标是“Build,Ship and Run Any APP,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以使一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。Docker技术是在基于Linux容器技术发展而来的,这种容器的优势在于我们将应用运行在Docker容器上面,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器,即只需要一次配置好环境,换到别的主机上就可以一键部署好,大大简化了操作
在这里插入图片描述

1.docker安装

 考虑到自己平时用centos和ubuntu较多,因此,本文主要介绍这两种系统docker的安装方法,其他系统可以参照docker官网教程。需要注意的是,对于centos和ubuntu来说,目前最新版的docker ce(v18.09.8)要求centos 7系统以上,ubunt16.04以上64bit系统。

1.1 Centos 7

(1) 卸载旧版本docker

# 卸载docker
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 删除原来的所有镜像、容器、容器卷等
$ sudo rm -rf /var/lib/docker

(2) 安装docker repository(仓库)

# 安装所需库,其中
# yum-utils 用于提供yum-config-manager工具
# device-mapper-persistent-data和lvm2是devicemapper存储驱动依赖库
$ sudo yum install -y yum-utils \
      device-mapper-persistent-data lvm2
    
# 设置stable repository
$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

(3) 安装、启动docker ce(社区版)

# 安装最新版本的Docker CE和containerd
$ sudo yum install docker-ce docker-ce-cli containerd.io

# 启动docker ce
$ sudo systemctl start docker

(4) 验证docker是否安装成功

$ sudo docker run hello-world

 该命令的作用是运行镜像hello-world,如果本地没有该镜像,docker就会去hub.docker仓库去下载这个镜像,并为其创建一个容器运行。docker安装成功效果:

在这里插入图片描述

(5) 配置镜像加速器

 由于docker镜像仓库部署在国外,下载速度是非常慢的,好在国内有阿里、网易等公司直接将仓库的资源搬到国内了,为了提高镜像下载速度,这里我们需要将镜像仓库配置成阿里云的。首先,我们需要在阿里云注册一个账户,并登录阿里云找到容器镜像服务中的镜像加速器地址,需要注意的是,这个加速器地址是与我们的阿里云账户绑定的,在开发过程中,我们需要使用自己的加速器地址:

在这里插入图片描述

 然后,打开centos命令终端,修改daemon配置文件/etc/docker/daemon.json来使用加速器

$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jeek2ede.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

 最后,我们使用docker info命令,检查是否配置成功,如成功,centos命令终端会打印一堆信息出来,包括Containers、Images数量、docker版本、Registry mirror地址(就是我们刚刚配置的镜像加速地址)等。

(6) 卸载docker ce及其资源

# 卸载docker ce
$ sudo yum remove docker-ce
# 删除所有镜像、容器和数据卷
$ sudo rm -rf /var/lib/docker

1.2 ubuntu16.04

(1) 卸载旧版本docker

# 卸载docker
$ sudo apt-get remove docker docker-engine docker.io containerd runc
# 删除原来的所有镜像、容器、容器卷等
$ sudo rm -rf /var/lib/docker

(2) 安装docker repository(仓库)

# 更新apt-get
$ sudo apt-get update
    
# 安装允许apt通过HTTPS使用仓库的包
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
    
# 添加Docker的官方GPG密钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
# 设置stable repository
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

(3) 安装、启动docker ce(社区版)

# 安装最新版本的Docker CE和containerd
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

(4) 验证docker是否安装成功

$ sudo docker run hello-world

(5) 配置阿里云镜像加速器

$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jeek2ede.mirror.aliyuncs.com"]
}
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo docker info

 最后,我们使用docker info命令,检查是否配置成功,如成功,centos命令终端会打印一堆信息出来,包括Containers、Images数量、docker版本、Registry mirror地址(就是我们刚刚配置的镜像加速地址)等。

(6) 卸载docker ce及其资源

# 卸载docker ce
$ sudo apt-get purge docker-ce
# 删除所有镜像、容器和数据卷
$ sudo rm -rf /var/lib/docker

2. docker工作原理

2.1 虚拟机与容器虚拟化技术

虚拟机(Virtual machine),即带环境安装的一种解决方案,具体来说是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,它支持在一个系统中运行另一个系统,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件、保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响。也就是说,虽然虚拟机看上去跟真实系统简直是一模一样,但是对于真实系统来说,虚拟机就是一个普通的文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序、操作系统和硬件三者之间的逻辑不变。

虚拟机系统

 虽然虚拟机技术实现了在同一个宿主机上运行多个操作系统,每个操作系统都有自己独立的一个虚拟机,且虚拟机之间共享文件、硬件、网络等资源,但是从某些角度来说,虚拟机还是存在一些不足,比如资源占用多、冗余步骤多以及启动慢等。为了缓解这个问题,Linux发展出了另一种虚拟技术:Linux容器(Linux Containers,缩写LXC)Linux容器技术不是模拟一个完整的操作系统,而是对进程进行隔离,即Linux容器是与系统其它部分隔离开的一系列进程,每个容器进程都包含可以将软件运行所需的所有资源,而运行这些进程所需的所有文件都有一个镜像提供,这就意味着从开发到测试再到生产的整个过程中,Linux容器都具有可移植性和一致性。

 从上图两者的区别可知,容器与虚拟机还是有很大的不同,容器不需要捆绑一整套操作系统,只需要软件工作所需的运行环境、库资源和设置等,系统因此变得高效、轻量并保证部署在任何环境中的软件都能始终如一地运行。它们的主要区别如下:

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统;
  • 容器内的应用进程运行在宿主机的内核,容器内没有自己的内核,也没有进行硬件虚拟;
  • 每个容器间相互隔离且有自己的文件系统,容器之间进程不会相互影响;

2.2 docker架构与底层原理

 Docker容器技术是基于Linux容器发展而来的一种虚拟化技术,相比VMWare虚拟机,Docker实现了一种轻量的虚拟化技术,具有很好的性能和安全性。Docker支持将一个应用程序所有的服务单独用容器打包起来,分别部署和运行,从而简化了整个应用程序维护的复杂度,同时解耦了模块之间的耦合性,便于不同模块单独开发和维护升级。Docker容器技术主要体现在如下三个方面

  • 编译

 Docker支持使用微服务方式来组织应用程序,而不用担心上线环境和测试环境不一致,并且不用关心运行平台和语言,因为Docker镜像是跨平台,真正实现一次编译,到处运行。

  • 装运

 通过Docker可以设计应用程序开发,测试,发布的整个周期,并且用统一的用户接口去管理,Docker 提供了两个非常重要的概念,Docker 容器Docker 镜像,目前几乎成为企业标准。

  • 运行

 Docker 可以部署可扩展的服务,Docker 容器具有很好的隔离性,程序运行在 Docker 容器中更加安全可靠,可以部署运行在各种 Linux X64 平台上。

docker架构原理:

 Docker是一个Client-Server结构系统,Docker引擎(Docker Daemon,即Docker守护进程)作为服务端,运行在宿主机上,主要用来构建、发布、分发和运行Dcoker容器。然后,Docker客户端利用CLI或Remote API的方式通过Socket连接与Docker引擎进行通信,比如镜像下载、容器管理等。下图是docker的架构模型:


 其中,Docker Image即Docker镜像,类似于系统镜像(.iso),是一个只读的模板,一个Docker镜像可以用来创建多个Docker容器;Docker Container即Docker容器,类似于用系统镜像安装在虚拟机上的OS,由Docker镜像创建,Docker容器是一个运行时环境且持有应用程序运行所需要的所有环境,且具有 run,started,stopped,moved,和 deleted 这几种状态,每一个容器是一个隔离的,安全的应用程序运行平台,Docker 容器是 Docker 运行的组件;Docker Registry即Docker镜像仓库,用来存储和分发Docker镜像,其中**Docker Hub**就是Docker官方提供的公有Docker Registry。

3. docker常用命令

 docker提供了较多的命令便于我们管理镜像、容器、数据卷等模块,具体可以通过在命令终端执行docker --help来查询。总的来说,可以分为以下几类:

  • builder Manage builds
  • config Manage Docker configs
  • container Manage containers
  • engine Manage the docker engine
  • image Manage images
  • network Manage networks
  • node Manage Swarm nodes
  • plugin Manage plugins
  • secret Manage Docker secrets
  • service Manage services
  • stack Manage Docker stacks
  • swarm Manage Swarm
  • system Manage Docker
  • trust Manage trust on Docker images
  • volume Manage volumes

 具体命令如下:docker [cmd] […]

attach    # 当前 shell 下 attach 连接指定运行镜像
build     # 通过 Dockerfile 定制镜像
commit    # 提交当前容器为新的镜像
cp        # 从容器中拷贝指定文件或者目录到宿主机中
create    # 创建一个新的容器,同 run,但不启动容器
diff      # 查看 docker 容器变化
events    # 从 docker 服务获取容器实时事件
exec      # 在已存在的容器上运行命令
export    # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history   # 展示一个镜像形成历史
images    # 列出系统当前镜像
import    # 从tar包中的内容创建一个新的文件系统映像[对应export]
info      # 显示系统相关信息
inspect   # 查看容器详细信息
kill      # kill 指定 docker 容器
load      # 从一个 tar 包中加载一个镜像[对应 save]
login     # 注册或者登陆一个 docker 源服务器
logout    # 从当前 Docker registry 退出
logs      # 输出当前容器日志信息
port      # 查看映射端口对应的容器内部源端口
pause     # 暂停容器
ps        # 列出容器列表
pull      # 从docker镜像源服务器拉取指定镜像或者库镜像
push      # 推送指定镜像或者库镜像至docker源服务器
restart   # 重启运行的容器
rm        # 移除一个或者多个容器
rmi       # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
run       # 创建一个新的容器并运行一个命令
save      # 保存一个镜像为一个 tar 包[对应 load]
search    # 在 docker hub 中搜索镜像
start     # 启动容器
stop      # 停止容器
tag       # 给源中镜像打标签
top       # 查看容器中运行的进程信息
unpause   # 取消暂停容器
version   # 查看 docker 版本号
wait      # 截取容器停止时的退出状态值
发布了83 篇原创文章 · 获赞 293 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/AndrExpert/article/details/96747141