Docker 笔记

Docker的基本组成:

        镜像(image):一个只读的模板,镜像可以用于创建docker容器,一个镜像可以创建多个容器;相当于一个root文件系统。

        容器(container):容器是用镜像创建的运行实例;docker利用容器独立运行一个或一组应用,应用程序或服务运行在容器里面,类似于一个虚拟化的运行环境(每个容器都是相互隔离 且保证安全的平台)。

        仓库(repository):集中存放镜像的地方(private和public)。

Docker运行的基本流程:

Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。

1.用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者;

2.Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求;

3.Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式存在;

4.Job的运行过程中,当需要使用容器镜像时,则从Docker Register中下载镜像,并通过镜像管理驱动Graph Driver 将下载的镜像以Graph的形式存储;

5.当需要Docker创建网络环境时,通过网络管理驱动Network Driver创建并配置Docker容器网络环境;

6.当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec Driver来完成;

7.Libcontainer是一项独立的容器管理包,Network Driver以及Exec Driver都是通过Libcontainer来实现具体对容器进行的操作。

CentOs7安装Docker:

安装步骤:

        1. 安装yum-utils包

 yum -y install yum-utils

        2.安装镜像仓库(阿里云)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

        3.重建yum下载索引

yum makecache fast

        4.安装docker

yum -y install docker-ce docker-ce-cli containerd.io

        5.启动docker

systemctl start docker

        6.永远的HelloWorld

docker run HelloWorld

阿里云镜像加速:

Docker常用命令:

1.帮助启动类命令

systemctl start/restart/stop/enable docker

docker info #查看概要信息
docker --help #总体帮助文档
docker 具体命令 --help #命令帮助文档

2.镜像命令

docker images #列出所有镜像文件

-a 列出所有镜像
-q只显示镜像id

REPOSITORY:表示镜像的仓库源 

TAG:表示镜像的标签版本号

MAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

docker search 镜像名 --limit N 显示前N个镜像
docker pull 镜像名 #下载镜像
docker system df #查看镜像/容器/数据卷所占的空间
docker rmi 镜像名/镜像id # 删除镜像 -f 强制删除 (可以删除多个镜像)
docker rmi -f $(docker images -qa) #删除所有镜像

虚悬镜像: 仓库名和标签都是null的镜像

docker run -it 容器名 #启动交互式容器
-i:以交互模式运行容器 通常与-t同时使用
-t:为容器分配一个伪输入终端 通常与-i同时使用
-P 随机端口映射
-p 指定端口映射
-name "名称" #为容器指定一个新名称
-d #后台交互式启动

docker logs 容器id #查看容器日志
docker ps #查看当前正在运行的容器
docker ps -a #查看所有运行记录
docker ps -n N #查看前N条记录

docker inspect 容器id #查看容器内部细节

docker exec -it 容器名 #重新进入容器实例 用exit退出后 容器不会停止//推荐
docker attach -it 容器名 #重新进入容器实例 与上相反

docker cp 容器名:文件路径 目的主机路径

docker export 容器id 文件名.tar #导出容器
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 #导入容器

#提交到本地镜像
docker commit -m="镜像描述" -a="作者" 容器id 镜像用户/镜像名:镜像版本号 

#本地镜像发布到阿里云
见阿里云

ctrl+p+q退出

Docker私服仓库:

#运行私有库
docker run -d -p 5000:5000 -v /aqing/myregistry/:/tmp/registry --privileged=true registry

#默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便宿主机联调

#模拟get请求 查看私有库里面的内容
curl -XGET http://192.168.142.130:5000/v2/_catalog

#将镜像修改成符合私服规范的tag
docker tag wbu/ifconfig:1.2 192.168.142.130:5000/wbu/ifconfig:1.2

#修改配置文件使之支持http
vim /etc/docker/daemon.json
#添加
"insecure-registries":["192.168.142.130:5000"]

#推送镜像到私有库
docker push 192.168.142.130:5000/wbu/ifconfig:1.2
#从私有库拉取镜像
docker pull 192.168.142.130:5000/wbu/ifconfig:1.2

容器数据卷:

推荐:--privileged=true 扩大容器权限解决挂载目录没有权限的问题

数据卷:将docker容器内的数据保存到宿主机的磁盘中

