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介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- Linux(Ubuntu)与windows实现文件共享
步骤:1.从网上下载VMware和Ubuntu的镜像文件 2.在虚拟机上安装Ubuntu系统 3.在安装好的系统中安装VMware tools 实现文件共享 4.在VMware中设置与windo ...
- POJ 3273Monthly Expense(二分答案)
题目链接 思路如下 题意:这一题让我们在一个 n 个数的序列,分成连续的的 m个子串(一个数也可是一个子串),是在所有子串中 和最大的子串 的和最小. 思路:我们可以用 二分法 来一个一个枚举答案,二 ...
- python--django中一些有用的工具引入路径
django.shortcuts render:渲染前端页面 redirect:跳转到其他页面 django forms:表单验证 # 定义 class Form(forms.Form): name ...
- go For-range结构
For结构: for 初始化;条件语句;修饰语句{ 输出 } 一.For-range结构是可以怎么用? 这种构建方法可以应用于数组和切片: for ix, value := range slice1 ...
- python3(三十) Enum
""" """ __author__ = 'shaozhiqi' # 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: ...
- sprigboot 异常 Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].Tomc...
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com ...
- 数据结构和算法(Golang实现)(6)简单入门Golang-并发、协程和信道
并发.协程和信道 Golang语言提供了go关键字,以及名为chan的数据类型,以及一些标准库的并发锁等,我们将会简单介绍一下并发的一些概念,然后学习这些Golang特征知识. 一.并发介绍 我们写程 ...
- 子域名爆破工具:OneForALL
0x00 简介 OneForAll是一款功能强大的子域收集工具 0x01 下载地址 码云: https://gitee.com/shmilylty/OneForAll.git Github: http ...
- Android 开发小零碎
1.EditText默认就会自动获取焦点, 如何让EditText不自动获取焦点? 解决之道:在EditText的父级控件中找一个,设置成 android:focusable="true&q ...
- CSS也能计算:calc
举个例子ul li适配屏幕,如果加个border:1px,不用border-content得情况下,每个li多加了2px: <ul><li></li><li& ...