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介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- pycharm 秘籍:快捷键技巧等
Pycharm基本使用 安装 下载地址:https://www.jetbrains.com/pycharm/download 选择Professional 专业版 Comunnity社区版是免费的,但 ...
- Flutter 完美的验证码输入框
老孟导读:刚开始看到这个功能的时候一定觉得so easy,开始的时候我也是这么觉得的,这还不简单,然而真正写的时候才发现并没有想象的那么简单. 先上图,不上图你们都不想看,我难啊,到Github:ht ...
- Linux yum 源配置
CentOS 7 使用 163 的 yum 源,配置步骤如下: 下载镜像源文件 http://mirrors.163.com/.help/centos.html 备份原配置文件,将下载的文件的名字改成 ...
- [ddt01篇]十年测试老鸟帮您解析:ddt数据驱动实现自动化测试入门基础应用
一.什么是DDT数据驱动框架 全称:data driver test数据驱动测试框架,可以完美的应用于unittest框架实现数据驱动.ddt使用简介: 1.测试数据为多个字典的list类型 2. ...
- 【C++】VS2017 不能将const char * 分配给 char *
我的方式是把结构体中定义的 char * 换成string #include <iostream> #include<string> using namespace std; ...
- 【php】php操作MySQL数据库
一.操作步骤: 1. 连接MySQL数据库并判断是否连接成功2. 选择数据库3. 设置字符集4. 准备SQL语句5. 向MySQL服务发送SQL语句6. 解析处理结果集7. 释放结果集,关闭数据库连接 ...
- Vulnhub homeless靶机渗透
信息搜集 nmap -sP 192.168.146.6 nmap -A -Pn 192.168.146.151 直接访问web服务. 大概浏览一下没发现什么,直接扫描下目录把dirb+bp. BP具体 ...
- 彻底理解Java对象与引用
本文是最近在复习Java的时候读到的来自iteye博客的一篇文章,个人觉得写的很好,但貌似楼主许久没有维护该博客,害怕将来想回顾的时候找不到此文章,故在此重写文章,并修改了一些排版,有助于以后的学习查 ...
- Python操作rabbitmq系列(三):多个接收端消费消息
接着上一章.这一章,我们要将同一个消息发给多个客户端.这就是发布订阅模式.直接看代码: 发送端: import pikaimport sys connection = pika.BlockingCon ...
- AJ学IOS(16)UI之XIB自定义Cell实现团购UI
AJ分享,必须精品 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XI ...