docker run -it --privileged=true -v 宿主目录:容器目录 镜像名 #默认可读可写

特点:

        1.数据卷可以在容器之间共享或重用数据

        2.数据卷中的更改可以直接实时生效

        3.数据卷中的更改不会包含在镜像的更新中

        4.数据卷的生命周期一直持续到没有容器使用它为止

容器卷之间的继承:

第一步:完成容器与宿主机的映射

第二步:继承

docker run -it --privileged=true --volumes-from u1(要继承的容器名) --name=u2 ubuntu(镜像名)

安装Tomcat:

docker pull tomcat #下载最新版

docker exec -it 容器id /bin/bash
#以下操作仅最新版需要
随后将webapps删除.将webapps.dist重命名成webapps

然后访问8080端口

 

 

 安装MySQL(latest):

  1. 确保您已经安装了Docker。如果没有安装,请根据您的操作系统进行安装。

  2. 打开终端或命令提示符,并运行以下命令拉取MySQL 8.0的Docker镜像:

    docker pull mysql
  3. 完成镜像下载后,可以运行以下命令创建并启动MySQL容器:

    docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -p 3306:3306 -d mysql

    其中,mysql-container 是您为容器指定的名称,your_password 是您设置的MySQL root用户的密码。请确保将 your_password 替换为您自己的密码。

  4. 等待一段时间,MySQL容器将会启动。您可以使用以下命令检查容器的运行状态:

    docker ps

    如果看到MySQL容器正在运行,则说明安装成功。

现在,您可以使用MySQL客户端连接到MySQL容器,并开始使用MySQL 8.0。您可以使用以下命令连接到MySQL容器:

docker exec -it mysql-container mysql -uroot -p

然后,输入您在第3步设置的密码即可登录到MySQL。

注意:因为是mysql8 所以分别执行一下两条命令 即可远程连接

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';
flush privileges;

防止使用过程中中文报错:

show variables like 'character%'; 


 

可视化工具执行:

 *通过容器数据卷启动mysql:

docker run -d -p 3306:3306 --privileged=true

-v /aqing/mysql/log:/var/log/mysql 

-v /aqing/mysql/data:/var/lib/mysql 

-v /aqing/mysql/conf:/etc/mysql/conf.d

-e MYSQL_ROOT_PASSWORD=111111

--name=mysql mysql

在/aqing/mysql/conf中新建my.cnf 将以下内容拷贝进去 重启mysql

然后按上述命令自行检查字符编码

