Docker基本管理
目录
一、Docker是什么
(一)、Docker介绍
容器:轻量级虚拟机
每个容器共享宿主机内核 创建一个容器是秒级启动
传统虚拟机:每台虚拟机拥有一个独立的内核 创建一个是分钟级别
容器跟VM的主要区别
容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离,虚拟机可能需要一分钟来启动,而容器只需要一秒钟甚至更短。容器使用宿主操作系统的内核,而虚拟机使用独立的内核,Docker的局限之一, 它只能运行在64的操作系统上
安全:虚拟机安全级别高,容器安全级别弱
(二)、Docker优势
1、交付物标准化
Docker是软件工程领域的"标准化"交付组件﹐最恰到好处的类比是"集装箱"。
集装箱将零散、不易搬运的大量物品封装成一个整体﹐集装箱更重要的意义在于它提供了一种通用的封装货物的
标准,卡车、火车、货轮、桥吊等运输或搬运工具采用此标准﹐隧道、桥梁等也采用此标准。以集装箱为中心的
标准化设计大大提高了物流体系的运行效率。
传统的软件交付物包括∶应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。
Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境﹐大大简化了应用交付的模式。
2、一次构建,多次交付
类似于集装箱的"一次装箱﹐多次运输" ,Docker镜像可以做到"一次构建﹐多次交付"。当涉及到应用程序多副本
部署或者应用程序迁移时,更能体现Docker的价值。
3、应用隔离
集装箱可以有效做到货物之间的隔离﹐使化学物品和食品可以堆砌在一起运输。Docker可以隔离不同应用程序
之间的相互影响﹐但是比虚拟机开销更小。
总之﹐容器技术部署速度快﹐开发、测试更敏捷﹔提高系统利用率﹐降低资源成本
二、Docker的核心概念与安装
(一)、Docker三大核心组件
Docker镜像 Docker images
一个面向Docker容器引擎的只读模板
Docker仓库 Docker registeries
集中保存镜像的地方
Docker容器 Docker containers
从镜像创建的运行实例
三者的关系:
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
简单理解:仓库里存的是镜像,镜像运行起来的是容器
(二)、安装Docker
1、安装步骤
1、安装docker的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2
2、设置docker的镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装docker
yum makecache fast
yum -y install docker-ce docker-ce-cli containerd.io
4、启动并设置为开启自启动
systemctl start docker #启动docker
systemctl enable docker #设置开机自启动
5、测试
docker run hello-world
6、docker的中央仓库
1)docker官方的中央仓库,这个仓库镜像最全,但是下载速度较慢
http://docs.docker.com
2)国内的镜像网站
https://c.163yun.com/hub#/home
http://hub.daocloud.io (推荐使用)
2、配置阿里云镜像加速
1、登录阿里云官方网站
2、搜索容器镜像服务
3、找到镜像加速器
4、配置镜像加速
3、网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
三、Docker镜像
(一)、镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像︰
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像 DockerFile
(二)、Docker镜像加载原理
UnionFS ( 联合文件系统)
UnionFS ( 联合文件系统): Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
**bootfs(boot file system)**主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc,/bin, letc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。
四、Docker基础命令详解
基操
# docker version #docker版本信息
# docker search 镜像名称 #搜索镜像
# docker search nginx
# docker pull nginx #现在镜像
# docker images //查看下戟镜像信息
# 改标签
docker tag nginx:latest cw/nginx:web//用户名/仓库名:镜像名
# docker inspect 镜像名称 #查询镜像详细信息
# docker rmi 镜像的标识(image id) # 通过镜像id删除
# docker rmi $(docker images -qa) #删除全部镜像
# docker rmi 镜像名称
# 有镜像tag的时候,删除要用名称删除,用id删除不了
# 将本地的镜像导出
# docker save -o 导出的路径 镜像id
# docker save -o /opt/aaa cb6904dc71e1
# 加载本地镜像文件
# docker load -i 镜像文件
# cd /opt
# docker load < abc
# docker的默认工作路径**
# /var/lib/docker
# 容器创建
# docker create -it nginx:latest /bin/bash
# 查看容器
docker ps [-qa]
选项:
-a:列出当前正在运行的容器+带出历史运行过的容器
-q:只查看容器的编号
-n=?:显示最近创建的容器
docker ps -a 列出当前正在运行的容器+带出历史运行过的容器
# 启动容器
docker start
# 进入到容器内部
docker exec -it 容器id bash
docker attach 容器id
区别:
docker exec:进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach:进入容器正在执行的终端,不会启动新的进程
# 删除容器(删除容器前,需要先停止容器)
docker stop 容器id #停止指定的容器
docker stop $(docker ps -qa) #停止全部容器
docker rm 容器id #删除指定的容器
docker rm $(docker ps -qa) #删除全部容器
批量删除
docker ps -a | awk '{print "docker rm "$1}' | bash #只删除不运行的容器,保留只运行的容器
# 退出容器
exit #直接容器停止并退出
Ctrl+P+Q #容器不停止退出
# 将容器内文件拷贝文件到主机上
docker cp 容器id:容器内路径(绝对路径) 目的的主机路径
#在主机上操作,不是在容器内操作
# 运行容器后执行命令
docker run centos:7 /usr/bin/bash -c ls
# 持续在后台执行
docker run -d paigeeworld/centos7 /bin/bash -c "while true;do echo hello;done" #死循环
# 容器导出
docker export 6c9aabe7b1e5 > cwnginx
# 容器导入(会生成镜像,而不会创建容器)
cat cwnginx | docker import - nginx:web
私有仓库
# 下载registry镜像
docker pull registry
vim /etc/docker/daemon.json
"insecure-registries": ["192.168.195.70:5000"], #添加
"registry-mirrors": ["https://05vz3np5.mirror.aliyuncs.com"]
systemctl restart docker.service
# docker create -it registry /bin/bash
# docker ps -a
# docker start 6f7497fcc8c2
# #宿主机的/data/registry自动创建挂载容器中的/tmp/registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
#更改标记为192.168.126.70:5000/nginx
docker tag nginx:latest 192.168.126.70:5000/nginx
# 上传
docker push 192.168.126.70:5000/nginx
# 获取私有仓库列表
curl -XGET http://192.168.126.70:5000/v2/_catalog
Docker 教据卷
docker pull centos:7
# 宿主机目录/var/www挂载容器中的/data1
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
数据卷容器
# 数据卷容器
docker run --name web2 -v /data1 -v /data2 -it centos:7/bin/bash
# 新容器挂载数据卷容器web2
docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash
端口映射
docker run -d -P nginx:latest #-P 随机映射端口
docker run -d -P 88:80 nginx:latest # -p指定映射端口
容器互联(使用centos镜像)
docker run -itd -P --name web11 centos:7 /bin/bash
#创建并运行容器取名web11,端口号自动映射
docker run -itd -P --name web22 --link web11:web11 centos:7 /bin/bash
#创建并运行容器取名web2,链接到web11和其通信进web22容器
docker exec -it ed3bde /bin/bash 进入web22容器
ping web11