飞道的博客

Docker入门(基础篇)

234人阅读  评论(0)

Docker相关概念

为什么需要Docker

为什么会出现Docker了?现在我们假设你在开发一个项目,你使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。此外,你的项目还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销。请问?您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术
环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。Docker就完美解决了这个移植环境引起的环境问题就好像是从搬家到搬楼。就好像是我们再一个地方住了很久突然找到了工作需要搬过去那么到了那里这个环境肯定是不一样的,再搬的过程当中难免会出现这个问题。Docker的出现就解决了这个问题就好像有一个很大的航空母舰把你所住的那一层楼连根拔起然后放到航空母舰上运到你工作的地方这样就不会有问题了。哈哈哈哈哈只是举个例子

Docker的理念

Docker 的理念是这个集装箱、标准化、隔离.
Docker是基于Go语言实现的云开源项目。Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。不会因为环境的变化而导致写好的程序无法部署起来


如果用一句话话来概括Docker的理念那么可以是:一次镜像,处处运行。从搬家到搬楼。说直白点就是我们将编写好的程序+运行环境+配置文+特殊引导第三方组件等等打成一个包这个包我们叫做镜像文件。也就是一次镜像处处运行从搬家到搬楼。这就是Docker最重要的理念.
Docker解决了运行环境和配置问题的软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术。

容器与虚拟机的比较

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
但是这个因此也带来了这个缺点,其缺点主要有以下几点:

  • 占用资源多
  • 启动慢
  • 冗余步骤

针对以上问题
Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为 LXC)
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。


下面我们比较一下这个容器和虚拟机的区别

  • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
  • 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。

Docker的安装与使用

安装Docker

下面演示的是再Centos7下安装这个Docker的方法,其他操作系统各位铁子可以自行百度。首先如果已经装了这个Docker可以使用以下命令进行卸载

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

执行完成之后我们可以开始使用yum安装这个docker了。首先我们先安装这个依赖包

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

下载完成之后就可以开始安装这个Docker了。
Docker 软件包已经包括在默认的 CentOS-Extras 软件源里。因此想要安装 docker,只需要运行下面的 yum 命令

$ sudo yum install docker

当然在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装:

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。安装完成后,运行下面的命令,验证是否安装成功:

docker version
or
docker info

如果返回docker的相关信息那么就说明这个安装成功。下面我们将docker启动起来

$ sudo systemctl enable docker
$ sudo systemctl start docker

下面我们简单的使用一下这个docker.就以我们学习过程当中最基础的hello-word为例简单使用一下这个docker.
由于服务器日常崩溃了, docker 出了点问题,所以以下案例的演示是基于 Kali Linux 环境下进行的。
我们通过最简单的 image 文件 hello world,感受一下 Docker 的魅力吧!
我们直接运行下面的命令,将名为 hello-world 的 image 文件从仓库抓取到本地。

docker pull hello-world

拉取成功之后我们就可以再这个本地看到这个镜像了。我们可以使用docker images进行查看

docker images


现在,我们可以运行 hello-world 这个 image 文件

docker run hello-world

结果如下:

如果看到这个就说明我们的docker已经安装好了。恭喜你安装成功当然再安装的过程当中各位铁子可能出现各自环境问题各位铁子可以自行百度。

docker 的三要素

docker 的基本组成.docker主要由这个镜像、容器和仓库组成.下面我们来解释一下这三个东西分别是什么意思首先我们先来看看这个镜像指的是什么意思。
1.定义:Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
2.作用 : Docker镜像是用来启动容器的,也用来创建新的容器,类似于虚拟机的快照。
3.特点 : 镜像不包含任何动态数据,其内容在构建之后也不会被改变,在Docker里可以创建镜像,也可以从第三方的网站上下载别人已经做好的镜像来使用。

容器
下面我们再来看看这个容器的意思
1.定义 : 一个Docker镜像可以实例化出来多个容器,而每一个容器之间是独立运行的,没有任何依赖
2.作用 : 运行程序员开发的应用程序的
3.特点 : Docker镜像是不能运行的,是静态的,而Docker容器是运行的,是动态的,可以将Docker容器想像成一个简化版的操作系统和一些核心基础的应用。每个容器运行一个独立的应用程序。

仓库:
定义 : Docker仓库提供一个注册服务器,用于存储多个仓库,而仓库是用来存储镜像位置的
作用: 我们自已创建了一个镜像之后,可以使用push命令将镜像文件上传到仓库中,后期如果在其它服务器上需要使用镜像,就可以从仓库上下载过来并使用。

总结:
说白了镜像就等于一个centos系统的安装程序,一个镜像只是一个只读环境而已,这个镜像提供的是基础的运行环境,而你在Centos7系统中安装的应用,比如Redis,Mysql这些应用就相当于一个容器,这些容器都是单独可运行的,仓库的概念就更好理解了,在Centos7系统中下载的所有应用都被收集到同一个仓库里了,比如Maven仓库。

Docker常用命令

1.启动类命令

1.启动docker: systemctl start docker
2.停止docker: systemctl stop docker
3.重启docker: systemctl restart docker
4.查看docker状态: systemctl status docker
5.开机启动: systemctl enable docker
6.查看docker概要信息: docker info

