Docker--01
Docker容器介绍
1.1 docker是什么
Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
namespace命名空间
Mount Namespace - 用于隔离文件系统的挂载点 UTS Namespace - 用于隔离 HostName 和 DomianName IPC Namespace - 用于隔离进程间通信 PID Namespace - 用于隔离进程
cgroups资源限制
控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有
能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。
控制组技术最早是由 Google 的程序员在 2006 年提出,Linux 内核自 2.6.24 开始支持。
控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
1.2 容器与虚拟机对比
1.3 docker的三个重要概念
Image(镜像):
那么镜像到底是什么呢?Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
Container(容器)
容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
Repository(仓库)
镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过:的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 Latest 作为默认标签。
1.4 docker的组成部分
docker是传统的CS架构分为docker client和docker server
Docker 客户端是 Docker 用户与 Docker 交互的主要方式。当您使用 Docker 命令行运行命令时,Docker 客户端将这些命令发送给服务器端,服务端将执行这些命令。
Docker 命令使用 Docker API 。Docker 客户端可以与多个服务端进行通信。
组件:镜像,容器,仓库,网路,存储
镜像:把系统文件打包
虚拟化的几种架构图
Docker安装部署
2.1 国内源安装docker-ce
这里我们使用清华源:
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
操作步骤:
yum remove docker docker-common docker-selinux docker-engine yum install -y yum-utils device-mapper-persistent-data lvm2 wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo #更新yum缓存 yum makecache fast yum install docker-ce -y docker version systemctl start docker 上传安装包, yum localinstall '*.rpm'
2.2 国内远镜像加速配置
官网地址 https://www.daocloud.io/mirror 加速命令 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 需要重启docker 阿里镜像加速地址 https://cr.console.aliyun.com/cn-hangzhou/instances/repositories 加速命令 mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"] } EOF systemctl daemon-reload systemctl restart docker
2.3 快速安装
思路:
1.开启yum缓存
2.全新环境安装docker
3.将缓存的包全部打包出来
4.安装的时候使用rpm -ivh *.rpm方式安装
2.4 运行第一个容器
运行一个Hello world
docker run alpine /bin/echo "Hello world"
Docker镜像和容器管理
3.1 镜像相关命令
3.1.1 搜索镜像
选择镜像建议:
1.优先选择官方的
2.选择星星多的
docker search centos #搜索镜像所有的版本号.jq是一个json格式化工具 yum install jq curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
3.1.2 获取镜像(没有指定版本,默认最新)
docker pull centos docker pull busybox docker pull busybox:1.29
3.1.3 查看镜像
docker images
3.1.4 删除镜像(首先删除容器,再删除镜像)
docker rmi centos:7 docker images|awk 'NR>1{print "docker rmi "$3}'|bash docker rmi $(docker images|awk 'NR>1{print $3}') docker rmi $(docker images -q)
3.1.5 导出镜像
docker save -o centos.tar centos:latest
3.1.6 导入镜像
docker load < centos.tar
3.2 容器相关命令
3.2.1 启动容器
docker run -d -p 80:80 nginx #启动一个容器并保持不退出 并自定义命名 docker run --name mydocker -t -i centos /bin/bash #启动一个容器并保持不退出 docker run -it -d centos:7 /bin/bash #启动并进入容器,启动一个终端,pid为1 docker run -it centos:7 /bin/bash #启动一个已经停止的容器 docker start 容器ID -d放后台 -p端口映射 #system管理启动 docker run -d -it --privileged nginx-1 /usr/sbin/init
3.2.2 停止容器
docker stop 容器的ID #批量停止所有运行的容器 docker stop $(docker ps -q)
3.2.3 查看容器
#查看当前正在运行的容器 docker ps #查看正在运行以及停止运行的容器 docker ps -a docker ps -q docker ps -aq #查看容器的详细信息 docker inspect 容器ID
3.2.4 进入容器
docker exec会分配一个新的终端tty #进入已经运行的容器 docker exec -it 容器ID /bin/bash #启动并进入容器,启动一个终端,pid为1 docker run -it centos:7 /bin/bash docker attach会使用同一个终端 docker attach 容器ID
3.2.5 删除容器
删除单个容器
docker rm 容器ID
批量删除容器
docker rm $(docker ps -aq)
Docker网络管理
4.1 随机映射端口
docker run -P :80 -d nginx:latest
4.2 指定映射端口
-p 宿主机端口:容器端口
docker run -p 8080:80 -d nginx:latest -p 80:80 -p 443:443 -p 宿主机IP:宿主机端口:容器端口
如果想多个容器使用8080端口,可以通过添加多个IP地址实现
ifconfig eth0:1 10.0.1.13 up docker run -d -p 10.0.1.11:8080:80 nginx:latest docker run -d -p 10.0.1.13:8080:80 nginx:latest
进入容器里修改站点目录,然后访问测试
docker exec -it bdb2a4e7e24d /bin/bash echo "web01" > /usr/share/nginx/html/index.html docker exec -it 31c1de138dda /bin/bash echo "web02" > /usr/share/nginx/html/index.html
访问测试:
[ ~]# curl 10.0.1.11:8080 web02 [ ~]# curl 10.0.1.13:8080 web01
Docker数据卷管理
5.1 持久化数据卷
-v 宿主机目录:容器内目录
下面我们来创建一个html5小游戏
5.1.1 创建游戏代码目录
mkdir /data/xiaoniao -p cd /data/ unzip xiaoniaofeifei.zip -d xiaoniao /
5.1.2 创建容器并映射数据卷
docker run -d -p 80:80 -v /data/xiaoniao:/usr/share/nginx/html nginx:latest docker ps
5.1.3 访问游戏页面
10.0.1.11
5.2 持久化数据卷容器
--volumes-from (跟某一个已经存在的容器挂载相同的卷)
查看当前容器有哪些卷
docker volume ls
下面我们利用容器卷创建一个小游戏
5.2.1 创建一个容器卷
docker run -d -p 8080:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest docker volume ls
5.2.2 查看卷的目录
docker volume inspect xiaoniao
5.2.3 复制代码目录到容器卷目录
\cp -a /data/xiaoniao/* /var/lib/docker/volumes/xiaoniao/_data/
5.2.4 使用容器卷创建新容器
docker run -d -p 8090:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
5.3 项目实战-访问不同端口展示不同页面
前提:基于自定义镜像c7_nginx:v1
基于Centos7创建自定义nginx镜像 1.拉取一个基础镜像 docker run --name myc7 -it centos:7 /bin/bash 2.安装nginx cat > /etc/yum.repos.d/nginx.repo<<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF yum install nginx 3.基于自定义的容器生成新的镜像 docker commit myc7 c7_nginx:v1 4.查看是否生成新镜像 docker images 5.基于自定义的nginx镜像创建新的容器并指定映射端口 docker run --name mynginx -itd -p 80:80 c7_nginx:v1 nginx -g "daemon off;" 6.查看容器是否运行并在windows访问测试 docker ps 10.0.0.51 7.进入容器查看进程 docker exec -it mynginx /bin/bash ps aux nginx -s stop 8.重启启动容器测试是否可以访问 docker start mynginx 10.0.0.51 有报错,可以换国内源安装 docker cp /etc/yum.repos.d/CentOS-Base.repo b1965575341b:/etc/yum.repos.d/ docker cp /etc/yum.repos.d/CentOS-epel.repo b1965575341b:/etc/yum.repos.d/
项目要求:
一个容器实现:
访问8080端口跳转到xiaoniao
访问8090跳转到game
数据目录,配置文件,日志文件都以映射挂载的方式实现
1.创建数据目录 mkdir /code cd /code 2.编写Nginx配置文件 cat >game.conf<<EOF server { listen 8080; server_name localhost; location / { root /opt/xiaoniao/; index index.html index.htm; } } server { listen 8090; server_name localhost; location / { root /opt/game/; index index.html index.htm; } } EOF 3.上传代码目录并解压 tar zxf xiaoniao.tar.gz tar zxf game.tar.gz 4.关键容器并挂载 docker run -d -p 8080:8080 -p 8090:8090 -v /code/game/:/opt/game/ -v /code/xiaoniao/:/opt/xiaoniao/ -v /code/game.conf:/etc/nginx/conf.d/game.conf -v /var/log/nginx/:/var/log/nginx/ c7_nginx:v1 nginx -g "daemon off;" 5.访问测试 10.0.0.51:8080 10.0.0.52:8090
Docker镜像手动构建
6.1 手动制作游戏镜像(没测试)
下面我们基于centos容器制作一个新镜像,并安装nginx服务
docker run -it centos:7 /bin/bash yum install wget install openssh-clients -y rm -rf /etc/yum.repos.d/* wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo cat >/etc/yum.repos.d/nginx.repo<<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key EOF yum makecache fast yum install nginx -y scp -r 10.0.1.51:/data/* /opt/ mv /opt/game.conf /etc/nginx/conf.d/ docker ps docker commit 容器ID game:v1 docker images docker save game:v1 > game-v1.tar docker load < game-v1.tar docker run -p 8080:8080 -p 8090:8090 -d game:v1 nginx -g 'daemon off;'
6.2 手动制作云盘镜像
制作成容器:
docker run -it -d -p 80:80 centos:7 /bin/bash docker exec -it ed90a5662ac4 /bin/bash
容器内正常安装
0.初始化 使用阿里源 groupadd www -g 1000 useradd www -u 1000 -g 1000 -M -s /sbin/nologin rm -rf /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 1.安装依赖环境 nginx+php cat>/etc/yum.repos.d/nginx.repo<<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF yum makecache fast yum install nginx php-fpm php-mbstring php-gd unzip -y 2.配置Nginx和php rm -rf /etc/nginx/conf.d/default.conf sed -i '/^user/c user www;' /etc/nginx/nginx.conf sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf cat >/etc/nginx/conf.d/kod.conf<<EOF server { server_name localhost; listen 80; root /code; index index.php index.html; location ~ \.php\$ { root /code; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; include fastcgi_params; } } EOF 3.配置代码 mkdir /code cd /code curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip unzip kodexplorer4.40.zip chown -R www:www /code 4.启动脚本 cd /root cat >init.sh<<EOF #!/bin/bash php-fpm -c /etc/php.ini -y /etc/php-fpm.conf nginx -g 'daemon off;' EOF chmod +x init.sh 5.测试 方法一: #若前面没有映射端口,执行脚本用curl测试 sh init.sh 重开端口测试 [ code]# curl -I 127.0.0.1 方法二: 登录web 10.0.0.51测试 6.宿主机操作 #生成镜像 docker commit ed90a5662ac4 my_kod:v1 #基于新生成的镜像.启动容器 docker run -p 80:80 -d my_kod:v1 /bin/bash /root/init.sh
Dockerfile自动构建Docker镜像
7.1 Dockerfile操作命令说明
Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方式 Dockerfile指令: 只支持Docker自己定义的一套指令,不支持自定义 大小写不敏感,但是建议全部使用大写 根据Dockerfile的内容顺序执行 FROM: FROM {base镜像} 必须放在DOckerfile的第一行,表示从哪个baseimage开始构建 MAINTAINER: 可选的,用来标识image作者的地方 RUN: 每一个RUN指令都会是在一个新的container里面运行,并提交为一个image作为下一个RUN的base 一个Dockerfile中可以包含多个RUN,按定义顺序执行 RUN支持两种运行方式: RUN <cmd> 这个会当作/bin/sh -c “cmd” 运行 RUN [“executable”,“arg1”,。。],Docker把他当作json的顺序来解析,因此必须使用双引号,而且executable需要是完整路径 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxx CMD: CMD的作用是作为执行container时候的默认行为(容器默认的启动命令) 当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令 一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用 CMD定义的三种方式: CMD <cmd> 这个会当作/bin/sh -c "cmd"来执行 CMD ["executable","arg1",....] CMD ["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数 EXPOSE 声明端口 格式为 EXPOSE <端口1> [<端口2>...]。 EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。 entrypoint: entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部 每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效 当定义了entrypoint以后,CMD只能够作为参数进行传递 entrypoint定义方式: entrypoint ["executable","arg1","arg2"],这种定义方式下,CMD可以通过json的方式来定义entrypoint的参数,可以通过在运行container的时候通过指定command的方式传递参数 entrypoint <cmd>,当作/bin/bash -c "cmd"运行命令 ADD & COPY: 当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到image中 ADD和COPY的源必须在context路径下 当src为网络URL的情况下,ADD指令可以把它下载到dest的指定位置,这个在任何build的方式下都可以work ADD相对COPY还有一个多的功能,能够进行自动解压压缩包 ENV: ENV key value 用来设置环境变量,后续的RUN可以使用它所创建的环境变量 当创建基于该镜像的container的时候,会自动拥有设置的环境变量 WORKDIR: 用来指定当前工作目录(或者称为当前目录) 当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准 USER: 指定UID或者username,来决定运行RUN指令的用户 ONBUILD: ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令 可以定义多个ONBUILD指令 当下一个镜像B使用镜像A作为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的ONBUILD指令 ONBUILD <DOCKERFILE 指令> <content> VOLUME: 用来创建一个在image之外的mount point,用来在多个container之间实现数据共享 运行使用json array的方式定义多个volume VOLUME ["/var/data1","/var/data2"] 或者plain text的情况下定义多个VOLUME指令
7.2 使用Dockerfile创建云盘
7.2.1 准备需要的文件
1.创建目录 mkdir /root/dockerfile_kod/{code,conf,repo} -p 2.拷贝文件到指定目录 docker cp afc35bc7f8a1:/root/init.sh /root/dockerfile_kod/conf/ #构建好的目录结构 [ ~]# tree dockerfile_kod/ dockerfile_kod/ ├── build.sh ├── code │ └── kodexplorer4.40.zip ├── conf │ ├── init.sh │ ├── kod.conf │ ├── nginx.conf │ ├── php-fpm.conf │ └── www.conf ├── dockerfile └── repo ├── CentOS-Base.repo ├── epel.repo └── nginx.repo
7.2.2 编写dockerfile
[ dockerfile_kod]# cat dockerfile #0.基础镜像 FROM centos:7 #1.初始化操作 RUN groupadd www -g 1000 RUN useradd www -u 1000 -g 1000 -M -s /sbin/nologin RUN rm -rf /etc/yum.repos.d/* ADD repo/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo ADD repo/epel.repo /etc/yum.repos.d/epel.repo ADD repo/nginx.repo /etc/yum.repos.d/nginx.repo #2.安装依赖环境 nginx+php RUN yum makecache fast RUN yum install nginx php-fpm php-mbstring php-gd unzip -y RUN yum clean all #3.配置Nginx和php RUN rm -rf /etc/nginx/conf.d/default.conf ADD conf/nginx.conf /etc/nginx/nginx.conf ADD conf/kod.conf /etc/nginx/conf.d/kod.conf ADD conf/php-fpm.conf /etc/php-fpm.conf ADD conf/www.conf /etc/php-fpm.d/www.conf #4.配置代码 RUN mkdir /code WORKDIR /code ADD code/kodexplorer4.40.zip /code/kodexplorer4.40.zip RUN unzip kodexplorer4.40.zip RUN chown -R www:www /code #5.复制启动脚本 ADD conf/init.sh /root/init.sh #6.启动命令 CMD ["/bin/bash","/root/init.sh"]
7.2.3 构建新镜像
[ ~/dockerfile/kod]# docker build --network=host -t centos_kod:v1 . [ ~/dockerfile/kod]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos_kod v1 87071ea7c86b 2 minutes ago 465MB
7.2.4 基于新镜像运行容器
[ ~/dockerfile/kod]# docker run -d -p 80:80 centos_kod:v1 4d1007d7194d434248762e5aca76070206643f0f0f533f2112d0359b25fe7ba0
7.2.5编写构建,启动脚本
[ dockerfile_kod]# cat build.sh #!/bin/bash docker stop $(docker ps -qa) docker rm $(docker ps -qa) docker build --network=host -t my_kod:v2 . docker run -p 80:80 -d my_kod:v2
Docker私有仓库
8.1 普通的docker registry
8.2 带认证的docker registry
8.3 企业级的docker-harbor
8.3.1 部署思路
第一步:安装docker和docker-compose 第二步:下载harbor-offline-installer-v1.9.0-rc1.tgz 第三步:上传到/opt,并解压 第四步:修改harbor.yml配置文件 hostname = 10.0.0.11 harbor_admin_password = 123456 第五步:执行install.sh
8.3.2 安装私有仓库
1.下载软件包 cd /opt wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-offline- installer-v1.9.3.tgz 上传包 tar xf harbor-offline-installer-v1.9.0-rc1.tgz 2.修改配置 vim harbor.yml hostname: 10.0.0.51 harbor_admin_password: 123456 3.下载docker-compose,编排工具 yum install docker-compose -y 4.安装harbor 停止80端口执行 ./install.sh 查看编排状态 cd /opt/harbor docker-compose ps 登录:web 10.0.0.51 创建linux项目 5.修改镜像名称(镜像的ID) docker tag ae21150e3af8 10.0.0.51/linux/my_kod:v2 docker images 6.修改docker配置添加信任仓库 cat >/etc/docker/daemon.json<<EOF { "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"], "insecure-registries": ["http://10.0.0.51"] } EOF #重启docker systemctl restart docker docker-compose ps docker-compose stop docker-compose up -d 7.docker登录到harbor docker login 10.0.0.51 8.上传镜像到私有仓库 docker push 10.0.0.51/linux/my_kod:v2 9.客户端使用仓库下载镜像 删除已有的:注意.先停容器,在删除容器,镜像 docker pull 10.0.0.51/linux/my_kod:v2
8.3.3 其他主机上下载镜像
[ ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror.c.163.com"], "insecure-registries": ["http://10.0.1.11"], "insecure-registries": ["https://10.0.1.11"] } [ ~]# docker pull 10.0.1.11/linux/centos_kod:v1
容器的基本架构图
项目实战:制作kvm管理工具容器
前提:新起一个容器,容器内操作 1.初始化 rm -rf /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 2.安装python依赖 yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor gcc python-devel python -m pip install --upgrade --force pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip install setuptools==33.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple 3.安装python的Django环境 cd /opt/ git clone git://github.com/retspen/webvirtmgr.git cd webvirtmgr pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple [ webvirtmgr]# chmod +x manage.py ./manage.py syncdb ./manage.py collectstatic 4.安装Nginx cat>/etc/yum.repos.d/nginx.repo<<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF yum makecache fast yum install nginx -y yum clean all 5.配置Nginx和代码 mkdir /code mv /opt/webvirtmgr /code/ chown -R nginx:nginx /code rm -rf /etc/nginx/conf.d/default.conf cat >/etc/nginx/conf.d/webvirtmgr.conf<<EOF server { listen 80 default_server; server_name localhost; access_log /var/log/nginx/webvirtmgr_access_log; location /static/ { root /code/webvirtmgr; expires max; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-for \$proxy_add_x_forwarded_for; proxy_set_header Host \$host:\$server_port; proxy_set_header X-Forwarded-Proto \$scheme; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; client_max_body_size 1024M; } } EOF nginx -t nginx ss -lntup 6.配置Supervisor cat >/etc/supervisord.d/webvirtmgr.ini<<EOF [program:webvirtmgr] command=/usr/bin/python /code/webvirtmgr/manage.py run_gunicorn -c /code/webvirtmgr/conf/gunicorn.conf.py directory=/code/webvirtmgr autostart=true autorestart=true logfile=/var/log/supervisor/webvirtmgr.log log_stderr=true user=nginx [program:webvirtmgr-console] command=/usr/bin/python /code/webvirtmgr/console/webvirtmgr-console directory=/code/webvirtmgr autostart=true autorestart=true stdout_logfile=/var/log/supervisor/webvirtmgr-console.log redirect_stderr=true user=nginx [program:nginx] command=nginx -g 'daemon off;' autostart=true autorestart=true stdout_logfile=/var/log/supervisor/nginx.log redirect_stderr=true EOF sed -i "s#nodaemon=false#nodaemon=true#g" /etc/supervisord.conf supervisord -c /etc/supervisord.conf supervisorctl status 7.创建用户 mkdir /var/cache/nginx/.ssh/ -p chown -R nginx:nginx /var/cache/nginx/ su - nginx -s /bin/bash ssh-keygen touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config chmod 0600 ~/.ssh/config ssh-copy-id 8.提交新镜像 docker commit 402aca4eaa81 mykvm:v1 9.运行新容器,注意:其他端口有时会跳转, docker run --name mykvm3 -p 80:80 -it -d mykvm:v1 supervisord -c /etc/supervisord.conf
docker监控
1.docker自带的监控命令 docker container ps :查看正在运行的容器 docker container top +容器的id :知道某个容器运行了哪些进程 docker container stats +容器的id :显示每个容器各种资源使用情况 2.cAdvisor+ prometheus+ grafana组件介绍 组件介绍: 在不同页面之间跳转,并且只能监控一个host,这不免让人质疑他的实用性,但cAdvisor有一个亮点是可以将监控到的数据导出给第三方工具,有这些工具进一步加工处理。 所以我们可以把cAdvisor定位为一个监控数据收集器,收集和导出数据是他的强项,而非展示数据。 cAdvisor支持很多第三方工具,其中就包含prometheus #prometheus Prometheus是一个非常优秀的监控工具。提供了监控数据搜集,存储,处理,可视化和告警一系列完整的解决方案。包含组件 Node Exporter :负责收集host硬件和操作系统数据,以容器的形式运行在所有host上 cAdvisor :负责收集容器数据,以容器的形式运行在所有host上 #grafana grafana是一款支持多种数据源的图形展示工具 3.部署 #地址规划: 10.0.0.51 cAdvisor+ Node Exporter +prometheus+ grafana 10.0.0.52 cAdvisor+ Node Exporter #docker01的配置文件: mkdir prometheus cd prometheus #上传压缩包 docker load < 压缩包 cat >docker-compose.yml<<EOF version: '3.2' services: prometheus: image: prom/prometheus:latest container_name: prometheus ports: - 9090:9090 command: - --config.file=/etc/prometheus/prometheus.yml volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro depends_on: - cadvisor node-exporter: image: prom/node-exporter:latest container_name: node_exporter ports: - 9100:9100 cadvisor: image: google/cadvisor:latest container_name: cadvisor ports: - 8080:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro grafana: image: grafana/grafana:latest container_name: grafana ports: - 3000:3000 EOF #prometheus配置文件 cat >prometheus.yml <<EOF scrape_configs: - job_name: cadvisor scrape_interval: 5s static_configs: - targets: - 10.0.0.51:8080 - 10.0.0.52:8080 - job_name: prometheus scrape_interval: 5s static_configs: - targets: - 10.0.0.51:9090 - job_name: node_exporter scrape_interval: 5s static_configs: - targets: - 10.0.0.51:9100 - 10.0.0.52:9100 EOF #docker02配置文件: cat >docker-compose.yml<<EOF version: '3.2' services: node-exporter: image: prom/node-exporter:latest container_name: node_exporter ports: - 9100:9100 cadvisor: image: google/cadvisor:latest container_name: cadvisor ports: - 8080:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro EOF 4.运行 ntpdate time1.aliyun.com docker-compose up -d 5.检查 http://10.0.0.51:8080/metrics http://10.0.0.51:9100/metrics http://10.0.0.51:9090 http://10.0.0.51:3000
登录:10.0.0.51:3000
账号:admin 密码;admin
配置源地址
下载