docker的使用
目录
一.安装
1.脚本方式安装
获取安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
2.运行安装脚本
sh get-docker.sh
3.启动docker并开启自启
systemctl restart docker
systemctl status docker
systemctl enable docker
4.查看docker信息
docker info
5.查看docker镜像列表
docker images
比如redis:https://hub-stage.docker.com/search?q=redis
6.设置docker镜像源
加速器地址 :https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
1.阿里云控制台搜索容器镜像服务
2.进入容器镜像服务, 左侧最下方容器镜像服务中复制加速器地址
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
参考:https://www.php.cn/faq/538357.html
二.docker用命令
1.Docker命令
docker images 查看docker镜像列表
docker run 镜像名 运行镜像
docker ps 查看当前启动的容器,增加-a 参数查看包括停止的实例
docker stop 容器ID 停止一个容器
docker start 容器ID 启动一个已经停止的容器实例
docker restart 容器ID 不管容器是否启动,直接重启容器
docker rm 容器ID 删除实例
docker rmi 镜像名 删除镜像
docker pull 镜像名 下载镜像
docker kill 容器ID 直接关闭容器
docker info 查看容器信息,包括镜像源
docker image inspect 镜像id 查看镜像详情信息
docker search 名称 模糊搜索镜像
docker logs 容器id 查看容器日志
sudo systemctl restart docker重启docker
systemctl status docker 查看容器状态
docker inspect 容器id 查看容器详情信息,重点看Mounts那一部分,容器内Destination的值挂载到宿主机Source的值中
docker exec -it 容器ID /bin/bash 进入正在运行的docker容器里面
三.docker安装redis
1.获取 redis 镜像
docker pull redis
不加版本号默认获取最新版本,也可以使用 docker search redis 查看镜像来源
下载后可以使用docker images命令查看镜像文件
2.创建本机redis配置文件挂载目录
mkdir -p /usr/local/redis/conf
3.修改默认配置文件
从官网http://download.redis.io/redis-stable/redis.conf获取redis.conf
bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程(可选),改为yes会使配置文件方式启动redis失败
dir ./ #输入本地redis数据库存放文件夹(可选)
appendonly yes #redis持久化(可选)
并上传到挂载目录下
4.执行命令
docker run --name redis --restart=always -p 6379:6379 -v /usr/local/redis/conf:/etc/redis -v /usr/local/redis/data:/data -d redis redis-server /etc/redis/redis.conf --requirepass "123456" --appendonly yes
命令解释说明:
--name redis //指定该容器别名
--restart=always //随docker启动
-p 6379:6379 //端口映射:前表示主机部分,:后表示容器部分。
-v //挂载目录,规则与端口映射相同。
-d redis //后台模式启动redis,后面还有参数,不能放在前面
redis-server /etc/redis/redis.conf //以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/usr/local/redis/conf/redis.conf
--requirepass "123456" //设置密码为123456
--appendonly yes //开启redis的AOF持久化,默认为false,不持久化
使用docker ps 查看redis已经运行了
使用 docker exec -it redis /bin/bash进入redis
使用 redis-cli 可以测试连接
四.docker搭建Redis哨兵模式-单台服务器
1.拉取redis.conf文件
放在自定义的目录下:wget -c http://download.redis.io/redis-stable/redis.conf
2.运行实例
--name:自定义启动容器名称
-v 主机redis.conf 和redis容器做映射
-d 后台启动
-p 端口映射 6379是redis端口 27000是哨兵端口 redis:镜像名称
docker run --name redis_3 -v /usr/local/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6381:6379 -p 27002:27000 redis
docker run --name redis_2 -v /usr/local/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6380:6379 -p 27001:27000 redis
docker run --name redis_1 -v /usr/local/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 -p 27000:27000 redis
3.测试单机
docker exec -it 容器id /bin/bash
docker exec -it ac23cca1c700 /bin/bash
执行redis-cli进入redis,输入:info 命令显示都是master,因为现在刚创建出来都是单机的
4.手动设置主从关系
这里使用到的IP是容器里的IP,可以通过:docker inspect redis_1查看容器映射出来的ip。
我们这里把redis_1设置为主,redis_2,redis_3设置为从。
进入redis_2容器,打开redis-cli,输入 SLAVEOF IP PORT
即可完成主机的绑定,再次执行INFO命令就可以看到角色发生了变化,且主机也显示了
redis_3也这样执行。
执行完我们进入redis_1中,执行INFO可以看到主从关系已经生效:
5.测试主从关系
在redis_1中执行set命令,我们去redis_2,redis_3中看下能否获取到。
这里需要注意的一点,SLVAE角色的redis只能读取不能set的。 只有master才能读写。
6.在主从集群的基础上搭建哨兵模式
1.进入三个redis容器,在容器的根目录下创建sentinel.conf文件。vim sentinel.conf。写入以下配置:
容器内先安装vim
apt-get update
apt-get install -y vim
port 26381 #哨兵端口号 一定要和启动命令映射第二个端口号一致 26379 26380 26381
daemonize yes #后台启动
sentinel monitor master_redis 主节点ip 主节点端口 2 #这里的ip也是master容器映射出来的ip 端口是master映射到外面的端口 6379 最后的2表示 有2两个哨兵
2: 执行这个配置文件:redis-sentinel sentinel.conf
查看运行的sentinel进程:在容器里安装ps命令,apt-get install procps
安装成功之后,ps -ef 看到sentinel进程已经启动了。
可以看到三个容器的哨兵进程都启动了
参考:https://www.cnblogs.com/krock/p/14283469.html
五.docker搭建Redis哨兵模式
Redis Sentinel
,即Redis
哨兵,在Redis 2.8版本开始引入。能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库,既故障转移。
为了哨兵的高可用性,常以哨兵集群形式搭建哨兵,如下是三个哨兵组成的集群:
1.哨兵的功能
根据官方文档的介绍:
- 监控(
Monitoring
):哨兵会不断地检查主节点和从节点是否运作正常。 - 自动故障转移(
Automatic failover
):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。 - 配置提供者(
Configuration provider
):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。 - 通知(
Notification
):哨兵可以将故障转移的结果发送给客户端。
2.配置哨兵
编写哨兵模式配置文件sentinel.conf(在redis的bin 目录下有一个redis.sentinel文件,这个文件用于启动哨兵的配置文件),wget http://download.redis.io/redis-stable/sentinel.conf
准备三个配置文件,修改三个文件监听端口为port 27000, port 27001, port 27002
# 关闭保护模式
protected-mode no
# 哨兵的监听端口
port 27000
# 让sentinel服务后台运行(docker的话需要设置为no,非docker运行设置为yes, 因为docker有个-d属性就是让在后台运行的)
daemonize no
# 当Redis哨兵以守护进程的方式运行的时候,默认会把pid文件放在/var/tmp/sentinel1.log,也可以配置到其他地址,多个哨兵需要重命名文件。
pidfile /var/run/redis-sentinel.pid
loglevel notice
#日志文件的路径
logfile "./sentinel.log"
#sentinel的工作目录
dir "/tmp"
# 哨兵sentinel监控的redis主节点的
## ip:主机ip地址.注:如果在一个机器里创建多个容器,ip为容器的ip,如果在不同机器上,则为机器的ip地址)
## port:哨兵端口号
## master-name:可以自己命名的主节点名字(只能由字母A-z、数字0-9 、这三个字符".-_"组成。)
## quorum:当这些quorum个数sentinel哨兵认为master主节点失联,那么这时客观上认为主节点失联了,就进行failover(故障转移),
## 选举过程中,超过或等于这个票数的主节点变成被认为客观下线,从节点被选举为主节点。
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 当在Redis实例中开启了requirepass <foobared>,所有连接Redis实例的客户端都要提供密码。
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
#超过30秒master还没有连接上,则认为master已经停止
sentinel down-after-milliseconds mymaster 30000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
#设置故障转移超时时间
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
3.启动哨兵
指定配置文件目录映射
[root@localhost conf]# docker run -p 27000:27000 \
--name sentinel1 \
-v /usr/local/redis/conf:/usr/local/etc/redis \
-d redis redis-sentinel /usr/local/etc/redis/sentinel1.conf
[root@localhost conf]# docker run -p 27001:27001 \
--name sentinel2 \
-v /usr/local/redis/conf:/usr/local/etc/redis \
-d redis redis-sentinel /usr/local/etc/redis/sentinel2.conf
[root@localhost conf]# docker run -p 27002:27002 \
--name sentinel3 \
-v /usr/local/redis/conf:/usr/local/etc/redis \
-d redis redis-sentinel /usr/local/etc/redis/sentinel3.conf
查看哨兵启动成功
[root@localhost conf]# docker ps
4.进入哨兵
可以看到哨兵的状态是正确的,发现了1个主节点,2个从节点,3个哨兵。
[root@localhost conf]# docker exec -it sentinel3 /bin/bash
root@3222f481fa01:/data# redis-cli -p 27000
127.0.0.1:27000> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.xxxx.xxxx:6379,slaves=2,sentinels=3
查看哨兵日志
[root@localhost conf]# docker exec -it sentinel1 bash
root@d289ca792587:/data# cat ./sentinel.log
哨兵搭建参考:
docker 搭建简单的Redis哨兵模式(接redis主从复制) - 简书
https://zhuanlan.zhihu.com/p/647382777
利用docker搭建redis哨兵模式_幻想变成有钱人的小吴的博客-CSDN博客
六.docker安装ORACLE19C
1998年Oracle8i:i指internet,表示oracle向互联网发展,8i之前数据库只能对应1个实例
2001年Oracle9i:8i的升级,性能更佳,管理更人性化
2003年Oracle10g:g指grid,表示采用网格计算的方式进行操作,性能更好
2007年Oracle11g:10g的稳定版本,目前公司里面最常用
2013年Oracle12c:c指cloud,表示云计算,支持大数据处理
2018年Oracle18c:部分工作自主完成,减少手动操作的工作量
2019年Oracle19c:是12c和18c的稳定版本
1.下载镜像
到 https://hub.docker.com 搜索合适的镜像,这里选择banglamon/oracle193db:19.3.0-ee。
拉取镜像
docker pull banglamon/oracle193db:19.3.0-ee
这里走了点弯路,这个镜像安装后实例无法正常启动,而且挂载的目录下面没有生成文件,想办法启动以后sqlplus能用,但容器外部连接报ora-15214错误搞不定了,所以参考这位同学的教程换了个镜像。Docker安装Oracle19c史上最全步骤(图文并茂)_程序猿的Code日常的博客-CSDN博客_docker安装oracle19c
#拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
2.创建挂载目录
# 创建目录
mkdir -p /mydata/oracle/oradata
# 授权
chmod 777 /mydata/oracle/oradata
重新安装oracle时记得删除这个目录,重新建和授权
3.安装
docker run -d \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=ORCL \
-e ORACLE_PDB=ORCLPDB \
-e ORACLE_PWD=123456 \
-e ORACLE_EDITION=standard \
-e ORACLE_CHARACTERSET=AL32UTF8 \
-v /mydata/oracle/oradata:/opt/oracle/oradata \
--name oracle19c \
registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
ORACLE_PWD是密码,安装时间比较长,过程中可以通过日志监控安装情况
docker logs -ft oracle19c
看到如上图结果,就安装完成了。
4.连接oracle
#打开容器终端
docker exec -it oracle19c /bin/bash
#sqlplus登录
#sysdba身份登录,默认进入CDB
sqlplus / as sysdba
#进入CDB
sqlplus system/orcl@localhost:1521/orcl
#进入PDB
sqlplus pdbadmin/orcl@localhost:1521/orclpdb
#查看连接模式
SQL>show con_name
登录网页管理端 https://ip:5500/em
由于安装时启用了容器,需要把端口号后面的:换成/,后面的sid名换成pdb名。
Navicat连接
Oracle ORA-28547:connection to server failed,probable Oracle Net admin error问题解决
5.ORACLE数据库管理-pdb用户、权限管理
Oracle 12C后引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
cdb相当于操作系统,调用并管理各个pdb。pdb相当于真正提供业务需求的数据库实例。oracle 12c安装后只创建了cdb,需要自己生成相应的pdb。oracle 12c使用了CDB-PDB架构,类似于docker,在container-db内可以加载多个pluggable-db.
1、COMMON USERS普通用户(用户名以C##或c##开头)仅建立在CDB层;建立在PDB层会报错ORA-65094: invalid local user or role name
create user C##TEST identified by test container=all;
grant create session to C##TEST;
grant create session to C##TEST container=all;
-- PDB普通用户
create user test identified by 1;
grant connect,resource to test;
alter user test default tablespace USERS;
grant unlimited tablespace to test;
-- CDB公共用户
create user C##rede identified by 1;
grant connect,resource to C##rede;
alter user C##rede default tablespace DEFTBS;
grant unlimited tablespace to C##rede;
2、LOCAL USERS本地用户仅建立在PDB层,建立的时候必须指定CONTAINER;建立在CDB层会报错ORA-65096: invalid common user or role name
3、CDB建立的C##用户可以在PDB查看到,即CDB中创建公用用户默认情况下是在所有PDB下创建了相同的用户
4、用户权限在CDB和PDB中是隔离的,也就是说在CDB中的权限不会同步到PDB,除非在CDB中授权时加上container=all,则在CDB中授权的权限会同步到PDB,在PDB中授权后权限也不会同步到CDB,在PDB中授权不能加container=all,否则会报错ORA-65040: operation not allowed from within a pluggable database
自己的测试:
登录system用户,在navicat中执行创建用户的语句,注意,普通用户不能创建CDB用户和授权
create user C##test001 identified by 123456;
grant dba to C##test001;
5、CDB建立的C##用户可以在PDB登录,但是有两个前提,一是要在PDB中单独授权,二是要加上PDB对应的tns。不加tns默认连接的是CDB
6、CDB删除C##用户时,就算PDB中该用户的权限和CDB不一样,该用户也自动在PDB中也删除了,PDB无法直接删除C##用户,会报错ORA-65040: operation not allowed from within a pluggable database
7、PDB中已经有C##test1用户时,PDB还可以建立test1
8、sys和system用户是普通用户,是全局的,所以直接在PDB中conn sys、system用户时不加PDB的tns,默认连接到CDB;sys、system的密码只能在CDB修改且新密码会自动在PDB生效,PDB修改sys、system密码会报错
6.给C##的用户分配表空间
1.首先使用system用户,在CDB容器下创建表空间
#创建表空间
create tablespace TSDAT01 datafile 'D:\Tools\Oracle19c\tablespace\TSDAT01.dbf' size 50m autoextend on next 50m maxsize 20480m extent management local;
2.创建用户并设置表空间
create user C##GRC3_GDJZ_V2 identified by 123456 default tablespace TSDAT01;
执行时可能会出现ORA-00959: 表空间 'TSDAT01' 不存在
重启oracle服务,alter user C##GRC3_GDJZ_V2 default tablespace TSDAT01
重启后出现:ORA-01109 数据库未打开,解决如下
cmd连上sqlplus ,sqlplus / as sysdba
查看pdbs状态show pdbs,发现要连接的数据库的open mode为mounted
修改数据库状态alter pluggable database databasename open
再次查看pdbs状态show pdbs,看到数据库已经为read write状态,问题已解决
相关概念:
一个Oracle数据库是由一个或多个表空间组成的,在表空间中存储数据文件。
Oracle默认的表空间有6个 system sysaux undotbs1 temp users EXAMPLE
EXAMPLE:用于安装Oracle11g 数据库使用示例数据库
SYSAUX:作为EXAMPLE的辅助表空间
SYSTEM:用来存储SYS用户的表,视图以及存储过程等数据库对象
TEMP:用于存储SQL语句处理的表和索引的信息
UNDOTBS1:用于存储撤销信息
USERS:存储数据库用户创建的数据库对象
相关阅读:
oracle19c 用户、表空间、权限详解与相关操作_表空间权限查询-CSDN博客
7.创建PDB用户
1.进入容器(将oracle容器id换成你自己的id,docker ps 可以查看你的容器id)
docker exec -it oracle容器id bash
2.创建空间路径
创建表空间文件所需要的文件夹,当前登陆的用户为oracle,由于我也不知道容器初始化的root密码是什么,所以只能在有权限的文件夹下面创建
cd /home/oracle
ll
mkdir datafile
chmod 777 datafile
3.检查
查看编码格式是否正确(如果编码格式跟你要求的不一样,建议删除镜像,再重新执行命令,修改创建镜像时的编码,因为手动修改oracle编码也很麻烦)
# 以dba的方式连接oracle
sqlplus / as sysdba
select userenv('language') from dual;
4.查看当前连接的容器
#查看当前连接的容器
show con_name
此时使用的是CDB容器,需要切换到PDB中进行。
#查看pdb下库的信息
select name,open_mode from v$pdbs;
READ WRITE表示开启,如果未开启,需要手动开启。
5.切换PDB
alter session set container=orclpdb;
show con_name
显示当前连接为ORCLPDB即可。
如果要切换回CDB容器只需将容器名换为CDB容器的名字即可,一个CDB只有一个根
alter session set container=CDB$ROOT;
6.创建账号密码表空间
注意:在PDB下创建的普通用户是不带C##的
create tablespace 表空间名字 datafile '路径' size 100m autoextend on next 20m;
create user c##用户名 identified by 密码 default tablespace 表空间名字;
grant dba to c##用户名;
----------操作------------------
create tablespace TBS_GDJZ_DATA datafile '/home/oracle/datafile/TBS_GDJZ_DATA.dbf' size 100m autoextend on next 20m ;
create user GRC3_GDJZ_V2 identified by grc3_gdjzv2 default tablespace TBS_GDJZ_DATA;
grant dba to GRC3_GDJZ_V2;
7.错误说明
1、ORA-65096: 公用用户名或角色名无效
SQL> create user edg identified by edg default tablespace edg;
create user edg identified by edg default tablespace edg
*
第 1 行出现错误:
ORA-65096: 公用用户名或角色名无效
注:oracle12c之后的版本默认用户是创建在cdb下,需要切换到pdb中创建,或在用户前加上c##,如c##edg
2、ORA-65048: 在插接式数据库 ORCLPDB 中处理当前 DDL 语句时出错,ORA-00959: 表空间 ‘EDG’ 不存在
SQL> create user c##edg251 identified by edg251 default tablespace EDG;
create user c##edg251 identified by edg251 default tablespace EDG
*
第 1 行出现错误:
ORA-65048: 在插接式数据库 ORCLPDB 中处理当前 DDL 语句时出错
ORA-00959: 表空间 'EDG' 不存在
注:由于之前EDG表空间是在cdb下,需要在pdb下重新建立表空间即可。
3.
ERROR at line 1:
ORA-65094: invalid local user or role name
ORA-65094 意味着无法使用CONTAINER=CURRENT创建公共用户,它违反了根容器中公共用户的创建。您还可以在语句中显式声明CONTAINER=ALL 。
相关文章:
VMware教学-虚拟机扩容篇_系统免驱动的博客-CSDN博客
【oracle19c创建表空间及用户】_oracle 19c windows 创建表空间_Yolomic丶的博客-CSDN博客
Windows10安装和卸载oracle19c
官网下载地址:https://www.oracle.com/database/technologies/oracle-database-software-downloads.html
Oracle19c详细安装过程Win10_这样子啊~的博客-CSDN博客
Windows10完全卸载oracle19c_oracle19怎么卸载_周全全的博客-CSDN博客
七.其他
防火墙
systemctl stop firewalld
开启防火墙
systemctl start firewalld
关闭开机启动
systemctl disable firewalld
开启开机启动
systemctl enable firewalld
开启某个端口(如:2231端口)
firewall-cmd –zone=public –add-port=19080/tcp –permanent
firewall-cmd –reload
查询端口号(如:2231端口) 是否开启:
firewall-cmd –query-port=2231/tcp
查询有哪些端口是开启的:
firewall-cmd –list-port
查看防火状态
systemctl status firewalld
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2016-08-27 HTML可编辑的select