- 1.什么是容器
- 2:容器和虚拟机的区别
- 3:docker-ce的安装
- 4:docker主要内容
- 5:docker镜像常用命令
- 6:docker容器的常用命令
- 7:docker端口映射
- 8:docker数据卷
- 9:手动制作docker镜像✨
- 10:自动制作docker镜像
- CMD [“nginx”,”-g”,”daemon off;”]
- !/bin/bash
- 构建:
- 运行
- 测试
- 12:dockerfile的优化
- 13:容器间的互联
- 15:私有仓库docker-registry
- 镜像地址
- 上传镜像
- 16: 企业级私有仓库harbor(docker-compose)
- 17:docker基础网络 ✨
- 18:跨宿主机容器间的通讯之macvlan
- 创建网络
- 启动容器
- PS: 优点: 网络比较简单,网络性能高,
- vim /etc/docker/daemon.json
- systemctl restart docker
- 在任何节点创建网络,都会同步到其他同网段的宿主机上
- 个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网 注意—name 指定不同名字,
- Alertmanager configuration
预习视频链接:https://edu.51cto.com/course/19702.html ( 免费部分)
资料: 1.docker容器.pdf
1.什么是容器
容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理
程序: 代码,软件,命令
进程: 正在运行的程序
2:容器和虚拟机的区别
对比: oldqiang.com/archives/148.h tml
虚拟机: 每个虚拟机有自己的内核 模拟计算硬件,走正常的开机启动
bios开机自检—根据bios启动项—读取硬盘第一个扇区grub,uefi, centos7, 加载内核,启动系统第一个进程/sbin/init systemd
容器: 每个容器公用宿主机内核 不需要硬件cpu的支持, 启动容器的第一个进程
容器优势: 启动快,性能高 (调用内核直接使用的是物理硬件),损耗少,轻量级
容器缺点: 只能使用在linux内核上。
100虚拟机 100个服务 10宿主机
100容器 100个服务 6宿主机
3:docker-ce的安装
主机名 | 内存 | ip |
---|---|---|
docker01 | 2G | 10.0.0.11 |
docker02 | 2G | 10.0.0.12 |
#安装docker-ce
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/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
#其他机器快捷安装:
vim /etc/yum.conf
#...
keepcache=1
[root@docker01 ]# find /var/cache/yum/ -type f -name "*.rpm"|xargs mv -t docker_rpm
[root@docker01 ]# cd docker_rpm/
[root@docker01 ]# tar zcf docker_rpm.tar.gz docker_rpm 打包用于其他机器安装(新机器安装时需要base源)
4:docker主要内容
docker是一个cs架构, docker主要:镜像 容器 仓库 网络 存储 监控
docker是一个软件的打包技术.
[root@docker01 ]# docker run -d -p 80:80 nginx:latest
run 创建并启动一个容器
-d 放后台启动
-p 端口映射
nginx:latest docker镜像名称
5:docker镜像常用命令
docker search 搜索镜像, 优先选官方,stars数量多
docker pull 拉取镜像(下载镜像),注意版本
docker push 推送镜像(上传镜像)
docker image ls 查看镜像列表
docker rmi 删除镜像
docker tag 给镜像打标签
docker load -i 导入镜像
#例子: docker load -i docker_nginx.tar.gz
docker save 导出镜像
#例子:docker save centos:7 -o docker_centos7.tar.gz
6:docker容器的常用命令
docker run 创建并启动容器
例子:docker run -d -it -p 80:80 nginx:latest
#查看容器列表
docker ps
-a 查看所有容器
-q 静默输出
docker create 创建容器 --name
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker kill 强制停止容器
docker rm 删除容器
#批量删除所有容器
docker rm -f `docker ps -a -q`
#进入正在运行的容器(分配一个新终端)
docker exec
例子: docker exec -it 容器id/容器名字 /bin/bash
#Ps:其他进入正在运行的容器(共用一个终端)
docker attach 进入正在运行的容器(使用相同的终端),偷偷离开的快捷键ctrl +p,ctrl +q
#Ps: 补充
docker update
[ root@docker01 ~]# docker container update --memo ry 20--memo ry -swap 20H bold_haibt elastic_kho rana
#跟随docker应用启动
[ root@docker01 ~]#docker run -d --restart=always nginx:latest
#修改启动配置
[ root@docker01 ~]#docker update --restart always bold_haibt
Ps: 使用较少: 可以合并所有的层,直接将容器导出(使用import导入)。
- 容器的更新
Ps: 能更新资源限制
容器想要在后台一直运行的话, 那么容器的 初始命令 ,必须夯住(前台运行,如tail -f ),否则容器就会退出,秒死.
所以: 要收集各种服务的前台运行方式 —-> 放在容器中运行
前台运行
例1: nginx -g 'daemon off;' #daemon off参数会夯在前台
例2: /usr/sbin/php-fpm --nodaemonize 或
/usr/sbin/php-fpm -F
#容器和虚拟机最大区别
- 虚拟机不存在初始命令
- 容器初始命令设置不好会造成容器进不去。
7:docker端口映射
- 端口映射: 为了访问内部网络。
使用桥接模式 可以不使用端口映射
例如: 访问 公网IP: 80端口 ——> 转发到内网某台IP的:80端口
——> 实现互联网访问公司内部某台服务器
#练习准备:
[root@docker01 ~]# docker load -i docker_alpine.tar.gz --导入镜像
[root@docker01 ~]# docker run -it alpine:latest --启动并进入容器
/ #
docker run + ...
-p 宿主机端口:容器端口
-p 宿主机ip1:宿主机端口:容器端口 #多个容器同时使用80端口
-p 宿主机ip1::容器端口 #随机端口映射
示例: [root@docker01 ~]# docker run -d -p 10.0.0.11::80 nginx:latest
-p 宿主机ip1::容器端口/udp #使用udp协议做随机端口映射
-p 80:80 -p 3306:3306 #一个端口可以指定多次映射
-p 1111-1119:1111-1119 #范围性的端口映射
-P(大写) 自动随机端口映射
Ps: 由于虚拟机挂起导致的问题:
net.ipv4.ip_forward = 1 --挂起会导致内核转发参数变为0
解决:
1. 将内核转发参数设置为 1
2. systemctl restart docker
docker restart 容器
Ps:内核参数为0的错误:
[rootadocker01 ~]#docker run -it alpine:latest
ARNING: IPv4 forwarding is disabled. Networking will not work
/#
- 使用 -p参数 实在外网映射到内网地址的端口上。
8:docker数据卷
-v 宿主机绝对目录:容器目录 #直接把宿主机的dir挂载到容器,适合web集群的静态资源共享
docker run -d -p 81:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
-v 卷名:容器目录 #将容器产生的数据保存到宿主机的创建的卷名上
docker run -d -p 3306:3306 -v mysgl_db:/var/lib/mysql mysql:5.7
-v 容器目录 #创建一个随机卷(/var/lib/docker/volumes/下),适合保存变法的数据例如: 访问日志,来持久化容器的目录下的数据
--volumes-from #跟某一个容器挂载所有相同的卷
-v /test:/usr/share/nginx/html 可以不创建,申明的同时帮助你创建
[root@ESC01 ~]# docker volume ls 查看卷
小练习: 只启动一个nginx容器,要求访问80端口,出现nginx默认欢迎首页,访问81端口,出现小鸟飞飞.
#方法1:
[root@docker01 opt]# docker run -d -p 80-81:80-81 -v /opt/xiaoniao:/code nginx:latest
[root@docker01 opt]# docker exec -it a5627a793e44 /bin/bash
[root@docker01 opt]# cd /etc/nginx/conf.d
root@26779e9237ad:/# echo ' server {
listen 81;
server_name localhost;
location / {
root /code;
index index.html index.htm;
}
}' >xiaoniao.conf
root@26779e9237ad:/# exit
[root@docker01 opt]# docker restart a5627a793e44
#方法2:
docker run -d -p 82-83:80-81 -v /opt/xiaoniao:/code nginx:latest
echo ' server {
listen 81;
server_name localhost;
location / {
root /code;
index index.html index.htm;
}
}' >xiaoniao.conf
docker container cp xiaoniao.conf 3ca76d326ec3:/etc/nginx/conf.d
docker restart 3ca76d326ec3
#方法3:
docker run -d -p 84-85:80-81 -v /root/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /opt/xiaoniao:/code nginx:latest
PS: 方法3先准备好文件和代码。 需要宿主机和容器内, -v 容器对容器,-v目录对目录
9:手动制作docker镜像✨
制作一个基于centos系统的nginx镜像(单服务)
1:启动一个纯净的centos:6.9容器,安装nginx
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
yum install nginx -y
2:把安装好服务的容器,提交为镜像
docker container commit eb109f194821 centos6.9_nginx:v1
3:测试镜像的功能
docker run -d -p 82:80 centos6.9_nginx:v1 nginx -g 'daemon off;'
制作一个基于centos7系统的kod网盘的镜像(多服务)
#基于cenos7_nginx容器安装sshd服务,并制作成centos7_nginx_sshd镜像
#启动镜像
[root@docker01 ~]# docker run -it -p 80:80 -p 1022:22 centos7_nginxv1.0 /bin/bash
#安装sshd服务
[root@a1732d0c0b88 /]# yum install openssh-server -y
[root@a1732d0c0b88 /]# yum install initscripts -y
[root@a1732d0c0b88 /]# /usr/sbin/sshd-keygen
[root@a1732d0c0b88 /]# /usr/sbin/sshd
#制作带sshd的镜像(新开窗口):
[root@docker01 ~]# docker commit a1732d0c0b88 centos7_ngx_ssh:v1
#配置启动脚本
[root@docker01 ~]# mkdir /doc_dir
[root@docker01 ~]# vim /doc_dir/init.sh #注意最后一条命令需要前台运行
#!/bin/bash
nginx
/usr/sbin/sshd -D
#启动测试:
[root@docker01 ~]# docker run -d -p 80:80 -p 1022:22 -v /doc_dir:/opt/ centos7_ngx_ssh:v1 /bin/bash /opt/init.sh
#ps:配置文件建议使用docker cp配置到宿主机内命令
10:自动制作docker镜像
镜像: 中药
dockerfile: 配方
dockerfile常用指令
FROM 基础镜像
RUN 制作镜像过程中需要的执行命令(安装服务)
CMD 容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD 把dockerfile当前目录下的文件拷贝到容器中 #(自动解压tar包)
COPY 把dockerfile当前目录下的文件拷贝到容器中 #(不解压tar包)
WORKDIR 指定容器的默认工作目录(类似cd)
EXPOSE 镜像要暴露的端口(docker run -P时容器内指定映射端口)
VOLUME 持久化卷(#自动创建随机名字的卷 来保存容器内产生的文件)
ENV #环境变量(ssh的密码,数据库的密码,二进制配置环境变量的时候使用)
LABEL 镜像的属性标签
MAINTAINER 管理者标识
Ps: 指定工作目录 workdir
效果:直接进入时就在网站站点目录
Ps: 查看容器在那个卷
环境变量的方式设定密码 —env
根据dockerfile自动构建镜像的思路
a:手动制作docker镜像,记录历史命令
b:根据历史命令编写dockerfile文件
c:docker build 构建docker镜像
d:测试镜像的功能
#dockerfile run 运行远原理:
run 执行一个命令
生成一个临时镜像,运行cmd,制作成临时镜像,在基于这个临时镜像执行下一个run任务,删除零时镜像。
#回收ctrl +c产生的临时镜像
[root@docker01 centos:7_ngx]# docker image prune
dockerfile单服务例子1:
[root@docker01 ] mkdir -p /opt/dockerfile/centos:7_ngx
[root@docker01 ] cd /opt/dockerfile/centos:7_ngx
[root@docker01 centos:7_ngx]# cat dockerfile #--文件名必须是dockerfile
FROM centos:7
#RUN echo '192.168.19.200 mirrors.aliyun.com' >>/etc/hosts
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://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 install nginx -y
RUN rm -fr /usr/share/nginx/html/index.html
RUN echo 'oldboy' >/usr/share/nginx/html/index.html
#CMD nginx -g 'daemon off;'
CMD ["nginx","-g","daemon off;"]
#buil镜像操作:
[root@docker01 centos:7_ngx]# docker build -t c_nginx:v1 ./
[root@docker01 centos:7_ngx]# docker build --network host -t c_nginx:v1 ./ #--网络不好时使用宿主机网络
docker run -d -p 80:80 centos7_ngx:v1
docker ps -a -l
PS: 注意: 不可使用夯住的命令, 不可使用交互式命令,会导致构建失败。
dockerfile多服务例子2:lnmp-kod云
FROM centos7_nginx:v1
RUN yum install php-fpm php-gd php-mbstring -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
RUN mkdir /html
WORKDIR /html
RUN curl -o kodexplorer4.40.zip http://192.168.19.200/191127/kodexplorer4.40.zip
RUN yum install unzip -y
RUN unzip kodexplorer4.40.zip
RUN chown -R nginx:nginx .
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
vi /init.sh
#!/bin/bash
service php-fpm start
nginx -g 'daemon off;'
dockerfile使用环境变量的例子:
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 install nginx openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
ADD init.sh /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]
vi init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
SSH_PWD=$1
fi
echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D
dockerfile-ADD制作基础系统镜像:
wget https://mirror.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.13/amd64/default/20210302_13%3A09/rootfs.tar.xz
[root@docker01 al]# tar xf rootfs.tar.xz
[root@docker01 al]# rm rootfs.tar.xz -rf
查看构建历史
- 练习 ```javascript [root@docker01 centos:7_ngx]# cat dockerfile FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://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 install nginx openssh-server initscripts -y RUN /usr/sbin/sshd-keygen && /usr/sbin/sshd RUN echo ‘123456’|passwd —stdin root RUN rm -rf /usr/share/nginx/html/index.html
COPY code/ /usr/share/nginx/html/ ADD init.sh /init.sh
CMD [“nginx”,”-g”,”daemon off;”]
CMD [“/bin/bash”,”/init.sh”]
[root@docker01 centos:7_ngx]# cat code/index.html test_docker_nginx+sshd
[root@docker01 centos:7_ngx]# cat init.sh
!/bin/bash
nginx /usr/sbin/sshd -D
构建:
docker build —network host -t centos7_nginx_sshd:v1.1 ./
运行
docker run -d -p 80:80 -p 1022:22 centos7_nginx_sshd:v1.1
测试
docker ps ssh root@10.0.0.11 -p 1022 curl 10.0.0.11:80
<a name="f1RXe"></a>
# 11:docker镜像的分层(复用,节省空间)
```javascript
#优点
1.节省本地磁盘
2.上传,下载镜像更快
- 每次执行docker commit 之后就多一层
- 三层镜像示例:
- 相同层的不同镜像不会重复导如。
vim /etc/docker/daemon.json
systemctl restart docker
vim /etc/docker/daemon.json
systemctl restart docker
systemctl reset-failed docker.service
systemctl start docker.service
ls /opt/data/
docker ps -a
docker images
docker info
cat /etc/docker/daemon.json
12:dockerfile的优化
a: 使用体积小的linux镜像alpine
b:尽可能的清理无用的缓存文件(尽可能把多个RUN合并)
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时不需要的文件(加速构建)
#Ps:
alpine 5M+ + nginx 20M linux c语言精简编译器musl libc
centos 200M +nginx 400M linux c语言标准编译器glibc
ubuntu 7OM+
#使用
centos/ redhat yum rpm
ubuntu/ debian apt deb
suse/ opensuse zypper rpm
alpine apk
apk update
apk add nginx
aline简单体验
/ # sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories / # apk update / # apk add nginx / # nginx / # mkdir /run/nginx/ / # nginx / # nginx -v
大小对比: [root@docker01 ~]# docker commit 8265741a315d alpine_nginx:v1 [root@docker01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE alpine_nginx v1 3e8269788f71 11 seconds ago 9.01MB centos7_nginx_sshd v1.1 eb446eca739c 4 hours ago 704MB
dockerfile 优化:步骤精简 能合并的合并 能清缓存清缓存
- docker history 镜像:版本 分析那一步占用大
- dockerfile修改能放在后面的就放在后面,相同的部分可以复用,加快构建速度
- 在最前边做修改的时候,会从头重新构建一个分支
练习:制作一个dockerfilekod镜像并尽量精简
#制作思路:
1. docker pull 一个镜像模板
2. docker run 运行镜像手动安装服务
3. 在容器中调试服务
4. 调试成功,执行history,精简步骤。
5. 基于history编写dockerfile vi---> ADD
6. docker build 制作镜像..
13:容器间的互联
- -e —> -env
- 官方镜像,启动命令,通过entrypoint的方式,传入参数,直接拉起zabbix服务。
```javascript
docker run —link 正在运行容器的名字(单方向)
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
<a name="BjrmD"></a>
# 14:单机版的容器编排docker-compose
- docker-compose : 容器编排,批量管理一组容器的方法
- 多机版的容器编排-------> K8s
- 批量管理一组容器很多业务
一个业务,往往需要一组容器来支撑<br />单机 ssh安装服务<br />集群批量安装服务ansible yaml
- yum install docker-compose -y(需要epel源)
```javascript
version: '3'
services:
mysql-server:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_pwd
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
command: --character-set-server=utf8 --collation-server=utf8_bin
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:latest
restart: always
zabbix-server:
depends_on:
- mysql-server
image: zabbix/zabbix-server-mysql:latest
restart: always
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
MYSQL_ROOT_PASSWORD: root_pwd
ZBX_JAVAGATEWAY: zabbix-java-gateway
ports:
- "10051:10051"
zabbix-web-nginx-mysql:
depends_on:
- zabbix-server
image: zabbix/zabbix-web-nginx-mysql:latest
ports:
- "80:80"
restart: always
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
MYSQL_ROOT_PASSWORD: root_pwd
- wordpress 一键安装 ```javascript version: ‘3’
services: db: image: mysql:5.7 volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress: depends_on:
- db
image: wordpress:latest
volumes:
- web_data:/var/www/html
ports:
- "80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes: db_data: web_data:
> docker-compose up 创建并启动 (-d 后台启动)
> docker-compose start 全部启动
> docker-compose stop 全部停止
> docker-compose restart
> docker-compose down 停止并删除卸载
> docker-cormpose scale zabbix-java-gateway=3
- 练习: docker三条命令启动wordpress
```javascript
[root@docker01 worpress]# ll
total 407528
-rw-r--r-- 1 root root 605 Mar 4 11:49 docker-compose.yml
-rw-r--r-- 1 root root 417304064 Feb 28 11:05 wordpress-latest.tar.gz
[root@docker01 worpress]# vim docker-compose.yml
[root@docker01 worpress]# docker load -i wordpress-latest.tar.gz #镜像自行准备
[root@docker01 worpress]# docker-compose up
15:私有仓库docker-registry
- 不管是共有还是私有
- 两部上传镜像: 1. 打标签 2. 上传 ```javascript
镜像地址
官方仓库的官方镜像 nginx:1.15
官方仓库的用户镜像 usrxxx/nginx:1.15
私有仓库的镜像 daocloud.io/nginx/nginx:1.15
上传镜像
docker tag alpine:3.9 10.0.0.12:5000/alpine:3.9 docker image push 10.0.0.12:5000/alpine:3.9
- 搭建仓库并上传镜像
```javascript
#启动私有仓库
[root@docker02 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
---------------------------------------------------------------------------------------------------------
#第一次上传镜像会报错
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12:5000"]
}
#ps: 第一行:镜像加速 第二行: 信任这个地址,能走http协议。
[root@docker01 ~]# systemctl restart docker
[root@docker01 ~]# docker image push 10.0.0.12:5000/alpine:3.9
#下载镜像
[root@docker01 ~]# docker image pull 10.0.0.11:5000/alpine:3.9
#往官方仓库上传:
1. docker login #--输入个人账户密码登录
2. docker tag alpine_kod:v1 457801170/kod:v1
3. docker push 457801170/kod:v1
- registry仓库功能简单,清理也比较麻烦
16: 企业级私有仓库harbor(docker-compose)
#下载安装器
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
#修改配置文件
cd harbor
vim harbor.yml
hostname: 10.0.0.11
harbor_admin_password: 123456
#执行安装脚本
./install.sh
###为harbor配置https证书
#修改harbor.yml ---需要注意:yml缩进错误会影响启动。
#配置域名
hostname: blog.oldqiang.com
#配置证书
https:
port: 443
certificate: /opt/certs/nginx/1_blog.oldqiang.com_bundle.crt
private_key: /opt/certs/nginx/2_blog.oldqiang.com.key
#重新执行安装脚本
./install.sh
- 修改配置文件(harbor.yml) 需要重新安装(./install.sh)
重启docker会导致huber某些容器启动失败,客户端登录失败。
解决: vim install.sh --> 搜索docker load -i ... 注释<br /> 执行: ./install.sh
迁移:
点击【复制】 也可使用该方法复制官方镜像,也可以启动两个harber用于主从同步。
17:docker基础网络 ✨
四种基础网络类型
bridge 默认类型 (实际是 NAT模式,需要 -p 做端口映射) host host类型 (使用宿主机网络,网络性能最高--共用:直接使用宿主机的主机名,ip地址,端口) container 容器类型 (使用其他容器共用网络,k8s中使用广泛) none 没有网络,上不了外网
创建自定义网络
docker network create -d bridge --subnet 172.30.0.0/16 --gateway 172.30.0.1 oldqiang
18:跨宿主机容器间的通讯之macvlan
macvlan类似与虚拟机的桥接网络 ```javascript
创建网络
docker network create -d macvlan —subnet 10.0.0.0/24 —gateway 10.0.0.2 -o parent=eth0 macvlan_1
启动容器
docker run -it —network macvlan_1 —ip 10.0.0.105 alpine:latest
PS: 优点: 网络比较简单,网络性能高,
缺点: 大规模管理不太合适,容易造成ip冲突,相同网段访问方便,但不能ping自己。
<a name="6Kp1R"></a>
# 19:跨宿主机容器间的通讯之overlay(重叠网络)
> Vxlan的实现原理:
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1581532/1614916075282-62246582-bcff-459d-a206-874443f5bab6.png#align=left&display=inline&height=406&margin=%5Bobject%20Object%5D&name=image.png&originHeight=812&originWidth=1840&size=71780&status=done&style=none&width=920)
- docker03上: consul存储ip地址的分配
```javascript
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
- docker01、02上:
```javascript
vim /etc/docker/daemon.json
{ “cluster-store”: “consul://10.0.0.13:8500”, “cluster-advertise”: “10.0.0.11:2376” }
systemctl restart docker
1.创建overlay网络
在任何节点创建网络,都会同步到其他同网段的宿主机上
[root@docker01 ~]# docker network create -d overlay —subnet 172.26.0.0/16 —gateway 172.26.0.1 ol1 [root@docker01 ~]# docker network ls [root@docker02 ~]# docker network ls
2.启动容器测试 [root@docker01 ~]# docker run -it —network ol1 —name oldboy01 alpine:latest /bin/sh [root@docker02 ~]# docker run -it —network ol1 —name oldboy02 alpine:latest /bin/sh / # ping oldboy01 PING oldboy01 (172.26.0.2): 56 data bytes 64 bytes from 172.26.0.2: seq=0 ttl=64 time=1.441 ms
个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网 注意—name 指定不同名字,
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1581532/1614927039566-fac7c251-c827-443f-b491-4ec293f9b052.png#align=left&display=inline&height=117&margin=%5Bobject%20Object%5D&name=image.png&originHeight=235&originWidth=1502&size=177041&status=done&style=none&width=751)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1581532/1614929052419-d44c2903-1a29-47b2-a37e-1eb7cb8a538c.png#align=left&display=inline&height=325&margin=%5Bobject%20Object%5D&name=image.png&originHeight=650&originWidth=1374&size=441318&status=done&style=stroke&width=687)
<a name="3cn8R"></a>
# 20: docker容器的监控
- prometheus
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1581532/1614931628299-f615333e-4b56-4bb3-88b2-6fb8b49cc260.png#align=left&display=inline&height=325&margin=%5Bobject%20Object%5D&name=image.png&originHeight=650&originWidth=1579&size=163020&status=done&style=stroke&width=789.5)
```javascript
#客户端节点
#启动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
#prometheus节点
安装prometheus和grafana
[root@docker03 ]# tar xf prometheus-2.12.0.linux-amd64.tar.gz
[root@docker03 ]# cd prometheus-2.12.0.linux-amd64/
[root@docker03 prometheus]# vim prometheus.yml
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'cadvisor'
static_configs:
- targets: ['10.0.0.11:8080','10.0.0.12:8080']
- job_name: 'node_exporter'
static_configs:
- targets: ['10.0.0.11:9100','10.0.0.12:9100']
./prometheus --config.file="prometheus.yml"
#添加新的target后需要重启
#安装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模板
#自动发现:
vim prometheus.yml
#...
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'cadvisor'
file_sd_configs:
- files:
- /opt/prometheus/discovery/discovery_cadvisor.yml
refresh_interval: 10s
- job_name: 'node-exporter'
file_sd_configs:
- files:
- /opt/prometheus/discovery/discovery_exporter.yml
refresh_interval: 10s
- 基于文件的动态发现:
[root@oldboy ~]# cat /opt/prometheus/discovery/discovery_cadvisor.yml
[
{
"targets": ["10.0.0.11:8080","10.0.0.12:8080"]
}
]
- 配置报警规则: ```javascript prometheus报警规则 vim node-up.rules 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!”
…
Alertmanager configuration
alerting: alertmanagers:
- static_configs:
- targets:
- 10.0.0.13:9093
- targets:
rule_files:
- “node-up.rules” ```