Docker

1、Docker 和 K8S 了解

10分钟看懂 Docker 和 K8S

2、Docker 安装和使用

Docker 安装和使用
linux系统安装docker

【是否能在docker中装ubuntu,再嵌套部署启动一个docker?
报错:Is the docker daemon running?
解决方案:启动容器(需要将宿主机 的docker.sock 挂载进容器)–>
docker container run -it -v /var/run/docker.sock:/var/run/docker.sock testabc:1.0 /bin/bash】

【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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值