提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、Docker是什么?
1、Docker的概述
Dcoker是基于容器技术的轻量级虛拟化解决方案,docker是由容器引擎,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等) C/s
2、Docker的优势
- docker引擎统一了基础设施环境:docker环境------》image------>封装一个简易的操作系统(3.0+G)
- docker引擎统一了封装应用(装箱/封装-类比于集装箱)方式:docker镜像一》 images
- docker 引擎统一了运行时环境:docker容器一 》基于镜像——》运行为容器(可运行的环境)
实现了一次构建、多次、多处使用
3、Docker的使用场景
流程:war jar------>Igithub gitlab私有仓库(代码仓库)----> jenkins ( 测试)
(应用程序封装/构建镜像)一》 运维使用镜像下载,使用容器技术进行运行/发布
可以实现:
- 打包应用程序简单部署
- 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
- 持续集成和持续交付(CI/CD):开发到测试发布
- 部署微服务
- 提供PAAS产品(平台即服务) {OpenStack的 云主机类似于阿里云的ECS,属于IAAS;Docker (K8S) 属于PAAS
4、Docker引擎( Docker Engine)
Docker Engine是具有以下主要组件的C/S客户端—服务器应用程序:
- server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)
- CLIENT端: REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
通过client客户端传入命令,比如以下:
docker run:运行
docker start:开启
docker rm:删除
与sever端进行交互,控制server端进行应命令的操作
5、Docker三大组件
- 镜像:模板;组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
- 容器(Docker container):基于镜像的一种运行时状态
- 仓库(Docker reqistry):存放image镜像模板;仓库分类: 1、公共仓库一》docker hub,2、私有仓库registry harbor
6、Docker底层原理
- 名称空间( Namespaces):提供容器的隔离工作区的技术
- 容器完美的实现了6个名称空问隔离(namespace资源隔离-用容器化技术封装)
- mount:文件系统,挂载点
- user:操作进程的用户和用户组
- pid:进程编号
- uts:主机名和主机域
- ipc:信号量、消息队列,共享内存(理解,不同的应用调用的时候应该使用不同的内存空间)
- net:网络设备、网络协议栈、端口等
- 容器完美的实现了6个名称空问隔离(namespace资源隔离-用容器化技术封装)
- 控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源
- 控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束
二、部署20版Docker
1、安装Docker
- 环境配置
systemctl stop firewalla
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
vim /etc/reslov.conf
nameserver 114.114.114.114
- 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
##device-mapper-persistent-data:存储驱动
##lvm2:控制工具
设置阿里云镜像源
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker-ce社区版
yum install -y docker-ce
- 开启docker
systemctl start docker
systemctl enable docker
2、设置镜像加速
官方镜像加速器(阿里云网站)
关于加速器的地址,您登录容器镜像服务控制台后,在左侧导航栏选择镜像工具 ----> 镜像加速器,在镜像加速器页面就会显示为您独立分配的加速器地址
https://t466r8qg.mirror.aliyuncs.com
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
mkdir -p /etc/docker
直接命令行输入以下内容:
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
3、网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
docker images 或 docker image ls ##查询镜像列表
4、相关命令–查看
1. 查看docker版本
docker -v
docker version
2. 用于显示 docker 的系统级信息,比如内核,镜像数,容器数等
docker info
☆☆这里引申一些配置文件的内容
vim /etc/docker/daemon.json ##docker配置文件还可以添加以下的建立配置:
{
"graph": "/data/docker", ##数据目录
"storage-driver": "overlay2", ##存储引擎;版本迭代:LXC——>overlay——>overlay2(overlayfs:文件系统,解决docker镜像分层)
"insecure-registries": [" registry.access.redhat.com", "quary.io"] ##私有仓库位置
"registry-mirrors": ["https://q***"] ##镜像加速
"bip": "172.7.5.1/24", ##docker网络;控制网段的位置;需要创建新的网桥,系统默认的docker0是不变的
"exec-opts": ["native.cgroupdriver-systemd"], ##启动时候的额外参数(驱动)
"live-restore":true ##当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
systemctl daemon- reload
systemctl restart docker
三、Docker镜像相关操作
1. 运行镜像
docker run hello-world ##运行hello-world镜像
run代表以下:
①:pull dockerhub 仓库中项目/库/镜像
②:start hello-world image
命令详解:
- The Docker client contacted the Docker daemon. dockerclient客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restfulapi典型的C/s架构
- The Docker daemon pulled the “hello-world” image from the Docker Hub.(amd64)
由docker服务端的守护进程从docker hub上下载了镜像(服务端会先检查本地系统是否有此镜像) - 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服务端把这些信息流(传递)返回到客户端并展示出来,( 展示在终端上)
docker client 可以是多种形式,比如"docker"命令工具所在的终端
2. 搜索镜像-search
docker search nginx ##搜索镜像nginx
docker search centos: 7 ##搜索镜像centos:7
3. 下载镜像-pull
client端连接服务端,从docker hub上下载镜像
格式:docker pull 镜像名称
docker pull nginx ##下载nginx最新的镜像
4. 查看镜像
docker images ##查看镜像列表
docker images -q ##查询镜像过滤ID
q:代表过滤;只过滤容器ID
5. 查看当前docker下的镜像详细信息
格式:docker inspect 镜像ID
docker inspect dd34e67e3371
6. docker tag hello-world:latest hello-world:lamp ##添加镜像标签
7. 删除镜像
若需要删除镜像需要先删除容器
docker rm ** ##删除容器ID
docker rmi 镜像名称/镜像标签 ##删除镜像ID
rm i:rm image ##删除镜像
docker rmi hello-world:lamp ##删除hello-world的lamp标签
8. 镜像导出/导入
docker save -o 文件名镜像名
docker load <
示例:
docker save -o hello-world hello-world
这时就可以使用
scp hello-world root@192.168.35.10:/opt ##传到其他安卓docker的内容
docker load < hello-world ##再进行镜像导入;
使用场景,有的生产环境,企业不直接使用docker 私有仓库,而是存放在一个ftp服务器中,按需上传下载
四、容器相关操作
1、查询容器
docker ps -a ##显示所有的容器,包括未运行的
a:all;全部
docker ps -aq ##查询容器的id
q:代表过滤;只过滤容器ID
2、删除容器
docker rm -f `docker ps -aq` ##强制批量删除容器;不建议使用,若需要删除删选出id进行删除
3、启动运行容器
1. 使容器开启并持续性运行
①:创建容器
docker create -it nginx:latest /bin/bash
-i:让容器的标准输入保持打开
-t:分配一个伪终端
-d:后台守护进程的方式运行
②:启动容器
docker start 容器id
2. 启动一次性运行容器
持续性运行浪费资源,那么一次性执行如下操作
docker run centos:7 /usr/bin/bash -c ls /
-c:传递命令参数
3. 持续后台运行
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello; done" ##后台运行centos:7的容器
while true;do echo hello; done:代表给予一个死循环
3、停止容器
docker stop 容器ID ##停止容器
docker stop b054125b9481 ##停止容器
状态码137:表示主动退出停止容器
4、进入/退出容器
1. 使用run
docker run -it nginx:latest /bin/bash
容器内没有的命令如何操作:
①:yum下载命令工具
②:以不同的环境运行容器,即环境中存在需要使用的命令即可
比如进入容器没有systemctl
命令解决:添加–privileged=true;指定此容器是否为特权容器,使用此参数,则不能用attach
示例:
docker run -itd --name test3 --privileged=true centos /sbin/init
/sbin/init内核启动时主动呼叫的第一个进程
docker ps -a ##查询容器是否开启
docker exec -it 容器ID /bin/bash #进入容器
docker exec -it 6be59840d78b /bin/bash
验证:
yum -y install httpd ##随便安装一个服务
systemctl status httpd ##使用systemctl命令查询服务
docker inspect test3 ##查询test镜像详细信息
2. exec(容器必须为开启状态)
docker exec -it 容器ID /bin/bash
docker run -it:会创建前台进程,但是会在输入exit后终止进程。
docker attach:会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止进程.
docker exec -it 会连接到容器,可以像SSH-样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。
3. 退出容器
ctrl+d 或者 exit
5、容器导入/导出
- 容器导出
docker export 容器ID >文件名
示例:
docker export b054125b9481 > hell02 ##导出hello-world到文件hello2内
- 容器导入(生成镜像)2种方式
①:docker import 导出的文件名(容器) 指定镜像名称(打上标签)
示例:
docker import hello2 hello-world:latest
②:cat 文件名(容器) | docker import - hello-world:latest
示例:
cat centos_02 | docker import - centos:7
6、删除/强制删除容器
docker rm 容器ID ##删除容器
docker rm -f 容器ID ##强制删除容器(正在运行的容器)
docker ps -a | awk '{print "docker rm " $1'} | bash ##批量删除容器(正则匹配);$1:是容器的id
for i in `docker ps -a | grep -i exit | awk '{print$1}'`; do docker rm -f $i;done ##批量删除"exit"状态(指定状态)的容器
docker rm -f `docker ps -q` ##强制批量删除非up状态的容器;不建议使用,若需要删除删选出id进行删除
五、总结
本章讲解了docker的三大组件和工作底层原理,以及docker的部署安装,和镜像、容器的相关命令操作
1、Docker三大组件
- 镜像:模板;组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
- 容器(Docker container):基于镜像的一种运行时状态
- 仓库(Docker reqistry):存放image镜像模板;仓库分类: 1、公共仓库一》docker hub,2、私有仓库registry harbor
2、Docker底层原理
- 名称空间( Namespaces):提供容器的隔离工作区的技术
- 容器完美的实现了6个名称空问隔离(namespace资源隔离-用容器化技术封装)
- mount:文件系统,挂载点
- user:操作进程的用户和用户组
- pid:进程编号
- uts:主机名和主机域
- ipc:信号量、消息队列,共享内存(理解,不同的应用调用的时候应该使用不同的内存空间)
- net:网络设备、网络协议栈、端口等
- 容器完美的实现了6个名称空问隔离(namespace资源隔离-用容器化技术封装)
- 控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源
- 控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束