1、Docker 和 K8S 了解
2、Docker 安装和使用
【Docker中运行容器时Operation not permitted报错问题解决
使用–privileged标志启动容器将授予容器内的进程特权,从而允许它们执行需要特权的操作】
3、Docker更换仓库
常用 Docker 镜像仓库地址
Docker更换仓库
Docker拉取镜像报错no matching manifest for unknown in the manifest list entries
Daemon配置:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn/",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com",
"自己的阿里云地址"
],
"insecure-registries": [],
"debug": true,
"experimental": true
}
4、一些好资料
docker 教程
docker命令详细讲解
Docker容器互访的3种方式
如何解决容器网络性能及复杂网络部署问题
5、常用命令
#查看docker_cli版本
docker --version
#搜索镜像
docker search NAME
#查看镜像
docker images
#查看容器
docker container ls #只运行的
docker ps -a #所有状态
#运行容器启动后生成一个容器(以mysql为例)
docker run --name mysql-1 --network testnet(网络名) --network-alias mysql-1(容器网络名) -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
#启动和停止容器
docker start CONTAINER_ID / NAMES
docker stop CONTAINER_ID / NAMES
#查看日志
OPTIONS说明:
-f : 跟踪日志输出
-t : 显示时间戳
–since :显示某个开始时间的所有日志
–tail :仅列出最新N条容器日志
docker logs [服务名称或者容器名称] [OPTIONS]
#删除容器
docker rm CONTAINER_ID / NAMES
#删除镜像
docker rmi REPOSITORY:TAG / IMAGE ID
#进入容器(以mysql为例)
docker exec -it NAMES /bin/bash
docker exec -it NAMES bash
docker exec -it NAMES sh
#拷贝容器文件
docker cp nginx_01:/etc/nginx/nginx.conf E:\nginx-docker
#容器生成新镜像
docker commit 容器名or容器id 新镜像名
#容器间互访3种方式
1、虚拟ip(安装docker时,docker会默认创建一个内部的桥接网络docker0,每创建一个容器分配一个虚拟网卡,容器之间可以根据ip互相访问。)
2、link(此方法对容器创建的顺序有要求,如果集群内部多个容器要互访,使用就不太方便。)
docker run -it --name centos-2 --link centos-1:centos-1 docker.io/centos:latest
--link:参数中第一个centos-1是容器名,第二个centos-1是定义的容器别名(使用别名访问容器),为了方便使用,一般别名默认容器名。
3、创建bridge网络
docker network create testnet(网络名)
查询
docker network ls
运行容器连接到testnet网络
docker run -it --name centos-1 --network testnet --network-alias centos-1 docker.io/centos:latest
若访问容器中服务,可以使用这用方式访问 <网络别名>:<服务端口号>
#删除网络
docker network rm Name(NETWORK ID)
#查看容器网络
docker inspect zeng-docker2|findstr "NetworkMode"
docker inspect zeng-docker2|grep "NetworkMode"
5.1、SpringBoot制作docker镜像
1.书写DockerFile
FROM frolvlad/alpine-oraclejdk8:slim
COPY target/actuator-admin-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
2.在项目根目录下(DockerFile文件所在目录)执行 docker 构建镜像命令(版本号是冒号,别忘记后面的点)
docker build -t actuator-admin:1.0-SNAPSHOT .
docker run -it --name zeng-actuator-admin-01 --network testnet --network-alias zeng-actuator-admin -p 16000:16000 -d actuator-admin:1.0-SNAPSHOT
6、运行一些组件和中间件(注意切换Windows容器或者Linux容器,和配置源)
docker的run命令相关
#语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#OPTIONS说明
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb": 为容器指定一个名称
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致
-h "mars": 指定容器的hostname
-e username="ritchie": 设置环境变量
--env-file=[]: 从指定文件读入环境变量
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行
-m :设置容器使用内存最大值
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
--link=[]: 添加链接到另一个容器
--expose=[]: 开放一个端口或一组端口
--volume , -v: 绑定一个卷,是用来挂载宿主机的目录或文件到容器中的参数。通过使用 `-v` 参数,可以在容器中访问宿主机中的文件或目录,实现数据的共享和持久化。 e.g. -v E:\demo\abc:/demo/haha
下面的操作有些需要linux的命令知识,可以参考我的另一篇博客 linux
#容器中安装vim,以进行修改文件
apt-get update
apt-get -y install vim
6.1、拉取mysql:5.7并启动
docker pull mysql:5.7
docker run -it --name mysql-01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
#进入容器
docker exec -it mysql-01 /bin/bash
#登录mysql
mysql -h127. 0.0.1 -P3306 -D数据库 -uroot -p
#或者
docker exec -it mysql-01 mysql -u root -p
#进入mysql命令行后语句要带分号;
#查看当前所有数据库
show databases;
#进入数据库
use 数据库名字;
#查看当前是哪个数据库
select database(); 或者 status;
#查看当前数据库所有表
show tables;
#查看某个表的字段结构
desc 表名;
#查看表的sql
show create table 表名;
#执行sql脚本文件
source sql脚本文件路径;
#将sql及结果保存到文件
#其他数据库基本操作语句
tee 文件路径
pager cat >> 文件路径(>为覆盖,>>为追加)
#格式化打印
sql查询语句 \G
#事务相关
SELECT @@tx_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
COMMIT;
ROLLBACK;
6.2、拉取redis:latest并启动
史上最详细Docker安装Redis
最全的redis常用命令
docker pull redis:latest
docker run -it --name redis-01 -p 6379:6379 -d redis:latest --requirepass "123456"
#进入容器
docker exec -it redis-01 /bin/bash
#连接redis
redis-cli
#或者
docker exec -it redis-01 redis-cli
6.3、拉取mongo:latest并启动
docker pull mongo:latest
docker run -it --name mongo-01 -p 27017:27017 -d mongo:latest --auth
#添加用户和设置密码
docker exec -it mongo-01 mongo admin
#创建一个名为 root,密码为 123456 的用户。
db.createUser({user:'root',pwd:'123456',roles:[ { role:'root', db: 'admin'}]});
#尝试使用上面创建的用户信息进行连接。
db.auth('root', '123456');
#创建数据库
use test
#创建数据库用户
db.createUser({user:'test',pwd:'123456',roles:['dbOwner']});
#然后就可以用test用户连接数据库test了
6.4、拉取rabbitmq:latest并启动
docker pull rabbitmq:latest
docker run -it --name rabbitmq-01 -p 5672:5672 -p 15672:15672 --hostname myrabbitmq-01 -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -d rabbitmq:latest
#run实例失败的话rm掉然后重启docker再跑
#注意指定了环境变量RABBITMQ_DEFAULT_VHOST,客户端连接时需要把my_vhost带过去
#安装rabbitmq_management
docker exec -it rabbitmq-01 rabbitmq-plugins enable rabbitmq_management
6.5、拉取kafka并启动
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
docker pull sheepkiller/kafka-manager
docker run -it --name zookeeper-01 -p 12181:2181 -d wurstmeister/zookeeper:latest
docker run -it --name kafka-manager-01 -p 9000:9000 --link zookeeper-01 --env ZK_HOSTS=zookeeper-01:2181 -d sheepkiller/kafka-manager:latest
docker run -it --name kafka-01 -p 9092:9092 --link zookeeper-01 --env KAFKA_ZOOKEEPER_CONNECT=zookeeper-01:2181 --env KAFKA_ADVERTISED_HOST_NAME=192.168.1.103 --env KAFKA_ADVERTISED_PORT=9092 -d wurstmeister/kafka:latest
打开:http://192.168.1.103:9000 即可看到kafka-manager的管理界面
docker exec -it kafka-01 /bin/bash
cd opt/kafka/bin/
#发送消息
kafka-console-producer.sh --broker-list 192.168.1.103:9092 --topic first_topic --property parse.key=true --property key.separator=' '
#接收消息(https://www.cnblogs.com/yoyo1216/p/14024427.html)一些参数
kafka-console-consumer.sh --bootstrap-server 192.168.1.103:9092 --topic first_topic --from-beginning --max-messages=10 --property print.timestamp=true --property print.key=true
--partitions 0 --offset 10086
#创建topic
kafka-topics.sh --zookeeper 192.168.1.103:12181 --replication-factor 1 --partitions 6 --topic topic名字 --create
#查看topic
kafka-topics.sh --zookeeper 192.168.1.103:12181 --list
#查看topic详情
kafka-topics.sh --zookeeper 192.168.1.103:12181 --topic topic名字 --describe
#查看topic消息数
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.1.103:9092 --topic topic名字
#查看group
kafka-consumer-groups.sh --bootstrap-server 192.168.1.103:9092 --list
#查看group详情
kafka-consumer-groups.sh --bootstrap-server 192.168.1.103:9092 --group 组名 --describe | awk '{print $5}' | awk '{sum+=$1}END{print sum}'
或者 | awk '{BEGIN{sum=0}{sum+=$5}END{print sum}'
#重置offset到具体位置:https://blog.csdn.net/caidongxuan/article/details/107344765
kafka-consumer-groups.sh --bootstrap-server 192.168.1.103:9092 --group 组名 --topic 名字:分区号 --reset-offsets --to-offset 10086 --execute
6.6、拉取nginx:latest并启动
#方法1
docker pull nginx:latest
docker run -it --name nginx-01 -p 15001:80 -d nginx:latest
#修改conf文件
docker exec -it nginx-01 bash
#切换目录到etc/nginx/
cd etc/nginx/
#使用vim nginx.conf 或者vi nginx.conf,会发现vi或者vim命令没有用。
#这时解决办法:apt-get update 完成之后 apt-get -y install vim
#完成之后用vim命令修改nginx.conf文件并保存退出:wq
vim nginx.conf
#如何修改nginx.conf文件
#可以参考我的另一篇博客 nginx--https://blog.csdn.net/zengjyxxz/article/details/108129656
#注意配置中的ip
#然后保存退出linux
exit
#然后要么刷新nginx配置文件,要么关闭容器然后重启容器(重启容器这个有时有点坑,明明配置文件没有问题切报错,建议使用下面的)
docker exec -it nginx-01 nginx -s reload
#或者
docker stop nginx-01
docker start nginx-01
#方法2
docker pull nginx:latest
docker run -it --name nginx-01 -p 15001:80 -d nginx:latest
#本机目录新建文件夹,e.g. E:\nginx-docker 下面新建conf文件夹和log文件夹
#拷贝docker文件
docker cp nginx-01:/etc/nginx/conf.d E:\nginx-docker\conf
docker cp nginx-01:/etc/nginx/nginx.conf E:\nginx-docker\conf
docker cp nginx-01:/usr/share/nginx/html E:\nginx-docker\html
#停止,删除掉没有做映射的容器
docker stop nginx-01
docker rm nginx-01
#跑映射的容器
docker run -it --name nginx-01 -p 15001:80 -v E:\nginx-docker\conf\nginx.conf:/etc/nginx/nginx.conf -v E:\nginx-docker\conf\conf.d:/etc/nginx/conf.d -v E:\nginx-docker\html:/usr/share/nginx/html -v E:\nginx-docker\log:/var/log/nginx -d nginx:latest
#然后配置本机的配置文件实现负载均衡
#可以参考我的另一篇博客 nginx--https://blog.csdn.net/zengjyxxz/article/details/108129656
#然后要么刷新nginx配置文件,要么关闭容器然后重启容器(重启容器这个有时有点坑,明明配置文件没有问题切报错,建议使用下面的)
docker exec -it nginx-01 nginx -s reload
#或者
docker stop nginx-01
docker start nginx-01
6.7、拉取centos:latest并启动
docker pull centos:latest
docker run -it --name centos-01 -d centos:latest
#通过exec命令进入容器
docker exec -it centos-01 /bin/bash
6.8、拉取ubuntu:latest并启动
docker pull ubuntu:latest
docker run -it --name ubuntu-01 -d ubuntu:latest
#通过exec命令进入容器
docker exec -it ubuntu-01 /bin/bash
注意:如果要在centos和ubuntu容器中跑程序的话,需要把程序端口映射出去。
6.9、nacos的docker配置
#Clone 项目
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker/example
#装这个的时候弄了好久(可能重置docker,也可能是过程中让程序自己去share--才成功)
#单机模式 Mysql(直接按照demo来的话数据库管理员账号root,root,nacos账号nacos,nacos。grafana账号admin,admin)
docker-compose -f standalone-mysql-5.7.yaml up
docker-compose -f standalone-mysql-8.yaml up
#集群模式
docker-compose -f cluster-hostname.yaml up
6.10、seata的docker配置
#registry.conf文件
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
loadBalance = "RandomLoadBalance"
loadBalanceVirtualNodes = 10
nacos {
application = "seata-server"
serverAddr = "192.168.1.103:8848"
namespace = ""
group = "SEATA_GROUP"
cluster = "default"
username = ""
password = ""
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "192.168.1.103:8848"
namespace = ""
group = "SEATA_GROUP"
username = ""
password = ""
}
}
#这里采用的是注册到nacos,配置从nacos拿(里面配的是db)
#需要把config.txt的配置导入到nacos
#db服务端建3张表
#registry.conf的文件见上方或者看官方资源文件
#这种方式报错了---------------------------------------××
#在e盘新建一个seata-docker文件夹,然后
#制作docker-compose.yaml文件,内容为
version: "3"
services:
seata-server:
hostname: seata-server
image: seataio/seata-server:latest
container_name: seata-standalone
volumes:
- "./resources:/seata-server/resources"
ports:
- "8091:8091"
environment:
- SEATA_PORT=8091
#然后新建一个resources的文件夹,里面丢进去registry.conf文件
#然后docker-compose部署
docker-compose -f docker-compose.yaml up
#这种方式报错了---------------------------------------××用下面的
#快速开始
#需要注意nacos中的配置的数据库连接地址和registry.conf文件的配置地址
docker pull seataio/seata-server:latest
#挂载本地registry.conf文件,指定注册到nacos的ip
docker run -it --name seata-standalone -p 8091:8091 -v E:\seata-docker\resources\registry.conf:/seata-server/resources/registry.conf -e SEATA_IP=192.168.1.103 -d seataio/seata-server:latest
6.11、拉取pollyduan/start_spring_io并启动
docker pull pollyduan/start_spring_io
docker run -it --name spring_io-01 -p 8080:8080 -d pollyduan/start_spring_io:latest