Docker之路
- 笔者:Markguo
- 职业:运维工程师
- QQ:1737602029
1. 容器是什么
容器本质上是一个进程,容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件(系统刚装好/下面就存在的文件),主机名,进程管理.
2. 程序何进程?
程序: 代码,软件,命令
进程:正在运行的程序
命令执行结束,进程关闭,释放内存
3. 容器和虚拟机的区别
1. 虚拟机: 硬件cpu支持(vt虚拟化),模拟计算硬件,有自己的内核, 走正常的开机启动
按下电源按钮, bios开机自检根据bios启动项读取硬盘第一个扇区grub,uefi,
centos7, 加载内核,启动系统第一个进程/sbin/init systemd 第一个进程再启动其
他进程,操作系统启动完成
bios启动项顺序,从上到下: 软盘,硬盘, 光驱, 网卡
2. 容器: 不需要硬件CPU的支持,不需要模拟计算机硬件,共用宿主机的内核,启动容器的第一个进程.
容器的优势: 启动快,性能高,损耗少,轻量级,使用容器替代虚拟机最终的目的就是为了降低成本!
容器和虚拟化的区别
Linux容器技术 容器虚拟化和kvm虚拟化的区别:
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行在不同的操作系统,启动时间分
4. docker-ce的安装
所需环境:
主机名 | 内存 | ip |
---|---|---|
docker01 | 2G | 10.0.0.11 |
docker02 | 2G | 10.0.0.12 |
#安装docker-ce
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 install docker-ce -y
systemctl enable docker
systemctl start docker
#验证
[root@docker01 yum.repos.d]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
5. docker主要内容
docker是一个cs架构, docker主要:镜像 容器 仓库 网络 存储 监控
docker是一个软件的打包技术.
docker run -d -p 80:80 nginx:latest
run 创建并启动一个容器
-d 放后台启动
-p 端口映射
nginx:latest docker镜像名称
注意
:镜像名:后面必须跟版本号,而且只有一个冒号!
查看镜像的版本号需要登录docker官网:
6. docker镜像常用命令
docker container
: 存放容器命令
docker container ls -a
docker ps -a
: 查看所有容器状态
1. docker run 创建并启动容器
例子:docker run -d -it -p 80:80 nginx:latest
2. docker create 创建容器 加上 --name 指定容器名字
例子: docker run -d --name nihao nginx:latest
3. docker start 启动容器
例子 : docker start 容器id
注意: docker run = docker create + docker start
4. docker stop 停止容器 正常停止容器,返回值为0
例子 : docker stop 容器id
5. docker restart 重启容器
例子 : docker restart 容器id
6. docker kill 强制停止容器 kill掉,返回值可能为0以外其他数字
例子 : docker kill 容器id
7. docker ps 查看容器列表 只查看运行的容器 加上 -a 查看所有容器 加上 -q 只显示容器id --no-trunc 显示详细信息
例子 : docker ps -a
8. docker diff 查看容器中修改的文件
例子: docker diff 容器id
9. docker rm 删除容器 加-f 强制删除
10. docker container qurne 删除所有非运行状态容器,必须要加container
11. 批量删除所有容器 docker rm -f `docker ps -a -q`
12. docker cp 将本地的文件拷到容器上的指定位置,或将容器上的文件拷到本地指定位置
例子: docker cp 本地文件 容器id:/指定的拷贝到的位置
13. docker cp 容器id:/指定的文件 要拷贝到本地的路径
14. docker logs 容器id :查看指定容器的日志
15. docker wait 等待上一个容器执行完在执行下一个容器
16. docker rename 重命名容器
例子: docker rename 容器id 新的容器id
17. docker container prune 清理容器
18. docker update 更新容器的属性
例子: docker container update 容器id --restart always
19. docker container top 查看容器执行了哪些进程
例子: docker container top 容器id
docker stats : 查看容器使用的资源
20. docker run -d -p 80:80 --memory 500M 镜像 限制容器内存
21. docker pause 挂起容器
例子: docker pause 容器id
22. docker uppause 恢复挂起的容器
例子: docker uppause 容器id
23. docker port 查看容器暴漏了哪些端口
例子 docker port 容器id
24. docker export 把容器导出成镜像压缩包(没有变迁和版本,只有一层, 而且只能用import逃入)
例子: docker export 容器id > /docker_test.tar.gz
25. docker container inspect 查看容器属性
例子: docker container iinpsect 容器id
26. docker exec 进入正在运行的容器(分配一个新终端,不会影响其他人)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
27. docker attach 进入正在运行的容器(使用相同的终端,且在容器中画面同步,命令同步), 偷偷离开的快捷键 先按ctrl +p松开以后再按ctrl +q
28. docker run -p 宿主机端口:容器端口
29. docker run -v 宿主机目录:容器目录
单服务和多服务的docker,区别初始命令
问题1 : 多服务的docker镜像,所有服务都不支持前台? 怎么办
在脚本中写入要启动的服务 虽然不能夯住,但是可以在最后一条命令加 tail -f 一个文件 把脚本夯住 就可以了
下面的这些话可是很精髓的,记住了!!!
- 每一个容器在启动的时候都需要执行一条初始命令,容器在本质上就是一个进程,靠初始命令启动,每一个镜像都有默认的初始命令,没有指定初始命令就是用默认的,指定了就覆盖了默认的用指定的,容器想要在后台一直运行的话初始命令就必须夯住
- 每一个容器镜像,都有自己的操作系统 centos Ubantu debian alpine,只要是使用linux内核的操作系统,都可以叫做linux系统
alpine : 系统体积小, docker pull 下载越快
进入容器中一般执行 cat /etc/os-release 查看使用的系统
为了保证docker镜像体积尽可能小,很多命令都没有安装,但是进入容器中可以安装命令
问题2: ?????? exec没问题 但是attach总会卡住 ,ctrl+c中断后容器也stop了 ?
只能是一开始的初始命令是 docker run -it centos:6.9 /bin/bash 然后你在从其他窗口attach进去
容器想要放在后台一直运行的化,那么容器的初始命令,必须夯住(前台运行),否则容器就会退出.
前台运行
nginx -g 'daemon off;'
/usr/sbin/php-fpm --nodaemonize
7:docker端口映射
docker run
-p 宿主机端口:容器端口
-p 宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口)
-p 宿主机ip1::容器端口 随机端口映射
-p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射
-p 80:80 -p 3306:3306
-p 1111-1119:1111-1119 端口范围映射
-P(大写) 自动随机端口映射
示例:
docker run -d -p 80:80 t29617342/ko2d:v2
8:docker数据卷
docker run
-v 宿主机文件或目录挂载到容器中,文件对文件,目录对目录
-v 宿主机绝对目录:容器目录
例子:docker run -d -P -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
-v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据
例子: docker run -d -P -v /usr/share/nginx/html nignx:latest
-v 定义卷的名字:/容器目录 #创建一个便于管理的卷的目录
例子: docker run -d -P -v nihao:/usr/share/nginx/html nignx:latest
docker volume ls #查看所有卷的信息 默认保存路径 /var/lib/docker/volumes/xxxxxxx
docker inspect #容器id |grep volume 查看容器与卷的关联,并确定卷的目录
-v 宿主机绝对目录:容器目录 -v 宿主机绝对目录:容器目录 可以挂在多个目录
例子: docker run -d -P -v /tmp:/tmp -v /nginx:/nginx nginx:latest
--volumes-from 跟某一个容器挂载所有相同的卷
例子: docker run -d -P --volune-from 要和哪个容器挂在的卷相同的容器名字 nginx:latest
小练习: 只启动一个nginx容器,要求访问80端口,出现nginx默认欢迎首页,访问81端口,出现小鸟飞飞.
方法1: 在所启动docker容器没有vi及vim的情况下
echo 'server {
listen 81;
server_name localhost;
location / {
root /opt/xiaoniao;
index index.html index.htm;
}
}' >/etc/nginx/conf.d/xiaoniao.conf
exit
docker restart fecfb705fb60
方法2: 在宿主机的编辑好配置文件,并将此配置文件与站点目录挂载到相应容器中的相应位置下,重启容器
1. 将xiaoniao站点目录挂载到容器:
docker run -d -p 80-81:80-81 -v /opt/xiaoniao:/opt/xiaoniao nginx:latest
2. 在宿主机上编辑配置文件,并拷贝到容器nginx配置目录下
[root@docker02 /opt]# vim /opt/xiaoniao.conf
server {
listen 81;
server_name localhost;
location / {
root /opt/xiaoniao;
index index.html index.htm;
}
}
[root@docker02 ~]# docker cp /opt/xiaoniao.conf fecfb705fb60:/etc/nginx/conf.d/
4. 重启容器
[root@docker02 ~]# docker restart fecfb705fb60
方法3: 一步到位: 启动容器同时将主机的编辑好配置文件与站点目录挂载到相应容器中的相应位置下
[root@docker02 /opt]# vim /opt/xiaoniao.conf
server {
listen 83;
server_name localhost;
location / {
root /opt/xiaoniao;
index index.html index.htm;
}
}
[root@docker02 ~]# docker run -d -p 82-83:82-83 -v /opt/xiaoniao:/opt/xiaoniao -v /opt/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf nginx:latest
推荐使用方法2和3
浏览器访问效果
9: 手动制作镜像
一、制作基于centos6系统的nginx镜像(单服务)
步骤
1:启动一个纯净的centos:6.9容器,安装nginx
docker run -it -p 80:80 centos:6.9 /bin/bash
优化下载源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
安装nginx
yum install nginx -y
2:把安装好服务的容器,提交为镜像
方法: docker container commit eb109f194821(容器id ) centos6.9_nginx:v1 (自定义镜像名称)
docker commit 5ab5cf7c4b47 centos6.9_nginx:v1
3:测试镜像的功能
docker run -d -p 81:80 centos6.9_nginx:v1平时- (指定初始命令,使进程能夯住)
docker run -d -p 80:80 centos6.9_nginx:v1 nginx -g 'daemon off;'
注意: 启动docker容器不加初始命令或者加/bin/bash,都是默认执行centos的初始命令/bin/bash !
二、制作一个基于centos7系统的nginx+sshd双服务镜像
1.启动一个纯净的环境 或者在已有nginx镜像的容器基础上制作
我这里在已有西nginx镜像的基础上制作
[root@docker01 ~]# docker run -it -p 80:80 centos6.9_nginx:v1 /bin/bash
[root@b552568b8c38 /]#
yum源当前镜像已经更新,所以无需再操作
直接下载openssh-server initscripts即可
yum install openssh-server -y
yum install initscripts -y
设置 登录密码
echo '123456'|passwd --stdin root
做启动脚本,因为容器的初始命令只能执行一条,所以需要通过脚本的方式来执行
vi /init.sh
#!/bin/bash
/usr/sbin/sshd
nginx -g 'daemon off;'
2. 把安装好服务的容器,提交为镜像
docker commit 9673ffee9e38 centos6.9_nginx_ssh:v2
3. 测试镜像
docker run -d -p 88:80 -p 1022:22 centos6.9_nginx_ssh:v2 /bin/bash /init.sh
正确启动: 为了让容器一直在后台运行!
三、制作一个基于centos7系统的kod网盘的镜像(多服务)
1:启动一个centos7_nginx:v1,再安装php
[root@docker02 ~]# docker run -it -p 80:80 centos7_nginx:v1 /bin/bash
[root@92de845b1df4 yum.repos.d]# yum install php-fpm php-gd php-mbstring -y
vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
10:自动制作docker镜像
一、介绍及常用命令
镜像: 中药
dockerfile: 配方
类似ansible剧本,大小几kb 手动做镜像:大小几百M+
dockerfile 支持自定义容器的初始命令
dockerfile主要组成部分:
dockerfile主要组成部分: 例子 基础镜像信息 FROM centos:6.9 制作镜像操作指令 RUN yum install openssh-server -y 容器启动时执行初始命令 CMD ["/bin/bash"]
dockerfile常用指令
FROM 基础镜像 例子: FROM centos:6.9
RUN 制作镜像过程中需要的执行命令(安装服务) 每个run就产生一个临时镜像 例子: RUN yuminstall -y nginx
CMD 容器启动的时候执行的初始命令,容易被替换(启动服务) 例子: CMD ["nginx","-g","daemonoff;"]
ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD 把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包) 例子: ADD 1.tar/usr/share/nginx/html
COPY 把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)例子: COPY 1.txt/usr/share/nginx/html
WORKDIR 指定容器的默认工作目录 类似于cd 开始就切换到指定目录 例子: WORKDIR 目录: 进入容器的时候默认所在目录
EXPOSE 镜像要暴露的端口 例子: EXPOSE 端口 端口 :要暴露的端口,在开启生成容器的时候 有暴漏的端口那么docker可以自动做随机端口映射
VOLUME 持久化卷(自动自动创建随机名字的卷) 例子: VOLUME 容器目录
ENV 环境变量(ssh的密码,数据库的密码) 声明环境变量 例子: ENV LL=xx 多个环境变量就写多个ENV
例子2:docker run -d -p 80:80 --env "ssh_pass=654321" 镜像 docker run --env 声明环境变量会覆盖
dockerfile中的ENV变量
LABEL 镜像的属性标签
MAINTAINER 管理者标识
换个味觉感受一下:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
LABLE 描述,标签
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(会自动解压tar) 制作docker基础的系统镜像
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件(不会解压)rootfs.tar.gz
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
注意: 自动构建docker镜像的时候需要一个dockerfile文件,名字只能是dockerfile,一个镜像一个dockerflie,所以就是一个目录中一个dockerfile文件
例如: /opt/opt/dockerfile/centos_nginx/dockerfile
二、根据dockerfile自动构建镜像的思路
a: 手动制作docker镜像,记录历史命令
b:根据历史命令编写dockerfile文件
c: docker build构建docker镜像 docker image build dockerfile文件
d: 测试镜像的功能
三、ENV ssh 密码设置用法:
[root@docker02 centos_nginx_ssh]# cat dockerfile
FROM centos:6.9
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
RUN yum install openssh-server -y
RUN service sshd restart
ADD init.sh /init.sh
ENV SSH_PASS 123456
CMD ["/bin/bash","/init.sh"]
[root@docker02 centos_nginx_ssh]# cat init.sh
#!/bin/bash
echo "$SSH_PASS"|passwd --stdin root
/usr/sbin/sshd
nginx -g 'daemon off;'
四、实战
1. 构建简单单服务docker镜像
1. 编写dockerfile文件
[root@docker01 /opt/dockerfile/centos_nginx]# vim dockerfile
FROM centos:6.9
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]
2.构建docker镜像
[root@docker01 /opt/dockerfile/centos_nginx]# docker image build -t centos6.9_nginx:v2 .
2. 构建小鸟飞飞游戏镜像
1. 编写dockerfile文件
root@docker01 /opt/dockerfile/xiaoniao]# cat dockerfile
FROM centos:6.9
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
ADD xiaoniao /usr/share/nginx/html
CMD ["nginx","-g","daemon off;"]
2. 构建镜像
[root@docker01 /opt/dockerfile/xiaoniao]# docker build -t xiaoniao:v1 .
3. 启动容器
[root@docker01 /opt/dockerfile/xiaoniao]# docker run -d -p 89:80 xiaoniao:v1
4. 验证
注意: 上例中的ADD 也可以换成COPY, 但是:
ADD —-> 会自动解压tar包
COPY—> 不会解压tar包
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx php-fpm php-mysql mariadb-server
ADD www.conf /etc/php-fpm.d/www.conf
ADD nginx.conf /etc/nginx/nginx.conf
ADD wordpress.conf /etc/nginx/conf.d/
RUN mkdir /code
WORKDIR /code
ADD wordpress-5.4-zh_CN.zip .
RUN yum -y install unzip
RUN unzip wordpress-5.4-zh_CN.zip
RUN chown -R nginx.nginx ./
RUN mysql_install_db --user=mysql --defaults-file=/etc/my.cnf
RUN tmp=`nohup mysqld_safe --defaults-file=/etc/my.cnf &` && sleep 3 && \
mysql -e "create database wordpress;" && \
mysql -e "grant all on wordpress.* to wordpress@localhost identified by '1';"
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
11.docker镜像的分层
12.dockerfile的优化
优化原则:构建的镜像尽可能小,构建的速度尽可能快
a: 使用体积小的linux镜像alpine
b:尽可能的清理无用的缓存文件(尽可能把多个RUN合并)
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件
13:容器间的互联
注意: 容器和容器之间网络是互通的,主要的问题是,不知道对方的ip地址
docker run --link 正在运行容器的名字(单方向)
docker run link 单向通信
部署zabbix
docker run --name mysql-server -it \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
14:单机版的容器编排
解释: 容器编排:可以理解为容器编排工具可以做到批量启动容器,批量关闭容器,批量重启容器(也就是批量管理容器!)
这里我们可以使用docker-compose
安装dockercompose
yum install docker-compose -y
# (需要epel源)
使用
z
常用的管理命令:
docker-compose up -d 启动服务
docker-compose down 停止服务
docker-compose start 批量启动容器
docker-compose stop 批量停止容器
docker-compose restart 批量重启容器
-f 可以指定docker-compose #文件所在的位置
利用 docker-compose部署游戏私服
环境要求:
服务端:内存4G+
配置好yum源---epel Base
一、服务端配置
1. 安装docker,docker-compose,启动服务
yum install docker-ce docker-compose -y
(我这里直接上传docker的rpm包,本地下载安装
tar xf docker1903_rpm.tar.gz
yum install localinstall *.rpm)-----正常安装略过我这步!
systemctl start docker
systemctl enable docker
安装docker-compose
yum install docker-compose -y
上传游戏源码包并解压
tar xf fuck.tar.gz -C /usr/local/games/
3. 执行脚本导入镜像
cd /usr/local/games/fuck/
./start
查看: netstat -lntup
docker ps
4. 修改游戏服务器列表信息中的ip地址
vi /usr/local/games/fuck/www/tianlong3D/conf/serverlist/serverlist.txt
二、客户端配置:
1. 安装win-jdk 1.8
2. 打开ApkIDE最新3.3.3少月增强版
3. 反编译apk包
4. 修改assets\config.properties文件8,13,14行
修改res\values\strings.xml文件9,10,17,18服务器地址
5. 重新编译,导出新的apk包
#注:充值元宝方法:
http://10.0.0.100:81/zt/gm.php
gmcode默认123456
重要脚本解释:
15. 私有仓库docker-registry
注意
- docker 是一种软件打包技术
- 私有仓库的镜像是有域名的
- 私有仓库pull镜像要加域名,否则是从官方仓库下载
- push镜像到私有仓库也需要加域名
#启动私有仓库
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
这个私有仓库用的是http协议
#镜像地址
nginx:1.15 官方仓库的官方镜像
nginx/nginx:1.15 官方仓库的用户镜像
daocloud.io/nginx/nginx:1.15 私有仓库的镜像
#上传镜像
docker tag alpine:3.9 10.0.0.11:5000/alpine:3.9
docker image push 10.0.0.11:5000/alpine:3.9
#第一次上传镜像会报错
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
docker image push 10.0.0.11:5000/alpine:3.9
#下载镜像
docker image pull 10.0.0.11:5000/alpine:3.9
#----------------------------------------------------- 私有仓库镜像列表----------------------------------------------
10.0.0.11:5000/v2/_catalog
10.0.0.11:5000/v2/镜像/tags/list
#删除私有仓库的镜像
①进入仓库
docker exec -it registry /bin/sh
② 删除repo
rm -fr /var/lib/registry/docker/registry/v2/repositories/nginx
③清楚掉blob
registry garbage-collect /etc/docker/registry/config.yml
docker 官方仓库上传镜像
第一步: docker login 登录官方仓库
[root@docker02 ~]# docker login
Username: luckydocker07
Password:asdfghjkl
第二步: 打标签,需要指定自己的官方仓库id
docker tag alpine_nginx:v2 luckydocker07/apline_nginx:v2
第三步:上传镜像
docker push luckydocker07/alpine_nginx:v2
16: 企业级私有仓库harbor(docker-compose)
- 下载harbor要到github.com网站
- offline 离线版 包含harbor 所有需要的docker镜像
- online 在线版 不包含harbor 所需要的docker镜像
#1.下载安装器并解压
https://github.com/goharbor/harbor/releases/download/v1.10.0/harbor-offline-installer-v1.10.0.tgz
#解压
[root@docker01 opt]# tar xf harbor-offline-installer-v1.8.0.tgz
#2. 安装 docker-compose
[root@docker01 opt]# yum install docker-compose -y
#3. 修改harbor配置文件
cd harbor
vim harbor.yml
hostname: 10.0.0.12 -------> 只能是IP地址或者域名
harbor_admin_password: 123456
#4. 执行安装脚本,端口不能冲突
./install.sh
#5. #测试登录
浏览器访问:
10.0.0.11:80
用户admin 密码123456
为harbor配置https证书
# 修改harbor.yml
#1. 配置域名
hostname: blog.oldqiang.com ----->用了https证书所以要使用域名
#2. 配置证书 注意缩进关系
https:
port: 443
certificate: /opt/certs/nginx/1_blog.oldqiang.com_bundle.crt 公钥
private_key: /opt/certs/nginx/2_blog.oldqiang.com.key 私钥
#3. 重新执行安装脚本
./install.sh
#4. 登录验证,需要域名
1)服务端登录
docker login blog.oldboy.com
2)浏览器登录
blog.oldqiang.com
上传项目(镜像)到自己指定的目录 ----->一个项目就相当于一个目录
方式:
① 打标签
[root@docker01 /opt/harbor]# docker tag alpine:latest blog.oldqiang.com/zabbix/alpine:v1.0
② 上传
[root@docker01 /opt/harbor]# docker push blog.oldqiang.com/zabbix/alpine:v1.0
对以上命令格式解释如下:
docker tag 要上传的镜像 harbor仓库地址/项目(传到那个目录)/打啥标签
然后push
harbor镜像迁移
17. 17:docker基础网络
四种基础网络类型
bridge 默认类型 NAT模式 docker run 没有指定 --network 就使用默认的网络
host host类型,使用宿主机网络,网络性能最高 容易端口冲突 配置方法 docker run -it --network
host 镜像
使用主机网络 宿主机主机名和容器主机名相同
container 容器类型。使用其他容器共用网络,k8s中使用,很容易端口冲突 经量再两个容器中使用不同的服务,要不然会端口冲突
设置方法: docker run -it --network container:要使用哪个容器网络的容器id 镜像 /bin/bash
none 没有网络,上不了外网 设置方法 docker run -it --network none
镜像 只有内网没有外网提供不了服务,只能用来练习一个基础命令
创建自定义网络:
docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 markguo
18:跨宿主机容器间的通讯之macvlan
macvlan类似与虚拟机的桥接网络,不能自动分配网络ip需要手动指定
#创建网络,再要制作macvlan的容器所在的宿主机上添加上以下命令
docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
#启动容器
docker run -it --network macvlan_1 --ip 10.0.0.105 alpine:3.9
19:跨宿主机容器间的通讯之overlay
consul 存储ip地址分配和节点
1) docker03上: consul存储ip地址的分配
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
注意: -h: 指定容器主机名
10.0.0.13:8500 访问测试 看到consul页面就说明没问题
docker01、02上编辑json文件,注意格式:
vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.13:8500", #集群存储信息,注册到哪个consul上面
"cluster-advertise": "10.0.0.11:2376" #节点信息,不同节点信息不一样 11是11的节点信息,12是12的节点信息
}
systemctl restart docker
2)创建overlay网络 在节点上创建 docker01或者docker02
docker network create -d overlay --subnet 172.26.0.0/16 --gateway 172.26.0.1 ol1
3)启动容器测试
docker01: docker run -it --network ol1 --name oldboy01 alpine:3.9 /bin/sh
docerk02: docker run -it --network ol1 --name oldboy02 alpine:3.9 /bin/sh
注意:容器名不能相同
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
测试: 在docker02中 ping docker01
/ # ping oldboy01
overlay上网原理图
解释: overlay 是通过eth1上外网连接docker_gwbridge,在连接宿主机网络上外网,eth0在不同宿主机之间通过overlay隧道通信overlay 上外网是需要做端口映射的
20:docker容器的监控
1. 监控介绍
监控系统在这里特指对数据中心的监控,主要针对数据中心内的硬件和软件进行监控和告警。企业的 IT 架构逐步从传统的物理服务器,迁移到以虚拟机为主导的 IaaS 云。无论基础架构如何调整,都离不开监控系统的支持。
不仅如此。越来越复杂的数据中心环境对监控系统提出了更越来越高的要求:需要监控不同的对象,例如容器,分布式存储,SDN网络,分布式系统。各种应用程序等,种类繁多,还需要采集和存储大量的监控数据,例如每天数TB数据的采集汇总。以及基于这些监控数据的智能分析,告警及预警等。
在每个企业的数据中心内,或多或少都会使用一些开源或者商业的监控系统。从监控对象的角度来看,可以将监控分为网络监控,存储监控,服务器监控和应用监控等,因为需要监控数据中心的各个方面。所以监控系统需要做到面面俱到,在数据中心中充当“天眼“角色。
2. Prometheus 简介
2.1 Prometheus 简介
Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。
2.2优点
- 强大的多维度数据模型:
- 时间序列数据通过 metric 名和键值对来区分。
- 所有的 metrics 都可以设置任意的多维标签。
- 数据模型更随意,不需要刻意设置为以点分隔的字符串。
- 可以对数据模型进行聚合,切割和切片操作。
- 支持双精度浮点类型,标签可以设为全 unicode。
- 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。
- 易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
- 高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。
- 使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。
- 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。
- 可以通过服务发现或者静态配置去获取监控的 targets。
- 有多种可视化图形界面。
- 易于伸缩。
2.3 组件
Prometheus 生态圈中包含了多个组件,其中许多组件是可选的:
-
Prometheus Server: 用于收集和存储时间序列数据。
-
Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
-
Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
-
Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
-
Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
-
一些其他的工具。
3. 架构
它大致使用逻辑是这样:
- Prometheus server 定期从静态配置的 targets 或者服务发现的 targets 拉取数据。
- 当新拉取的数据大于配置内存缓存区的时候,Prometheus 会将数据持久化到磁盘(如果使用 remote storage 将持久化到云端)。
- Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert 推送到配置的 Alertmanager。
- Alertmanager 收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
- 可以使用 API, Prometheus Console 或者 Grafana 查询和聚合数据。
4 配置Prometheus
-
#(1). 客户端节点 -----> prometheus所监控的客户端docker01节点、docer02节点 #启动node-exporter ------> 用来采集宿主机信息 docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host #启动cadvisor docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest #(2). Prometheus服务端配置----->(docker03) 安装prometheus和grafana a. 安装配置prometheus tar xf prometheus-2.12.0.linux-amd64.tar.gz cd prometheus-2.12.0.linux-amd64/ #编辑配置文件----> 注意:json格式,注意缩进!! vim prometheus.yml - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node_exporter' static_configs: - targets: ['10.0.0.11:9100','10.0.0.12:9100'] - job_name: 'cadvisor' #自动发现功能 file_sd_configs: #动态 - files: - job/server.json #相对路径 refresh_interval: 10s #在当前路径下创建所需的目录及自动发现配置文件 mkdir job && cd job vim server.json [ { "targets": ["10.0.0.11:8080","10.0.0.12:8080"] } ]
注意:: 每当我们添加一个Target目标是,Endpoint都会生成一个可以URL地址,如果访问不到,他就是DOWN的状态!
此时我只是修改了prometheus的配置文件,添加了8080节点,要想在监控页面看到效果就得重启prometheus,但是啊, 重启会丢数据,所以我们得配
prometheus的自动发现功能!!!
第一次配置动态发现需要重启prometheus服务
[root@docker03 /opt/prometheus-2.23.0.linux-amd64]# ps -ef|grep prome
root 2884 2734 0 14:40 pts/1 00:00:10 ./prometheus
root 3113 2734 0 15:37 pts/1 00:00:00 grep --color=auto prome
[root@docker03 /opt/prometheus-2.23.0.linux-amd64]# kill 2884
# 重启服务
./prometheus --config.file="prometheus.yml" &
# 然后去监控页面查看状态如下! 发现监控端都UP状态了!
配置了prometheus动态发现的话,以后再修改了配置文件就不需要重启服务了!
4.2 安装并配置alertmanger
#1. 安装(我这里使用二进制包安装)
tar xf alertmanager-0.21.0.linux-amd64.tar.gz
[root@docker03 /opt]# cd alertmanager-0.21.0.linux-amd64/
#2. 编辑配置文件 ---->我这里用qq邮件报警的方式!
vim alertmanager.yml
global:
resolve_timeout: 5m #5分钟报警一次
smtp_from: '1737602029@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '1737602029@qq.com'
smtp_auth_password: 'wkjpqcuikiwybddi'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '1737602029@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical' #严重级别报警
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
#3. 启动alertmanager
# alertmanager -h 查看启动方式
./alertmanager --config.file="alertmanager.yml" &
#4. 修改prometheus配置--->告诉他alertmanager的位置并配置报警规则
[root@docker03 /opt/prometheus-2.23.0.linux-amd64]# vim prometheus.yml
# 如下所示
#编写报警规则
[root@docker03 /opt/prometheus-2.23.0.linux-amd64]# vi node_status.yml
groups:
- name: node-up
rules:
- alert: node-up
expr: up{job="node-exporter"} == 0
for: 15s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }} 已停止运行超过 15s!"
浏览器访问监控页面10.0.0.13:9090,发现多了一条报警规则
4.3 安装grafana
解释: 用它来干啥??
以上我们已经配置好了prometheus这个监控功能服务,但是看着不直观啊! 有个效果图是不是会很香!?
所以: 我们来搞一搞grafana,通过他给我们提供更直观的监控!
注意:
-
grafana,如果要想给 没有默认支持的软件做监控,就得装插件
-
grafana要想监控prometheus,就需要prometheus源源不断的给grafana提供数据源
-
grafana有出图模板
#安装grafana
yum localinstall grafana-6.3.3-1.x86_64.rpm -y
systemctl start grafana-server.service
systemctl enable grafana-server.service
#访问grafana http://IP:3000,默认账号admin:admin
新建数据源--导入dashboard模板 -----> 去grafana的官网下载
感受它--->首页样子
- 登录grafana配置
-
添加Prometheus数据源后
-
下面我们给grafana添加模板
访问grafana官方文档: https://grafana.com/grafana/dashboards
- 导入Node-exporter模板图
选择相应的数据类型......
下载模板:
上传模板文件:
选择数据源,导入模板:
效果图:
-
按同样的方法导入一个cadvisor模板图,监控效果如下:
各个容器的基本情况都能看到!这样让监控直观了好多!!!!