docker之入门——安装及基本命令

Docker简介

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,听从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。html

Docker 项目的目标是实现轻量级的操做系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。linux

(背景),云计算兴起后,服务器硬件扩展很是便利,软件服务部署成为了瓶颈,docker趁势而兴。nginx

为何用 Docker 

容器的启动能够在秒级实现,比传统的虚拟机方式要快得多git

对系统资源的利用率很高,一台主机上能够同时运行数千个 Docker 容器github

docker的出现,让开发/测试/线上的环境部署,成为便利一条龙。docker

 

更快速的交付和部署

对开发和运维(devop)人员来讲,最但愿的就是一次建立或配置,能够在任意地方正常运行。ubuntu

开发者可使用一个标准的镜像来构建一套开发容器,开发完成以后,运维人员能够直接使用这个容器来部署代码。 Docker 能够快速建立容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其余成员更容易理解应用程序是如何建立和工做的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。centos

更高效的虚拟化

Docker 容器的运行不须要额外的 hypervisor 支持,它是内核级的虚拟化,所以能够实现更高的性能和效率。数组

更轻松的迁移和扩展

Docker 容器几乎能够在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、我的电脑、服务器等。 这种兼容性可让用户把一个应用程序从一个平台直接迁移到另一个。安全

更简单的管理

使用 Docker,只须要小小的修改,就能够替代以往大量的更新工做。全部的修改都以增量的方式被分发和更新,从而实现自动化而且高效的管理。

对比传统虚拟机总结

特性

容器

虚拟机

启动

秒级

分钟级

硬盘使用

通常为 MB

通常为 GB

性能

接近原生

弱于

系统支持量

单机支持上千个容器

通常几十个

Docker基本概念

Docker架构

 

 

host --- 主机载体 == docker安装的地方

继承类比:

Class2   extents     Class1    ---------------------- Object o = new Class2

--------------------------------------此时,o对象的结构中,有Class1的成员结构

    image2 extents     image1   ----------------------Container c = new image2

-------------------------------------此时,c容器中,有image1的文件

Docker 镜像

Docker 镜像就是一个只读的模板。

例如:一个镜像能够包含一个完整的 ubuntu 操做系统环境,里面仅安装了 Apache 或用户须要的其它应用程序。

镜像能够用来建立 Docker 容器。

Docker 提供了一个很简单的机制来建立镜像或者更新现有的镜像,用户甚至能够直接从其余人那里下载一个已经作好的镜像来直接使用。

Docker 容器

Docker 利用容器来运行应用。

容器是从镜像建立的运行实例。它能够被启动、开始、中止、删除。每一个容器都是相互隔离的、保证安全的平台。

能够把容器看作是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

Docker 仓库

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上每每存放着多个仓库,每一个仓库中又包含了多个镜像,每一个镜像有不一样的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。

固然,用户也能够在本地网络内建立一个私有仓库。

当用户建立了本身的镜像以后就可使用 push 命令将它上传到公有或者私有仓库,这样下次在另一台机器上使用这个镜像时候,只须要从仓库上 pull 下来就能够了。

容器、镜像的运行关系

 

 

 

安装 Docker

 Docker 支持 CentOS6 及之后的版本。

卸载

1.查询安装过的包

yum list installed | grep docker

docker-engine.x86_64                 17.03.0.ce-1.el7.centos         @dockerrepo

 2.删除安装的软件包

yum -y remove docker-engine.x86_64 

3.删除镜像/容器等

rm -rf /var/lib/docker

 

CentOS6

对于 CentOS6,可使用 EPEL 库安装 Docker,命令以下

$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm

$ sudo yum install docker-io

CentOS7

CentOS7 系统 CentOS-Extras 库中已带 Docker,能够直接安装:

$ sudo yum install docker     ##不是最新版本

 

 

#最新版安装

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

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

sudo yum install docker-ce

 

查看docker版本

docker version

docker info

启动docker

sudo service docker start

设置随系统启动

sudo chkconfig docker on

Docker初体验

docker run hello-world  ##进入docker世界

 

Docker基本操做

容器操做

