赞
踩
docker是为了解决开发与运维时环境配置问题,与VM相比,docker更轻便,启动速度也更快。在docker里面,仓库、镜像和容器贯穿全部,仓库就是存放镜像的地方,而镜像就是模板,通过模板来创建镜像,可以通过dockerfile来为已有的镜像添加一些功能。容器则就是镜像创建的一个实例,每个容器可以看作一个精简版的Linux系统。
yum install -y yum-utils
yum install -y docker-ce docker-ce-cli containerd.io
# mac直接在官网下载docker-destop即可
systemctl start docker 来启动服务 #centOS7,mac直接打开客户端即可启动
systemctl enable docker # 设置开机自启动
systemctl disable docker # 关闭开机自启动
#停止docker服务
systemctl stop docker
# 卸载模块
yum remove docker-ce docker-ce-cli containerd.io
# 清除数据
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
# []是可选的意思 # 可以列出指定仓库的镜像 docker images [OPTIONS] [REPOSITORY[:TAG]] OPTIONS: -a 显示所有的镜像,包括虚悬镜像,docker images会显示所有镜像(不包括虚悬镜像) -q 只显示镜像IP # 从镜像仓库拉取镜像 docker pull 镜像名[:版本号] # 从镜像仓库搜索镜像 docker search 镜像名 # 删除镜像 docker rmi 镜像名 # 创建一个镜像 docker commit [OPTIONS] CONTAINER 镜像名字[REPOSITORY[:TAG]] OPTIONS: -m 添加提示信息 -m "xxxx" -a 作者
# 创建容器 docker run [OPTIONS] IMAGE -d 在后台启动一个容器 -p 设置端口映射 映射的宿主机端口:容器端口 -v 共享数据据卷,本质用的其实是一块内容空间 宿主机目录:容器目录 -e 设置容器的环境,如mysql容器内部的root密码 --name 为容器设置一个名字 例如: docker run -p 3308:3306 --name mysql-slave \ -v /mydata/mysql-slave/log:/var/log/mysql \ -v /mydata/mysql-slave/data:/var/lib/mysql \ -v /mydata/mysql-slave/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root -d mysql # 检查容器是否启动,默认只显示已启动的 docker ps [OPTIONS] -a 显示全部容器 -l 显示最近创建的容器 # 启动容器 docker start 容器名或ID #在容器内部可以使用ctrl +p +q退出到容器,且不会关闭容器 # 进入后台运行的容器 docker exec -it 容器名或ID /bin/bash # -it是进入交互界面并且使用本机的/bin/bash # 停止容器 docker stop 容器或IP # 删除容器 docker rm 容器名或ID # 如果容器正在运行则使用 docker rm -f 容器名或ID # 查看容器内部信息 docker inspect 容器名或ID # 将文件从容器复制到宿主机 docker cp 容器名或IP:文件路径 宿主机路径 例如: docker cp centos7:/Hello.txt . # 将centos7里面的Hello.txt拷贝到当前文件夹 # 导入和导出容器 # 导出容器 docker export 容器名或ID > xx.tar # 导入 cat xx.tar | docker import - 镜像名字:版本号 # 更改镜像名 docker tag 镜像ID 名字
阿里云的地址:https://cr.console.aliyun.com/,打开后会有步骤,复制粘贴即可。
首先要拉取registry镜像,私有仓库是基于registry的。
# 1.创建并启动registry,设置端口映射以及共享数据卷 docker run -d -p 5000:5000 -v /root/dockerF/:/tmp/registry --privileged=true registry # 2.docker默认只支持https,不修改配置文件的话会报错,no provide secret http vim /etc/docker/daemon.json { # 阿里云镜像加速,用自己的 "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"], # 这个IP可以通过http连接,这里填的是本机的IP "insecure-registries":["192.168.40.254:5000"], } # 3.查看推送日志,通过curl -XGET http://192.168.40.254:5000/v2/_catalog, # 也可以用浏览器访问。 # 4.提交镜像到私服库,提交的时候对镜像名有要求, # 如果直接推镜会显示 denied: requested access to the resource is denied, # 名字格式是 IP:端口/镜像名,例如 192.168.40.254:5000/use_rename, # 需要先将镜像改成这个名字才可以进行推送。 # 5.拉取提交的镜像 docker pull 192.168.40.254:5000/myexportubuntu # 192.168.40.254:5000/myexportubuntu这个是提交时的镜像名字
使用容器数据卷时需要加上 --privileged=true
来时进入容器里面的用户获得root权限。
# 启动容器并设置数据卷 /root/juan是宿主机的路径,/root/是容器内部目录,:ro是在容器内部是只读的,默认是rw(可读写的)。
docker run -it -v /root/juan/:/root/:ro centos:7
# 也可以使用继承,继承只是继承容器的路径规则,他们之间相互独立。
docker run -it --volumes-from 容器名或ID --name centos:7
参照https://blog.csdn.net/qq_45883336/article/details/126215301
创建redis节点
# 需要创建6个以上的节点,端口不能重复
docker run -d --name redis-node-1 --net host --privileged=true \
-v /data/redis/share/redis-node-1:/data redis
--cluster-enabled yes --appendonly yes --port 7001
# --net host 容器使用宿主机网络
# 下面三个都是redis的配置选项。
# cluster-enabled 启动集群的意思
# appendonly 是否开启持久化,就是每次更新操作后都写入到日志
# port redis运行的端口
创建主从关系
创建主从关系需要进入redis之后才可以,所以需要先进入容器,
docker exec -it redis-node1 /bin/bash
redis-cli --cluster create 192.168.40.254:6381 192.168.40.254:6382 192.168.40.254:6383 192.168.40.254:6384 192.168.40.254:6385 192.168.40.254:6386 --cluster-replicas 1
# cluster-replicas 1 就是开启主从模式,会自动分配
运行之后会自动分配哈希槽位。
开启集群之后使用redis-cli -p xxx
进入不能直接用set key value
这种,因为首先会计算key对应的hash值,然后写入到对应的节点,当不属于当前节点是就会写不进去。需要使用redis-cli -p xxx -c
来连接。
主机宕机后,从机会自动变成主机,而原来的主机恢复后会变成从机。
集群扩容
为集群添加一对主从
# 1.先进入需要添加的节点 docker exec -it xxx /bin/bash # 2.添加节点 add-node后面是需要添加的节点,第二个IP是已经存在于集群的节点 redis-cli --cluster add-node 192.168.40.254:9999 192.168.40.254:6379 # 3.查看集群节点状态,需要先进入redis redis-cli -p 9999 cluster nodes或者使用cluster info # 4.重新分配插槽 redis-cli --cluster reshard 192.168.40.254:6387 # 输入之后会提示分配多个插槽,每个master平均分配即可 redis-cli --cluster check 192.168.40.254:6387 # 检查集群的槽点范围。 # 5.将从机添加到主机,add-node后第一个参数是从节点的IP,第二个是主机节点。 redis-cli --cluster add-node 192.168.40.254:6388 192.168.40.243:6387 --cluster-slave --cluster-master-id 主节点的ID # 6.检查是否添加成功 redis-cli --cluster check 192.168.40.254:6387 redis-cli -p xxx # 需要先进入redis,在输入cluster nodes查看节点信息 cluster nodes
集群缩容
# 1.先删除从机
redis-cli --cluster del-node 192.168.40.254:9999 从节点ID
# 2.清除需要删除master的槽位
redis-cli --cluster reshard 192.168.40.254:6381
# 输入只会会出现 How many slots do you want to move (from 1 to 16384)?这个意思是分配多少个槽位,之后会出现 “What is the receiving node ID?” 就是接受这个插槽的节点,回车之后就会提示从哪个主机拿槽位
# 3.删除master
redis-cli --cluster del-node 192.168.40.254:9999 从节点ID
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LIu88P97-1662445352004)(C:\Users\周周周\AppData\Roaming\Typora\typora-user-images\1662301028457.png)]
构建镜像基于哪个镜像,和继承差不多
镜像维护者姓名或邮箱地址
构建镜像时运行的bash指令,例如 rpm install net-tools
运行容器时执行的shell环境,CMD和RUN的区别是RUN是在构建镜像时执行的,而CMD是在启动容器执行的,且CMD可以被后面的覆盖比如启动时的/bin/bash
指定容器挂载点到宿主机自动生成的目录或其他容器
为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
声明容器的服务端口(仅仅是声明)
设置容器环境变量
拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压,是COPY的升级版
拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
运行容器时执行的shell命令,如果有多个只有最后一个生效
FROM centos:7
RUN yum -y install gcc vim net-tools
ENV mypath /root/
ADD /root/Python3.8.tar.gz /root
WORKDIR $mypath
执行docker build -t 的时候可能会提示不能解析域名,这时候需要在宿主机配置一下vim /etc/sysctl.conf
,在里面添加net.ipv4.ip_forward=1
docker启动之后宿主机会多出一块网卡(网桥),在centos7上叫docker0。类似于VM软件安装之后会有VMnet8和VMnet1。
容器实例之间通信需要通过docker0
docker network COMMAND
COMMAND:
create 创建一个网络
ls 查看所有的网络
prune 删除不能用的网络
rm 删除一个或多个网络
为每个容器分配IP,并连接到docker0。
不分配IP,用宿主机的网络
不进行网络配置,默认没有网络
启动容器时指定网络使用 docker run --net 网络名 容器名字
,如果两个容器使用的同一个网络,那么就可以通过容器名(–name xxx)进行网络通信。
这是用默认的,通过ip可以ping通,但是不能通过容器名。
通过--net mynet
创建的容器是可以的通过容器名ping通的,就不用担心IP会变化了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。