docker入门
docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在LXC的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机 一样简单。
Docker虚拟化有三个概念需要理解,分别镜像、容器、仓库。 镜像:Docker的镜像其实就是模板,跟我们常见的ISO镜像类似,是一个样板。 容器:使用镜像常见的应用或者系统,我们称之为一个容器。 仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式。
docker引擎架构
docker引擎是一个C/S结构的应用
server是一个常驻进程,REST API实现了client和server间的交互协议,CLI实现容器和镜像的管理,为用户提供统一的操作界面。client通过接口与server进程通信实现容器的构建、运行和发布。
安装docker
确保centos系统内核版本高于3.10
[root@localhost ~]# uname -r
3.10.0-514.el7.x86_64
安装依赖包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
添加docker软件源
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
更新YUM缓存
[root@localhost ~]# yum makecache fast
安装docker ce
[root@localhost ~]# yum -y install docker-ce
设置默认国内镜像仓库
[root@localhost ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
查看版本
[root@localhost ~]# docker version
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:48:22 2018
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:19:08 2018
OS/Arch: linux/amd64
Experimental: false
docker镜像管理
镜像不是一个单一的文件,而是由多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>中。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。
镜像的工作原理:
当我们启动一个新的容器时,Docker会加载只读镜像,并在其之上添加一个读写层,并将镜像中的目录复制一份到/var/lib/docker/aufs/mnt/容器ID为目录下,我们可以使用chroot进入此目录。如果运行中的容器修改一个已经存在的文件,那么会将该文件从下面的只读层复制到读写层,只读层的这个文件就会覆盖,但还存在,这就实现了文件系统隔离,当删除容器后,读写层的数据将会删除,只读镜像不变。
镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。 地址:https://hub.docker.com/explore 配置镜像加速器:https://www.daocloud.io/mirror curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
镜像常用命令
ls 列出镜像
build 构建镜像来自dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除镜像
prune 移除未使用的镜像,没有被标记或被任何容器引用的。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到tar归档文件
load 加载镜像来自tar归档或标准输出
从docker仓库搜索镜像
[root@localhost ~]# docker search nginx
获取镜像
[root@localhost ~]# docker pull nginx
查看镜像
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 62f816a209e6 13 days ago 109MB
查看镜像的历史分层
[root@localhost ~]# docker history nginx
导出一个镜像
[root@localhost ~]# docker image save nginx > nginx.tar
导入一个镜像
[root@localhost ~]# docker load < nginx.tar
删除镜像
[root@localhost ~]# docker image rm nginx
创建镜像的方法有以下3种方式: (1)基于已有镜像的容器创建 (2)基于本地模板导入 (3)基于Dockerfile创建
容器管理
Docker容器,可以理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而Docker容器所占用的文件系统资源,则通过Docker镜像的镜像层文件来提供。 基于每个镜像的json文件,Docker可以通过解析Docker镜像的json的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,Docker守护进程实现了静态向动态的转变。
当使用docker run来创建并启动容器时,Docker在后台运行的标准操作: (1)检查本地是否存在指定的镜像centos,不存在就从公有仓库下载 (2)利用镜像创建并启动一个容器 (3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层 (4)从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去 (5)从地址池配置一个IP地址给容器 (6)执行用户指定的应用程序 (7)执行完毕后,容器被终止
创建容器常用选项
选项 描述
-i, –interactive 交互式
-t, –tty 分配一个伪终端
-d, –detach 运行容器到后台
-e, –env 设置环境变量
-p, –publish list 发布容器端口到主机
-P, –publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
–name string 指定容器名称
-h, –hostname 设置容器主机名
–ip string 指定容器IP,只能用于自定义网络
–network 连接容器到一个网络
–mount mount 将文件系统附加到容器
-v, –volume list 绑定挂载一个卷
–restart string 容器退出时重启策略,默认no,可选值:[always|on-failure]
管理容器的常用命令
选项 描述
ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行容器中执行命令
commit 创建一个新镜像来自一个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start 停止/启动一个或多个容器
rm 删除一个或多个容器
创建容器
[root@localhost ~]# docker create -it nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
f17d81b4b692: Pull complete
82dca86e04c3: Pull complete
046ccb106982: Pull complete
Digest: sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341
Status: Downloaded newer image for nginx:latest
f51d7ef037f53073825efda4ad76d99a3041328c2569ccf337388c72f2f2bd4a
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f51d7ef037f5 nginx "nginx -g 'daemon of…" 8 seconds ago Created competent_kalam
[root@localhost ~]# docker start f51d7ef037f5 #启动容器
f51d7ef037f5
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f51d7ef037f5 nginx "nginx -g 'daemon of…" About a minute ago Up 3 seconds 80/tcp competent_kalam
进入容器
[root@localhost ~]# docker exec -it f51d7ef037f5 /bin/bash
删除容器
[root@localhost ~]# docker rm f51d7ef037f5
端口映射
[root@localhost ~]# docker run -d -p 80:80 --name=nginx -h nginx_web nginx
查看容器日志
[root@localhost ~]# docker logs nginx
容器资源限制
选项 描述
-m,–memory 容器可以使用的最大内存量
–memory-swap 允许交换到磁盘的内存量
–memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
–oom-kill-disable 禁用OOM Killer
-cpus 可以使用的CPU数量
–cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1)
–cpu-shares CPU共享(相对权重)
- 两张图片告诉你为什么域名会被解析到65.49.2.178
- 【有人@我】Android中高亮变色显示文本中的关键字
- 一个简单易用的 Android 导航栏TitleBar
- 分析一个跨平台DDOS僵尸网络
- Android快速开发框架 Ultimate
- Cisco Linksys路由器蠕虫The Moon正在蔓延
- 移动支付安全评测:微信支付篇
- 如何优化 Android Studio 启动、编译和运行速度?
- 微信小程序左右滑动切换图片酷炫效果(附效果)
- Facebook推出用于android数据加密的开源API
- Android 表单验证框架:AValidations
- 推荐系统介绍
- Android WebView 上传文件支持全解析
- 网站管理软件 – AspxSpy2014 Final
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于安装LNMP集成包后上传图片报500错误的解决方法
- linux下SVN配置实现项目目录自动更新以及源码安装的操作方法
- linux安装redis和mysql的实例讲解
- tomcat服务器如何配置字符集为utf-8彻底解决中文乱码的问题详解
- Linux下Android开发环境搭建的操作方法
- liunx 时间函数与时间格式与字符串之间的转化方法
- 详解linux下的.net/mvc/cms程序结构
- Azure给ubuntu虚拟机挂载数据盘的详细步骤
- 详解SSH 远程执行任务的方法
- Linux基础学习之文件查找find的常见用法
- Linux基础之xargs命令的入门实例
- CentOS 7.4下安装Oracle 11.2.0.4数据库的方法
- CentOS桌面环境中网卡启动失败的解决方法
- 浅谈Linux vfork与fork简单对比分析
- Linux定时任务Crontab的使用方法