docker [run|start|stop|restart|kill|rm|pause|unpause]

  • run/create[镜像名]  建立一个新的容器并运行一个命令
  • start/stop/restart[容器名]:启动/中止/重启一个容器
  • kill [容器名]: 直接杀掉容器,不给进程响应时间
  • rm[容器名]:删除已经中止的容器
  • pause/unpause[容器名]:暂停/恢复容器中的进程
  • ps:查看容器列表(默认查看正在运行的容器,-a查看全部容器
  • inspect[容器名]:查看容器配置元数据
  • exec -it [容器名] /bin/bash:进入容器环境中交互操做
  • logs --since="2019-02-01" -f --tail=10 [容器名]:查看容器日志 
  • cp path1 [容器名]:path 容器与主机之间的数据拷贝
  • export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系统做为一个tar归档文件
  • import test.tar [镜像名:版本号]:导入归档文件,成为一个镜像

docker [ps|inspect|exec|logs|export|import]

 

 

镜像操做

docker images|rmi|tag|build|history|save|load]

  • images列出本地镜像列表
  • rmi [镜像名:版本]:删除镜像
  • tag [镜像名:版本] [仓库]/[镜像名:版本]标记本地镜像,将其纳入某一仓库
  • build -t [镜像名:版本] [path]:Dockerfile 建立镜像
  • history [镜像名:版本]查看指定镜像的建立历史
  • save -o xxx.tar [镜像名:版本] /  save [镜像名:版本]>xxx.tar : 镜像保存成 tar 归档文件
  • load --input  xx.tar / docker load<xxx.tar : 从归档文件加载镜像

镜像与容器原理及用法探究

history命令查看镜像层

例:docker history hello-world

 

 显示镜像hello-world分三层,其中两个空层

查看镜像文件

镜像存放在imagedb

通常在image/overlay2/imagedb/content/sha256

 

打开一个镜像文件查看其内容:

cat f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80

{
"architecture": "amd64",
"config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/hello"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"container": "8e2caa5a514bb6d8b4f2a2553e9067498d261a0fd83a96aeaaf303943dff6ff9",
"container_config": {
"Hostname": "8e2caa5a514b",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/bin/sh", "-c", "#(nop) ", "CMD [\"/hello\"]"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"created": "2019-01-01T01:29:27.650294696Z",
"docker_version": "18.06.1-ce",
"history": [{
"created": "2019-01-01T01:29:27.416803627Z",
"created_by": "/bin/sh -c #(nop) COPY file:f77490f70ce51da25bd21bfc30cb5e1a24b2b65eb37d4af0c327ddc24f0986a6 in / "
}, {
"created": "2019-01-01T01:29:27.650294696Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/hello\"]",
"empty_layer": true
}],
"os": "linux",
"rootfs": {
"type": "layers",
"diff_ids": ["sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3"]
}
}

 

----其中,history数组内,标识了镜像的历史记录(与history命令内容对应)

----rootfsdiff_ids中,对应了依赖使用中镜像层文件(history命令中size大于0的层)

 

查看镜像层文件

层文件在layerdb

ll /var/lib/docker/image/overlay2/layerdb/sha256

 

#镜像层文件内结构:

 

 

镜像与容器总结

一个镜像就是一层层的layer层文件,盖楼而成,上层文件叠于下层文件上,若上层文件有与下层文件重复的,则覆盖掉下层文件重复的部分,以下图:

 

---------初始挂载时读写层为空。

---------当须要修改镜像内的某个文件时,只对处于最上方的读写层进行了变更,不复写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本文件所隐藏,当 docker commit 这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。

---------联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(aufsoverlay) 实现分层合并的方式。

 

容器建立详解

交互式建立容器并进入:

docker run -it --name centos centos /bin/bash(前台进程)

------------------------exit退出也关闭容器; Ctrl+P+Q退出不关闭容器

 

 

后台启动容器:

 

 

docker run -d --name nginx nginx

进入已运行的容器:

docker exec -it nginx /bin/bash

查看容器的元数据: docker inspect nginx  

绑定容器端口到主机:

docker run -d -p 8080:80 --name nginx nginx:latest

挂载主机文件目录到容器内:

 docker run -dit -v /root/peter_dir/:/pdir --name cent centos

复制主机文件到容器内:

docker cp anaconda-ks.cfg cent:/var

相关文章
相关标签/搜索