预习视频链接: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内核上。
image.png
100虚拟机 100个服务 10宿主机
100容器 100个服务 6宿主机

3:docker-ce的安装

主机名 内存 ip
docker01 2G 10.0.0.11
docker02 2G 10.0.0.12
  1. #安装docker-ce
  2. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  3. wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  4. sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
  5. yum install docker-ce -y
  6. systemctl enable docker
  7. systemctl start docker
  8. #验证
  9. [root@docker01 yum.repos.d]# docker version
  10. Client: Docker Engine - Community
  11. Version: 19.03.5
  12. API version: 1.40
  13. Go version: go1.12.12
  14. Git commit: 633a0ea
  15. Built: Wed Nov 13 07:25:41 2019
  16. OS/Arch: linux/amd64
  17. Experimental: false
  18. #其他机器快捷安装:
  19. vim /etc/yum.conf
  20. #...
  21. keepcache=1
  22. [root@docker01 ]# find /var/cache/yum/ -type f -name "*.rpm"|xargs mv -t docker_rpm
  23. [root@docker01 ]# cd docker_rpm/
  24. [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

image.png

Ps: 使用较少: 可以合并所有的层,直接将容器导出(使用import导入)。

  • 容器的更新

image.png

Ps: 能更新资源限制

容器想要在后台一直运行的话, 那么容器的 初始命令 ,必须夯住(前台运行,如tail -f ),否则容器就会退出,秒死.
所以: 要收集各种服务的前台运行方式 —-> 放在容器中运行

前台运行
例1: nginx -g 'daemon off;'     #daemon off参数会夯在前台
例2: /usr/sbin/php-fpm --nodaemonize  或
            /usr/sbin/php-fpm -F 

#容器和虚拟机最大区别
- 虚拟机不存在初始命令
- 容器初始命令设置不好会造成容器进不去。

7:docker端口映射

  • 端口映射: 为了访问内部网络。

    使用桥接模式 可以不使用端口映射

image.png
例如: 访问 公网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参数 实在外网映射到内网地址的端口上。

QQ图片20210301180738.png

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 查看卷

image.png

小练习: 只启动一个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
image.png
image.png
效果:直接进入时就在网站站点目录
image.png
image.png
Ps: 查看容器在那个卷
QQ图片20210303115649.png
环境变量的方式设定密码 —env
image.png
image.png

根据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

image.png
image.png
查看构建历史
image.png

  • 练习 ```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 之后就多一层
  • 三层镜像示例:

image.png

  • 相同层的不同镜像不会重复导如。

image.png
image.png

 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 镜像:版本 分析那一步占用大

image.png
image.png

  • dockerfile修改能放在后面的就放在后面,相同的部分可以复用,加快构建速度
  • 在最前边做修改的时候,会从头重新构建一个分支

image.png

练习:制作一个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

zabbix-最新版docker自动安装.txt

  • 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

image.png

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仓库功能简单,清理也比较麻烦

image.png

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
    
  • 迁移:

image.png
image.png
image.png

  • 点击【复制】 也可使用该方法复制官方镜像,也可以启动两个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

rule_files:

  • “node-up.rules” ```