传统运维可能会遇到的问题
1、机器很多但是版本各异
1000服务器700 CentOS200 Ubuntu100 Windows ServerCentOS 7 和 CentOS 6 之间区别典型的:- CentOS 7 : systemctl start nginx- CentOS 6 : service nginx start使用自动化运维工具(Ansible)来避免不同型号,不同版本导致的服务器之间的命令的不同。安装Nginx时,需要配置HTTPS的时候,必须依赖于OpenSSL这个系统插件自动化运维工具无法解决的问题?- 当系统不支持时,自动化运维工具无法解决。- 当大规模应用需要部署时,无法解决稳定运行的问题。
2、将编写好了的软件进行打包,如果需要运行的时候,直接运行安装包即可实现服务稳定运行。如果出现服务运行宕机等不稳定现象时,将自动重启直至服务稳定运行。
实现这一功能的软件有两个,打包的软件叫作:Docker;实现自动化部署和运行的软件叫作:kubernetes。
3、打包的过程叫作虚拟化。下面我们一起聊聊虚拟化的过程。
- 20世纪90年代的时候,Linux操作系统中为了解决多进程之间的相互隔离的问题,创建出了一个systemd的虚拟化
- 21世纪初,提出了操作系统软件虚拟化。
- 21世纪10年代初,Google的一个科学家发布了一篇关于软件虚拟化的论文。
- 2013年,有一个dotCloud公司,开发出了一款叫作Docker的虚拟化软件。
- 2014年,Google公司推出了一款容器管理软件:kubernetes
至此,容器化可以落地并且实现规模化。
Docker简介
Docker可以说是一个依赖于Linux虚拟化的容器软件。它是由dotClound公司使用Golang语言在2013年初开发的。后来加入了Linux基金会,遵循Apache 2.0协议同时将源代码开源至GitHub上。
1、Docker与虚拟机之间的区别
| 特性 | 启动速度 | 性能 | 内存使用 | 运行密度 | 隔离性 | 迁移 |
|---|---|---|---|---|---|---|
| 容器 | 秒级 | 接近原生 | MB级 | 单台机器可以运行上千个容器 | 进程级的隔离 | 非常便利 |
| 虚拟机 | 分钟级 | 接近原生 | GB级 | 单台机器只支持几个 | 完全隔离 | 一般 |
容器中的数据无法永久保存,但是虚拟机中的数据可以永久保存。
2、安装部署Docker
- 如果你之前安装过 docker,请先删掉
sudo yum remove docker docker-common docker-selinux docker-engine
- 安装一些依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 wget
- 安装yum源
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
- 替换下载源
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
- 安装Docker
sudo yum makecache fast
sudo yum install docker-ce
- 启动Docker
[root@kubernetes ~]# systemctl enable --now docker
- 测试安装情况
[root@kubernetes ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc.)
Docker中的三大概念
在Docker中,有三个核心概念,分别是:镜像、容器以及仓库。
1、镜像
在Docker中,部署的所有的应用都必须打包成一个镜像。也就是说镜像就是我们将软件打包之后的安装包。
2、容器
容器是镜像运行之后的一个实例。实质上,容器就是一个进程。
3、仓库
仓库是用来存放镜像的地方。
Docker镜像
在Docker中,部署的所有的应用都必须打包成一个镜像。也就是说镜像就是我们将软件打包之后的安装包。
1、获取Docker镜像
docker镜像的来源,分别是:
- 官方的镜像仓库(https://hub.docker.com/)
- 官方的仓库比较小
- 官方的仓库比较安全
- 官方仓库的镜像免费,可以拿来自己修改
- 第三方镜像仓库(https://cr.console.aliyun.com/cn-shanghai/instances)
- 服务商提供的仓库稳定,一般用来作为公司内部的镜像仓库
- 自建镜像仓库(https://goharbor.io/)
下载镜像的格式:docker pull [仓库URL]/[名称空间]/仓库名称:版本号
查询默认的仓库名称
[root@kubernetes ~]# docker info # 默认的仓库URL Registry: https://index.docker.io/v1/默认的名称空间:library
- 默认的版本号:latest
案例:在阿里云上下载docker镜像
docker pull registry.cn-hangzhou.aliyuncs.com/k8stes/kube-proxy:v1.18.8
2、查看本机下载的镜像
- 命令:docker images 或者 docker image ls
3、搜索镜像
命令:docker search [镜像名称]
[root@kubernetes ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 16478 [OK] bitnami/nginx Bitnami nginx Docker Image 120 [OK]NAME:镜像名称
- DESCRIPTION:简介
- STARS:收藏(点赞)的个数
- OFFICIAL:是否是官方构建的镜像
- AUTOMATED:是否是自构建的镜像
参数:
—limit : 指定每次搜索显示的行数
[root@kubernetes ~]# docker search nginx --limit=2 NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 16478 [OK] bitnami/nginx Bitnami nginx Docker Image 120 [OK]-f : 过滤
[root@kubernetes ~]# docker search nginx --limit=2 -f is-official=true NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 16478 [OK]—no-trunc:不截断输出
[root@kubernetes ~]# docker search nginx --no-trunc
4、为镜像添加tag
# 格式:docker tag [原名称] 新名称
[root@kubernetes ~]# docker tag 605c77e624dd registry.cn-hangzhou.aliyuncs.com/k8stes/nginx:latest
5、上传镜像到仓库
- 登录仓库 ```bash 格式:docker login [仓库的URL] 默认登录的是官方仓库URL
[root@kubernetes ~]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to https://hub.docker.com to create one. Username: alvinos Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 上传至仓库
```bash
格式:docker push [镜像名称]
[root@kubernetes ~]# docker push registry.cn-hangzhou.aliyuncs.com/k8stes/nginx:latest
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/k8stes/nginx]
d874fd2bc83b: Pushed
32ce5f6a5106: Pushed
f1db227348d0: Pushed
b8d6e692a25e: Pushed
e379e8aedd4d: Pushed
2edcec3590a4: Pushed
latest: digest: sha256:c4c20a2fa2aaa7ede3 size: 1570
6、镜像详情
查询镜像更多的详细信息。
[root@kubernetes ~]# docker inspect 605c77e624dd
[root@kubernetes ~]# docker inspect -f '{{ .DockerVersion }}' 605c77e624dd
20.10.7
[root@kubernetes ~]# docker inspect -f '{{ .ContainerConfig.Hostname }}' 605c77e624dd
ca3e48389f71
7、镜像的历史
查看镜像构建的历史。
[root@kubernetes ~]# docker history 605c77e624dd
8、删除和清理镜像
- 删除镜像
注意:如果镜像有多个TAG,docker rmi删除的就是tag;如果没有了tag,才会删除docker镜像。
[root@kubernetes ~]# docker rmi test:v2
Untagged: test:v2
- 清理镜像
将当前电脑中,所有的未被使用过的镜像全部删除。
[root@kubernetes ~]# docker image prune -a
9、构建镜像
10、保存镜像
Docker 容器
镜像运行起来对外提供服务的一个实例。
1、创建容器
- 语法:docker run [参数] [镜像] [启动命令]
案例:创建一个CentOS容器。
[root@kubernetes ~]# docker run centos bash
注意:容器内必须至少有一个进程运行在前台。
参数
1、-d : docker容器以守护进程的方式运行
docker容器内部的进程需要运行在docker内部的前台,docker容器默认运行在命令行窗口的前台
2、端口映射
-p:指定端口映射
# 指定一个宿主主机的端口,来代理容器内部的端口。 [root@kubernetes ~]# docker run -d -p 30080:80 nginx-P:随机端口映射
# 随机分配一个宿主主机的端口,用来代理容器的端口 [root@kubernetes ~]# docker run -d -P nginx
3、容器生命周期一旦结束,立即删除容器
[root@kubernetes ~]# docker run --rm -d centos sleep 11
4、设置容器的名称
1、设置容器的名称 2、将容器的名称解析至容器DNS上
[root@kubernetes ~]# docker run -d --name test nginx
b39f7dbb596a8d386d77ec838a10286b70d74bf6b1a993431b6d992c36027f9d
[root@kubernetes ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b39f7dbb596a nginx "/docker-entrypoint.…" 1 second ago Up 1 second 80/tcp test
5、目录挂载
Docker容器是无法永久保存数据的,一旦容器被删除,则里面的数据就会全部删掉。
将docker容器内部的数据保存在宿主主机中。
docker run -d -P -v /root/teszt/:/usr/share/nginx/html/ nginx
6、分配终端
- -i : 打开输出
- -t : 分配终端
[root@kubernetes teszt]# docker run -i -t centos bash
7、设置容器内部的环境变量
[root@kubernetes teszt]# docker run -e NAME=CentOS centos printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=496092fe086d
NAME=CentOS
HOME=/root
8、关于网络的参数
- —network
- —link
案例:启动一个Nginx容器
docker run -d --name nginx-test -P -v /root/nginx-test:/usr/share/nginx/html -e Name=Nginx-test nginx
2、查看容器
查询操作系统中,运行过的容器。
- 格式:docker ps
参数
- -a : 查看所有的容器。
[root@kubernetes ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9b119a6b1032 centos "bash" 2 minutes ago Exited (0) 2 minutes ago angry_dhawan
- -a : 查看所有的容器。
CONTAINER ID : 容器ID
- IMAGE:镜像命令
- COMMAND:运行的命令
- CREATED:创建的时间
- STATUS:启动状态
- UP:正常启动
- DOWN:正常关闭
- Exited:启动失败
- PORTS:启动的端口
- NAMES:容器的名称
3、查看docker容器的日志
- 语法:docker log [容器的名称]
- 参数:
- -f : 实时打印日志
4、开启/停止容器
- 开启:docker start [容器名称]
停止:docker stop [容器名称]
[root@kubernetes ~]# docker start exciting_meninsky [root@kubernetes ~]# docker stop exciting_meninsky5、查看容器详细信息
语法:docker inspect [容器名称]
[root@kubernetes ~]# docker inspect jovial_cori6、删除容器
将容器在宿主主机中删除。
语法:docker rm [容器名称]
参数
保存容器为镜像
将正在运行的容器保存为镜像。
- 语法:docker commit [容器名称] [镜像名称]
- 参数:
- -a : 指定作者
- -c :修改的列表
- -m :提交信息
- -p :暂停容器
[root@kubernetes ~]# docker commit jovial_cori test:v1 sha256:e9a3491205940b0f390461086bffb7bf08da497b327ce0d67c0462cfc89f452f [root@kubernetes ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v1 e9a349120594 5 seconds ago 141MB
导出容器为镜像
将正在运行的容器,导出为一个镜像压缩包。
导出:docker export
[root@kubernetes teszt]# docker export -o nginx.tar jovial_cori [root@kubernetes teszt]# ll 总用量 140660 -rw------- 1 root root 144025600 3月 18 11:00 nginx.tar导入:docker import
[root@kubernetes teszt]# docker import -m '测试导出' ./nginx.tar test:v2 sha256:ac7290ff39286ffbc88a23b520d634851f017c71bad4ab53985f95bd1f73e750 [root@kubernetes teszt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v2 ac7290ff3928 6 seconds ago 140MB
导出镜像
将宿主主机中的镜像导出为镜像压缩包。
导出镜像
[root@kubernetes teszt]# docker save -o centos.tar centos:latest导入镜像
[root@kubernetes teszt]# docker load -i centos.tar Loaded image: centos:latest [root@kubernetes teszt]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 8becc16f3db7 4 months ago 204MB8、进入容器
有的时候,需要进入容器对应用程序进行修改。
attach ```bash
早期,docker进入容器的方式。
它主要是建立一个进程管道,链接上容器中的PID为1的这个进程。
[root@kubernetes ~]# docker attach jovial_cori
注意:attach有一个缺点
一旦,attach退出,容器也就跟着退出了。
- exec
```bash
# 主要用来在宿主主机中执行容器内的命令的。
[root@kubernetes ~]# docker exec -it relaxed_swirles bash
- nsenter
# 主要是建立一个进程管道,并且在容器中新建一个bash进程。 [root@kubernetes ~]# nsenter --target $(docker inspect -f '{{ .State.Pid }}' relaxed_swirles) --mount --uts --ipc --net --pid root@6e753b656281:/#
9、容器复制文件
将容器内的文件复制到宿主主机中,或者将宿主主机中的文件复制到容器中。
将容器内的文件复制到宿主主机中
- 语法: docker cp [容器名称]:文件路径 宿主主机中的路径
[root@kubernetes ~]# docker cp nervous_murdock:/root/openvpn-user-crt.sh /opt/
- 语法: docker cp [容器名称]:文件路径 宿主主机中的路径
将宿主主机中的文件复制到容器中
- 语法:docker cp 宿主主机中的路径 [容器名称]:文件路径
[root@kubernetes ~]# docker cp ./openvpn-user-crt.sh nervous_murdock:/root/
- 语法:docker cp 宿主主机中的路径 [容器名称]:文件路径
案例:利用容器将web服务部署出来
1、安装Python和Django
[root@kubernetes django]# yum install python3
[root@kubernetes django]# pip3 install django==2.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/
2、生成代码
[root@kubernetes django]# django-admin startproject linux
[root@kubernetes django]# cd linux/
[root@kubernetes linux]# django-admin startapp application
3、启动容器
[root@kubernetes linux]# docker run -d -v /root/django/linux/:/opt -p 8080:8080 -it python:3.6 bash
4、在容器内安装Django
[root@kubernetes linux]# docker exec -it musing_tharp bash
root@dc3d430ad62c:/opt# pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/
root@dc3d430ad62c:/opt# python manage.py runserver 0.0.0.0:8080