7.查看docker总体帮助文档: docker --help
8.查看docker命令帮助文档: docker 具体命令 --help

由于上面的命令都比较的简单所以了再这里博主就简单的演示一个命令即可。不这个一一的演示

如果当我们忘了之后我们就可以使用docker help 进行查看。和Linux当中的man有点类似

2.镜像命令

docker images

下面我们使用这个命令看看这个效果如何

下面我们来解释一下上面这些东西的含义

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签版本号
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像
下面我们来看看这个命令的选项字段的含义

  • ·-a :列出本地所有的镜像(含历史映像层)
  • ·-q :只显示镜像ID。

下面我们来演示一下

·docker search 某个XXX镜像名字。下面我们以这个redis为例

docker search redis

下面我们说一下这个命令的参数部分:
·–limit : 只列出N个镜像,默认25个。下面我们同样使用redis来做这个实验
docker search --limit 5 redis

·docker pull 某个XXX镜像名字。·下载镜像使用这个命令主要有下面这两种方式

docker pull 镜像名字
docker pull ·镜像名字[:TAG]

注意如果我们没有加这个TAG那么默认就是最新的。这个由于再上面已经使用过了再这里就不再演示了

查看镜像/容器/数据卷所占的空间

docker system df 


删除某个镜像文件
我们可以使用docker pull 将镜像拉取到本地那么我们当然也可以删除再本地的这个镜像文件我们可以使用这个

docker rmi 镜像ID
docker rmi -f 镜像ID


当然如果我们需要删除这个多个镜像的时候我们只需要载这个 rmi 后面依次跟着就可以了。

当然如果我们需要删除这个所有的镜像我们可以使用这个命令但是这个命令一定要谨慎使用

docker rmi $(docker images -aq)

3.容器命令

·有镜像才能创建容器, 这是根本前提(下载一个CentOS或者ubuntu镜像演示)。再这里我们以这个ubuntun为例来举这个例子

docker pull ubuntu
docker run ubuntu //但是这样没有这个命令行我们需要给我们返回一个终端进行操作

·新建+启动容器
·docker run [OPTIONS] IMAGE [COMMAND] [ARG…] 当然这里有一些选项下面我们一个一个来看

OPTIONS说明(常用):有些是一个减号,有些是两个减号

1.–name=“容器新名字” 为容器指定一个名称;
2. -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
3. -i:以交互模式运行容器,通常与 -t 同时使用;
4. -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; 也即启动交互式容器(前台有伪终端, 等待交互);
5. -P: 随机端口映射,大写P
6.-p: 指定端口映射,小写p

下面我们来演示一下上面这些命令

docker run -it --name="ksy" ubuntu


我们发现这样会给我们返回一个终端。其他i代表的是这个interavtive 而其中的 t代表的意思是这个teminal终端的意思
此时我们可以使用这个docker ps 进行查看

如果我们想要退出这个给我们返回的这个终端我们可以使用这个exit命令

·列出当前所有正在运行的容器

docker ps 

由于这个命令非常的简单所有了再这里我直接列出这条命令和其选项字段

-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号

下面简单的演示一下

·退出容器
退出容器我们有两种方式。他们分别是这个

exit
ctr+p+q

再这里需要注意的是:run进去容器,ctrl+p+q退出,容器不停止.

容器的启动和停止
·启动已停止运行的容器

·docker start 容器ID或者容器名

重启容器

      docker restart 容器ID或者容器名

·停止容器

·docker stop 容器ID或者容器名

·强制停止容器

docker kill 容器ID或容器名

·删除已停止的容器注意如果容器正在运行需要加上 -f 选项进行删除

·docker rm 容器ID

·一次性删除多个容器实例

docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

再这里说一下这个
有镜像才能创建容器,这是根本前提(下载一个Redis6.0.8镜像演示)。·启动守护式容器(后台服务器)。

在大部分的场景下,我们希望 docker 的服务是在后台运行的, 我们可以过 -d 指定容器的后台运行模式。·模式docker run -d 容器名。所谓的后台运行我们希望这个他再后台默默运行

注意有些镜像必须使用这个 -it进行前台的这种形式进行这个交互否则会出现这个docker ps -a 进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,
常见就是命令行模式,表示我还有交互操作,别中断。

查看这个容器里面的日志

docker logs 容器ID

这个命令非常的简单再这里就不再演示了。铁子们可以自行测试

重新进入容器即进入正在运行的容器并以命令行交互

docker exec -it 容器id
docker attach 容器id

这两个的区别主要是这个docker exec -it 会创建一个新的进程当我们使用exit 之后容器不会停止。
而这个docker attach 进去容器之后使用exit 之后会将容器停止这是我们不想看到的。

从容器里面拷贝文件到主机里面
·docker cp 容器ID:容器内路径 目的主机路径
下面我们来演示一下

导入容器和导出容器
·export 导出容器的内容留作为一个tar归档文件[对应import命令]
·import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
·案例。
·docker export 容器ID > 文件名.tar。
·cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号。


转载:https://blog.csdn.net/qq_56999918/article/details/128327184
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场