[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8

安装Redis:

#拉取redis
docker pull redis

copy一份redis.conf到宿主目录中

#数据卷启动redis
docker run -p 6379:6379 --name myredis --privileged=true -v /aqing/redis/redis7.conf:/etc/redis/redis.conf -v /aqing/redis/data:/data -d redis redis-server /etc/redis/redis.conf

启动后秒退可能是redis.conf配置文件与redis版本不一致
可以通过
docker logs 容器id
查看日志

修改redis.conf
bind一行注释
requirepass一行修改密码
protected一行改为no
daemon一行改为no 避免与docker -d命令冲突

MySQL主从复制:

1.run一个master容器

docker run -p 3307:3306 --name mysql-master
 -v /sqldata/mysql-master/log:/var/log/mysql
 -v /sqldata/mysql-master/data:/var/lib/mysql
 -v /sqldata/mysql-master/conf:/etc/mysql/conf.d
 -e MYSQL_ROOT_PASSWORD=111111
 -d mysql

2.进入/sqldata/mysql-master/conf目录下配置my.cnf

[mysqld]
## 同一局域网内注意要唯一
server-id=1024
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
##二进制日志过期清理时间,默认0表示不自动清理
expire_logs_days=7
##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
#secure_file_priv=/var/lib/mysql
#default_authentication_plugin=mysql_native_password  #设置密码规则
#max_connections=1000 #最大连接数设置 根据实际需要 自行调整

 3.重启mysql-master

 4.进入mysql-master容器

5.创建slave

#创建slave用户
CREATE USER 'slave'@'%' IDENTIFIED BY '111111';

#授权 
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

6.新建从服务器3308

docker run -p 3308:3306 --name mysql-slave -v /sqldata/mysql-slave/log:/var/log/mysql -v /sqldata/mysql-slave/data:/var/lib/mysql -v /sqldata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=111111 -d mysql

7.进入/sqldata/mysql-slave/conf配置my.cnf文件

[mysqld]
## 同一局域网内注意要唯一
server-id=102
## 开启二进制日志功能,以备slave作为其他数据库实例的master时使用
log-bin=mall-mysql-slave1-bin
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
##二进制日志过期清理时间,默认0表示不自动清理
expire_logs_days=7
##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制时间写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具备super权限的用户除外)
read_only=1


#secure_file_priv=/var/lib/mysql
#default_authentication_plugin=mysql_native_password  #设置密码规则
#max_connections=1000 #最大连接数设置 根据实际需要 自行调整

8.重启mysql-slave

9.在主mysql中查看从mysql的状态

show master status;

10.进入mysql-slave容器

11.在从数据库中配置主从复制

change master to master_host='192.168.142.130',master_user='slave',master_password='111111',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=476,master_connect_retry=30;

12.在从数据库中查看主从状态

show slave status \G;

13.在从数据库中开启主从同步

start slave;

14.测试

其他:

SELECT Host, User, plugin from user;

主从复制中
在主机中修改从机的加密方式(毕竟是mysql8)
alter user 'slave'@'%' identified with  mysql_native_password  by '111111';

 

Redis集群(三主三从):

一、搭建

1.开启6台redis服务器

docker run -d --name redis-node-1 --net host --privileged=true -v /redisdata/redis/share/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6381

 

 2.进入redis-node-1 构建集群关系

docker exec -it redis-node-1 /bin/bash

3.进去之后构建主从关系

redis-cli --cluster create 192.168.142.130:6381 192.168.142.130:6382 192.168.142.130:6383 192.168.142.130:6384 192.168.142.130:6385 192.168.142.130:6386 --cluster-replicas 1

 4.查看集群状态

redis-cli -p 6381

cluster info

cluster nodes

 

 二、主从容错切换迁移

1.数据读写存储

redis-cli -p 6381 -c 
# -c 集群

redis-cli -p 6381 
#单机连接
#查看集群信息
redis-cli --cluster check 192.168.142.130:6381

 2.容错切换迁移

master服务器宕机之后 从服务器会作为主服务器顶上去

master恢复后原来的master服务器作为从服务器 作为新master的从服务器

恢复原来的主从关系:

停止新master服务器 让从服务器顶上去 在从新启动新master服务器 此时恢复到原来的主从关系

三、主从扩容

1.新run两个redis服务器

docker run -d --name redis-node-7 --net host --privileged=true -v /redisdata/redis/share/redis-node-7:/data redis --cluster-enabled yes --appendonly yes --port 6387


docker run -d --name redis-node-8 --net host --privileged=true -v /redisdata/redis/share/redis-node-8:/data redis --cluster-enabled yes --appendonly yes --port 6388

2.进入7号机

3.将新增的6387作为master加入集群

redis-cli --cluster add-node 192.168.142.130:6387 192.168.142.130:6381

4.检查集群状态

redis-cli --cluster check 192.168.142.130:6381

5.重新分配槽号

redis-cli --cluster reshard 192.168.142.130:6381

 

6.检查集群状态

 

 7.为6387分配从节点6388

#redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave -cluster-master-id 新主机节点id

redis-cli --cluster add-node 192.168.142.130:6388 192.168.142.130:6387 --cluster-slave --cluster-master-id ec057e566b342e0ba55b6842d63d51d8a5a42bd8

8.检查集群状态

 

四、 主从缩容

先删从机再删主机

redis-cli --cluster del-node 从机ip:端口 从机id

redis-cli --cluster del-node 192.168.142.130:6388 376e3e72be6db64b398cf2f10409054b0308938d

重新分配槽位,将需要删除的节点的槽位全部分配给6381

redis-cli --cluster reshard 192.168.142.130:6381

## 需要分配4096个槽位 6381来接收 6387发送 done 执行 

 

检查集群状态

 删除主节点

redis-cli --cluster del-node 192.168.142.130:6387 ec057e566b342e0ba55b6842d63d51d8a5a42bd8

检查集群状态

 DockerFile:

 Dockerfile是用来构建Docker镜像的文本文件,是有一条条构建镜像所需的指令和参数构成的脚步

Dockerfile基础:

1.每条保留字指令都必须为大写字母且后面至少跟随一个参数

2.指令按照从上到下,顺序执行

3.#表示注释

4.每条指令都会创建一个新的镜像层并对镜像进行提交

Docker执行Dockerfile的大致流程:

1.docker从基础镜像运行一个容器

2.执行一条指令并对容器进行修改

3.执行类似docker commit的操作提交一个新的镜像层

4.docker在基于刚提交的镜像运行一个新的容器

5.执行dockerfile中的下一条指令直到所有指令都执行完成

Dockerfile保留字:

见官网 https://docs.docker.com/engine/reference/builder/

#构建命令
docker build -t 新镜像名:版本号 .

虚悬镜像:

镜像名和版本号都是null的镜像

#查询所有虚悬镜像
docker image ls -f dangling=true

#删除虚悬镜像
docker image prune

Docker部署java项目:

将springboot项目打包成jar部署在docker上面,运行springboot项目

暂时省略。。。。。。

Docker之NetWork(Docker网络):

 docker network  +command、

 

1.bridge(默认桥接 会虚拟出一个docker0网桥 它在内核层连通了其他的物理或虚拟网卡 默认使用docker0 ) 

2.host与宿主机公用网络(此时 端口映射没意义)

3.none (没有任何的网络设置)

4.container (与已经存在的容器共享ip和端口范围,与容器共享ip时 假如提供网络方宕机 继承方则没有ip和端口范围)

#查看指定容器最后20行的信息
docker inspect 容器名 | tail -n 20

自定义网络:

docker network create 网络名

然后在docker run的时候带上 --net 网络名

自定义网络本身就维护好了主机名和ip的对应关系(ip和服务名都能ping通)

Docker-Compose:

负责实现对docker容器集群的快速编排

下载:https://docs.docker.com/compose/install/standalone/

curl -SL https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

 

 

 Compose核心概念:

{        

        一个文件:docker-compose.yml,

        两个要素:{

                服务(service):一个个的应用容器实例,

                工程(project):由一组关联的应用容器组成个一个完整的业务单元,在docker-                          compose.yml文件中定义

        }

}

一个工程=多个服务(容器应用实例)

Comsose使用的三个步骤:

1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件;

2.使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务;

3.最后执行docker-compose up 命令 来启动并运行整个应用容器,完成一键部署上线;

不适用compose存在的隐患:

1.服务启动的先后顺序固定;

2.多个run命令;

3.容器间的宕机或启停,有可能导致ip地址的对应的容器实例变化,映射出错;

使用Docker-Compose:

compose配置

Portanier:

官网:https://www.portainer.io
文档:https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux

#安装
docker run -d  -p 9000:9000 --name portainer --restart=always --privileged=true -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

–restart=always:docker启动或重启即启动该容器

安装Nginx:

CIG监控(cAdvisor+InfluxDB+Grafana):

 

version: '3.9'

volumes: 
 grafana_data: {}

services: 
 influxdb: 
  image: tutum/influxdb:0.9
  restart: always
  environment: 
   - PRE_CREATE_DB=cadvisor
  ports: 
   - "8083:8083"
   - "8086:8086"
  volumes: 
   - ./data/influxdb:/data
   
 cadvisor: 
  image: google/cadvisor
  links:
   - influxdb:influxsrv
  command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
  restart: always
  ports:
   - "8080:8080"
  volumes:
   - /:/rootfs:ro
   - /var/run:/var/run.rw
   - /sys:/sys:ro
   - /var/lib/docker/:/var/lib/docker:ro
  
 grafana:
  user: "104"
  image: grafana/grafana
  restart: always
  links:
   - influxdb:influxsrv
  ports:
   - "3000:3000"
  volumes:
   - grafana_data:/var/lib/grafana
  environment:
   - HTTP_USER=admin
   - HTTP_PASS=admin
   - INFLUXDB_HOST=influxsrv
   - INFLUXDB_PORT=8086
   - INFLUXDB_NAME=cadvisor
   - INFLUXDB_USER=root
   - INFLUXDB_PASS=root

 检查配置并运行

docker-compose config -q
docker-compose up

 

 

 CIG添加panel:

 

new dashboard

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值