一、为什么使用容器?

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 commit 将容器保存成一个新镜像。
• 一个镜像创建多个容器
• 镜像增量式存储
• 创建的容器里面修改不会影响到镜像

管理镜像常用命令

ls 列出镜像
build 构建镜像来自Dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除一个或多个镜像
prune 移除未使用的镜像。没有被标记或被任何容器引用的。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到一个tar归档文件
load 加载镜像来自tar归档或标准输入

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

创建容器常用命令:
-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]
 
容器资源限制:
-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共享(相对权重)
 
示例:
内存限额:
允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx
CPU限额:
允许容器最多使用一个半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx
允许容器最多使用50%的CPU:
docker run -d --name nginx05 --cpus=".5" nginx
 
管理容器常用命令:
ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行容器中执行命令
commit 创建一个新镜像来自一个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start/restart 停止/启动一个或多个容器
rm 删除一个或多个容器

持久化容器中应用程序数据

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基本使用(一)的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在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 ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. CodeForces 687A NP-Hard Problem

    Portal:http://codeforces.com/problemset/problem/687/A 二分图染色 好模板题 有SPJ 值得注意的是,因为C++的奇妙的运算机制 若在vector变 ...

  2. 惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密|原创

    前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ps:日常开发中,我们要有一定的安全意识 ...

  3. My背包九讲——01背包

    文章目录 背包问题中的常用变量说明 题目 解题思路 我想要想理解最简单 01背包就是要`理解

  4. Java并发基础02. 传统线程技术中的定时器技术

    传统线程技术中有个定时器,定时器的类是Timer,我们使用定时器的目的就是给它安排任务,让它在指定的时间完成任务.所以先来看一下Timer类中的方法(主要看常用的TimerTask()方法): 前面两 ...

  5. Oracle 数据库创建导入

    Oracle 数据库创建导入 由 Alma 创建, 最后一次修改 2018-06-04 14:37:50 在本章教程中,将教大家如何在Oracle 中创建导入数据库. 注意:本教程中的有些命令您可能并 ...

  6. PHP如何配置session存储在redis

    当网站用户量增多的时候,正常的session存取就会出现有点慢的问题,如果提高速度呢. 我们可以使用redis去保存session的会话信息. PHP的会话默认是以文件的形式存在的,可以配置到NoSQ ...

  7. JAVA中基础类型和字串类型之间的相互转换

    转自:https://www.imooc.com/code/2251 仅做个人学习记录之用,侵删. 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法 ...

  8. python3(二十五) getClassInfo

    """ """ __author__ = 'shaozhiqi' # 如何知道这个对象是什么类型,使用type() print(type(1 ...

  9. xml 文件 和xsd 文件的关系

    XML文件和XSD文件的关系 2010-09-29 15:38 2307人阅读 评论(0) 收藏 举报 xml 1. XSD文件在某个namespace中定义element和type.此处定义的typ ...

  10. 疲劳驾驶打瞌睡?python保障您的驾驶安全

    道路千万条,安全第一条!疲劳驾驶可谓交通事故几大罪魁祸首之一,根据美国一项研究显示,司机睡眠不足4小时,交通事故肇事几率等同于醉驾. 为了减少疲劳驾驶现象,驾驶员疲劳检测应运而生.这是一项安全技术,可 ...