目录
一、Docker概述
Docker是什么
- 是一种轻量级的“虚拟机”
- 在Linux容器里运行应用的开源工具
Docker与虚拟机的区别
不同点 | container | VM |
---|---|---|
启动速度 | 秒级(和宿主机共用内核) | 分钟级 |
运行性能 | 接近原生(直接在内核中运行) | 5%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
提供服务 | 沙箱机制/只需要docker引擎 | 需要完整的操作系统 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
解决孤岛问题 | 可以 | 无法解决 |
Docker的使用场景
- 打包应用程序简化部署
- 可脱离底层硬件任意迁移
- 例:服务器从腾讯云迁移到阿里云
1.1、Docker的核心概念及安装方式
Docker核心概念
● 镜像(只读模板)
- 一个面向Docker容器引擎的只读模板
● 容器
- 从镜像创建的运行实例
● 仓库
- 集中保存镜像的地方
CentOS安装Docker的两种方式
- 使用CURL获得Docker的安装脚本进行安装
- 使用YUM仓库来安装Docker
1.2、docker架构
- 默认Client和DOCKER_HOST是在同一个宿主机里面,假设Registry是公共镜像(另一台服务器上)
- 本地安装完docker引擎会帮助安装服务端和客户端
- 服务端是以daemon守护进程的方式工作在后台,Client工作在前台
- 服务端在后台会构建镜像、读取镜像,(镜像可以由远端去下载),Images会对镜像进行构建为容器的方式跑起来
- 客户端的终端上执行创建命令、下载命令、运行命令来告诉服务端具体执行什么操作
二、Docker部署
2.1、安装依赖包
[root@docker ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
#yum-utils yum仓库的工具
#device-mapper docker的引擎
#lvm2 lvm的一种加强性管理工具
2.2、设置阿里云镜像(加速)
[root@docker ~]# cd /etc/yum.repos.d
[root@mysql yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.3、安装docker-ce社区版
[root@docker yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker yum.repos.d]# yum -y install docker-ce
[root@docker ~]# systemctl start docker #启动docker
[root@docker ~]# systemctl enable docker #设置开机自启
2.4、设置镜像加速
[root@docker ~]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
> }
> EOF
> {
> "registry-mirrors": ["https://76ipfsjf.mirror.aliyuncs.com"]
> }
> [root@docker ~]# systemctl daemon-reload #开启守护进程(服务端)
> [root@docker ~]# systemctl restart docker #重启docker的客户端
2.5、网络优化
[root@docker ~]# vim /etc/sysctl.conf #开启路由转发
[root@docker ~]# sysctl -p
[root@docker ~]# systemctl restart network
[root@docker ~]# systemctl restart docker
#docker配置文件
{
"graph": "/data/docker", #数据目录
"storage-driver": " overlay2", #存储引擎
"insecure-registries": ["registry.access.redhat.com"," quary.io"] #私有仓库
"registry-mirrors": ["https://q"] #镜像加速
"bip": "172.7.5.1/24", #docker网络(面试题—如何永久配置docker网络地址,就是在daemon.json 里面配置"bip"字段)
"exec-opts": ["native.cgroupdriver=systemd"], #启动时候的额外参数(驱动)
"live-restore": true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
}
docker容器网络生产经验
docker 的网络建议和宿主机的IP“对照”
比如宿主机10.2.5.6容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置
2.6、docker镜像操作
[root@docker ~]# docker run hello-world
注:docker run
1、先检测本地是否有镜像
2、本地没有该镜像,则会向镜像仓库拉取这个镜像
3、先create、再start把该镜像的容器运行起来
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
- The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
- The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
解析:
- docker client客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)典型的C/S架构
- 由docker服务端的守护进程从docker hub 上下载了镜像
- 服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
- docker服务端把这些信息流(传递)返回到客户端并展示出来,(展示在终端上)
- docker client可以是多种形式,比如"docker"命令工具所在的终端
2.6.1、查询docker版本(两种方式)
[root@docker ~]# docker version
[root@docker ~]# docker info
2.6.2、搜索镜像
[root@docker ~]# docker search nginx
2.6.3、下载镜像
docker pull 镜像名称
例如:docker pull nginx
[root@docker ~]# docker pull nginx
[root@docker ~]# docker images #查看镜像列表
[root@docker ~]# docker inspect f6d0b4767a6c #获取镜像信息
[root@docker ~]# docker tag nginx:latest nginx:lnmp #给镜像添加标签
[root@docker ~]# docker images
[root@docker ~]# docker rmi nginx:lnmp #删除标签
2.6.4、镜像导出和导入
docker save -o 文件名 镜像名
示例:
docker save -o nginx nginx:latest
[root@docker docker]# docker save -o nginx nginx:latest
[root@docker docker]# ls
daemon.json key.json nginx
[root@docker docker]# docker rmi nginx:latest
[root@docker docker]# docker images
[root@docker docker]# docker load < nginx #导入镜像
[root@docker docker]# docker images
注:使用场景,有的生产环境,企业不直接使用docker私有仓库,而是存放在一个ftp服务器中,按需上传下载
2.7、容器操作
2.7.1、查询容器
[root@docker docker]# docker ps -a
2.7.2、创建容器
[root@docker docker]# docker create -it nginx:latest /bin/bash
# -i:让容器的标准输入保持打开
# -t:分配一个伪终端
# /bin/bash 给予执行环境
2.7.3、启动容器
[root@docker docker]# docker start ec05ddece00d
2.7.4、启动容器(一次性执行)
[root@docker docker]# docker run centos:7 /usr/bin/bash -c ls /
2.7.5、停止容器
[root@docker docker]# docker stop ec05ddece00d
2.7.6、持续后台运行
[root@docker docker]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
2.8、进入容器
2.8.1、使用run
[root@docker docker]# docker run -it nginx:latest /bin/bash
退出:
- Ctrl+d
- exit
2.8.2、exec(容器必须正常运行)
[root@docker docker]# docker exec -it ec05ddece00d /bin/bash
2.8.3、容器导出
[root@docker docker]# docker export ec05ddece00d > nginx_1
[root@docker docker]# ls
2.8.4、容器导入(生成镜像)
[root@docker docker]# cat nginx_1 | docker import - nginx:latest
2.9、删除容器
[root@docker docker]# docker rm 7510b623832b #这个命令无法删除正在运行的容器,rm -f 可以强制删除
2.9.1、批量删除
[root@docker docker]# docker ps -a | awk '{print docker rm "$1"}' | bash
2.9.2、批量删除"exit"状态的容器
[root@docker docker]# for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done #过滤异常退出的容器
2.9.3、批量关闭正在运行的容器
[root@docker ~]# for i in `docker ps -a | grep -i up | awk '{print $1}'`; do docker stop $i;done