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 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="2" \
    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 8888:8080 \
    --name web \
    -e abc=123456 \
    -v $PWD/wwwroot:/opt \
    -m=1G \
    --cpus="2" \
    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 8888:8080 \
    --name web \
    -e abc=123456 \
    -v $PWD/wwwroot:/opt \
    -v wwwroot:/opt2 \
    -m=1G \
    --cpus="2" \
    lizhenliang/java-demo

进入容器后创建文件
[root@k8s-node1 ~]# docker exec -it web bash
[root@6d785e95541c tomcat]# ls /opt2
[root@6d785e95541c tomcat]# touch /opt2/123.html
[root@6d785e95541c tomcat]# exit
exit

数据已经持久化到这个目录
[root@k8s-node1 ~]# ls  /var/lib/docker/volumes/wwwroot/_data
123.html

 

 

 

posted @ 2018-07-28 10:10  w787815  阅读(5059)  评论(0编辑  收藏  举报