Docker基本使用(一)
一、为什么使用容器?
1. 上线流程繁琐
开发->测试->申请资源->审批->部署->测试等环节
2. 资源利用率低
普遍服务器利用率低,造成过多浪费
3. 扩容/缩容不及时
业务高峰期扩容流程繁琐,上线不及时
4. 服务器环境臃肿
服务器越来越臃肿,对维护、迁移带来困难
Docker设计目标:
提供简单的应用程序打包工具
开发人员和运维人员职责逻辑分离
多环境保持一致性
Kubernetes设计目标:
集中管理所有容器
资源编排
资源调度
弹性伸缩
资源隔离
容器与vm对比:
二. Docker的基本使用
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 centos7 上的安装
2.1 安装
CentOS7.x安装Docker
# 安装依赖包
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
# 安装Docker CE
yum install -y docker-ce
# 启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docker
官方文档:https://docs.docker.com
阿里云源:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.2理解容器镜像
镜像是什么?
• 一个分层存储的文件
• 一个软件的环境
• 一个镜像可以创建N个容器
• 一种标准化的交付
• 一个不包含Linux内核而又精简的Linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层
对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/\<storage-driver\>中。
镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com
配置镜像加速器:https://www.daocloud.io/mirror
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#配置完重启生效
systemctl restart docker
#配置文件
cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
管理镜像常用命令
docker容器之间使用什么做的资源隔离?
1、namespace:资源隔离
1)UTS:主机名和域名
2)IPC:比如消息队列、共享内存
3) PID:进程编号
4)Network:网络协议栈,例如IP、端口
5)Mount:文件系统
6)User:用户和用户组
2、cgroups:资源限制,比如CPU、内存、磁盘IO
3、UFS:联合文件系统,Copy-on-write
创建容器需要考虑:
1、应用暴露出去
2、主机名,IP
3、数据要不要持久化
4、变量传入,做相关动作
5、资源限制,例如cpu、内存
docker container run -d \
-p 8888:8080 \
--name web \
-e abc=123456 \ #变量传入
-v $PWD/wwwroot:/opt \ #数据持久:将容器的opt目录映射到宿主机
-m=1G \
--cpus="" \
lizhenliang/java-demo
先测试模拟创建个目录跟文件
[root@k8s-node1 ~]# mkdir wwwroot
[root@k8s-node1 ~]# cd wwwroot/
[root@k8s-node1 wwwroot]# touch index.html
查看镜像
[root@k8s-node1 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdd00191db91 lizhenliang/java-demo "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8888->8080/tcp web
进入镜像
[root@k8s-node1 ~]# docker exec -it web bash
查看传递的参数
[root@bdd00191db91 tomcat]# echo $abc
123456
宿主机wwwroot目录下的文件已经映射到opt目录下
[root@bdd00191db91 tomcat]# ls /opt/
index.html
容器里边创建的文件同时也会在宿主机的目录中
[root@bdd00191db91 tomcat]# touch /opt/a.html
[root@bdd00191db91 tomcat]# exit
exit
[root@k8s-node1 ~]# ls wwwroot/
a.html index.html
#查看容器的资源限制
[root@k8s-node1 ~]# docker stats web
持久化容器中应用程序数据
Docker提供三种方式将数据从宿主机挂载到容器中:
• volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
• bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
• tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用
tmpfs,同时避免写入容器可写层提高性能。
bind mounts 默认是-v bind mounts模式 ,这种模式只要是同个镜像创建,即使删除容器,数据也不会丢失 我们来测试下,先停止,然后删除
[root@k8s-node1 ~]# docker stop web
[root@k8s-node1 ~]# docker rm web 执行
docker container run -d \
-p : \
--name web \
-e abc= \
-v $PWD/wwwroot:/opt \
-m=1G \
--cpus="" \
lizhenliang/java-demo 进入容器查看数据是否还在
[root@k8s-node1 ~]# docker exec -it web bash
这个opt目录下创建的内容都会持久化到宿主机的目录上
[root@d95dddf521ec tomcat]# ls /opt/
a.html index.html 宿主机上wwwroot目录
[root@k8s-node1 ~]# ls wwwroot/
a.html index.html volumes volumes是由docker进行管理的,bind mounts是由宿主机进行管理,docker去进行映射 创建一个volume
[root@k8s-node1 ~]# docker volume create wwwroot 查看
[root@k8s-node1 ~]# docker volume ls
DRIVER VOLUME NAME
local wwwroot 查看宿主机上的目录
[root@k8s-node1 ~]# docker volume inspect wwwroot
[
{
"CreatedAt": "2019-11-23T09:02:59+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/wwwroot/_data",
"Name": "wwwroot",
"Options": null,
"Scope": "local"
}
] 这个目录默认是空的,只要容器使用这个volumes,数据就会持久化到这个目录
[root@k8s-node1 ~]# ls -l /var/lib/docker/volumes/wwwroot/_data 使用格式:
--mount bind=volumes,src=wwwroot,dest=/opt2 也可以-v来指定,绝对路径就是bind mounts去挂载, 直接跟volume的名字就是volume 去挂载,/opt2 就是数据产生的目录
-v wwwroot:/opt2 我们来测试下,先停止,然后删除
[root@k8s-node1 ~]# docker stop web
[root@k8s-node1 ~]# docker rm web 执行
docker container run -d \
-p : \
--name web \
-e abc= \
-v $PWD/wwwroot:/opt \
-v wwwroot:/opt2 \
-m=1G \
--cpus="" \
lizhenliang/java-demo 进入容器后创建文件
[root@k8s-node1 ~]# docker exec -it web bash
[root@6d785e95541c tomcat]# ls /opt2
[root@6d785e95541c tomcat]# touch /opt2/.html
[root@6d785e95541c tomcat]# exit
exit 数据已经持久化到这个目录
[root@k8s-node1 ~]# ls /var/lib/docker/volumes/wwwroot/_data
.html
Docker基本使用(一)的更多相关文章
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)
环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- 在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
在这篇文章中,我将介绍如何使用ASP.NET Core托管服务运行Quartz.NET作业.这样的好处是我们可以在应用程序启动和停止时很方便的来控制我们的Job的运行状态.接下来我将演示如何创建一个简 ...
- C Cow XOR 奶牛异或
时间限制 : 10000 MS 空间限制 : 65536 KB 问题描述 农民约翰在喂奶牛的时候被另一个问题卡住了.他的所有N(1 <= N <= 100,000)个奶牛在他面前排成一 ...
- 一夜搞懂 | Java 内存模型与线程
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习内存模型与线程? 并发处理的广泛应用是 Amdah1 定律代替摩尔定律成为计 ...
- 在vue项目中使用md5加密 sirai
1.安装模块 npm install js-md5 -D 2.在项目中引入模块 import md5 from 'js-md5' 3.把你需要加密的信息进行前期处理 CalcuMD5 = functi ...
- canvas 悬浮效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Array(数组)对象-->数组的访问
1.访问数组: 通过指定数组名以及索引号码,你可以访问某个特定的元素. 格式: 数组对象名[下标] 例如:arr[0] 就是访问数组第一个值 var arr = new Array(3); arr[ ...
- 小猪佩奇C代码实现
// ASCII Peppa Pig by Milo Yip #include <stdio.h> #include <math.h> #include <stdlib. ...
- Powershell检查邮件队列设置阈值,通过html形式进行邮件告警
为了完善公司的整体邮件质量,博主通过zabbix监控了exchange的所有微软推荐项目,并写了很多powershell来辅佐, 旨在更大程度上提高整体的邮件性能 这篇文章主要是讲通过powershe ...
- 数据结构和算法(Golang实现)(16)常见数据结构-字典
字典 我们翻阅书籍时,很多时候都要查找目录,然后定位到我们要的页数,比如我们查找某个英文单词时,会从英语字典里查看单词表目录,然后定位到词的那一页. 计算机中,也有这种需求. 一.字典 字典是存储键值 ...
- mvc传递json数据到view简单实例
基于extjs4.2 controller //存储数据的类 public class DataLink { public string Name { get; set; } public strin ...