镜像:镜像是静态的只读文件
容器
仓库
#docker
#配置阿里的docker源,不然后期docker拉取镜像将会特别慢!!!
cd /etc/yum.repos.d/
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker
systemctl start docker
#开机启动
systemctl enable docker
[root@hadoop01 ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
配置镜像
阿里云
科大: /etc/docker/daemon.json
vim /etc/docker/daemon.json
#{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]}
sudo systemctl daemon-reload
sudo systemctl restart docker
可以在:后加版本,默认最新
#docker pull 镜像名
docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ...
5.7: Pulling from docker.io/library/mysql
a076a628af6f: Pull complete
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
....#省略
docker run -itd --name=mycentos centos:7 /bin/bash echo "hello world"
[a-zA-Z0-9][a-zA-Z0-9_.-]
自己闲的没事测试:
#只有i参数
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -i centos:7
fa^H^H^[[Daf^H^[[3~^C^C
^C
d
/bin/bash: line 3: d: command not found
yum --version
3.4.3
/bin/bash: line 4: $'c\be': command not found
exit #可以交互但没有伪终端,默认用bash运行;用exit退出
#只有t参数
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -t centos:7
[root@38b749b8ce77 /]# fe
exit
fe^H^H
f^C #只有伪终端没有交互,^C退出
#it都有
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -it centos:7
[root@726a73872904 /]# fe
bash: fe: command not found
#只有d
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run -d --name=cd centos:7
1ca7b3291711f368e0135a070fafae29aedd4796df5efd4fb8bda9b96f21112a
#也是运行一下就停了
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
1ca7b3291711 centos:7 "/bin/bash" 31 seconds ago Exited (0) 30 seconds ago
#不要把可选参数的位置放错!后面是放容器内命令(COMMAND)的,参数错放在那里会启动不了!
#只有-d,有容器命令的话可以一直运行!要不然也是直接关上,运行不了!
#总结:-itd和带COMMAND及-d的可以后台运行,只有-d的不可以!
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
#什么参数都没有
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker run centos:7
#没有正在运行的容器
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
#创建3s之后就停止了
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
83cea50b6796 centos:7 "/bin/bash" 41 seconds ago Exited (0) 38 seconds ago
6a36f0c80a2c centos:7 "/bin/bash" 13 hours ago Exited (137) 13 hours ago
4f1a92ed1272 centos:7 "/bin/bash" 13 hours ago Exited (130) 13 hours ago
回归正题,其他常用命令
查看运行中的容器
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
#-a, --all #列出当前正在运行的容器 + 带出历史运行过的容器
#-n=?, --last int #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
#-q, --quiet #只列出容器的编号
#关闭对应id/name的容器 很多时候用id或者name都可以
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker stop 38b749b8ce77
38b749b8ce77
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
状态:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38b749b8ce77 centos:7 “/bin/bash” 18 minutes ago Up 18 minutes musing_cray
容器状态(STATUS)有七种:
接着看其他常用命令
关闭容器并不是停止容器!每次run都是创建了新的容器!stop之后容器还在,下次还可以根据ID/NAME启动它!rm才是删除!
注意stop、rm、exit,也就是关闭、删除、退出的区别!
查看所有容器
docker ps -a
退出容器
exit #容器直接退出
ctrl +P +Q #容器不停止退出 在交互模式下用
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
删除&&高级删除
#linux命令,查出所有镜像
[root@ecs-sn3-medium-2-linux-20200223201237 ~]# docker images -aq
a70d36bc331a
040bdb29ab37
8652b9f0cb4c
647c57f8354f
647c57f8354f
#删除容器
docker rm 容器id或名字 #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
docker ps 命令 #列出当前正在运行的容器
-a, --all #列出当前正在运行的容器 + 带出历史运行过的容器
-n=?, --last int #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
-q, --quiet #只列出容器的编号
容器的生命周期一共有五个状态分别为
注:椭圆为容器的状态
dockerfile
的每一行命令都会生成一个镜像层
Docker Compose,和脚本差不多。
FROM openjdk:8-jre
ADD target/*.jar /application.jar
ENTRYPOINT ["java", "-jar","/application.jar"]
Docker Compose
允许用户通过docker-compose.yml
文件来定义一组相关联的容器为一个工程(project)。一个工程包含多个服务(service),每个服务中定义了创建容器时所需的镜像、参数、依赖等。
工程级:Docker Compose
服务级:一个镜像
一个工程包含多个服务,一个Docker Compose的yml文件管理多个image
一个image可以直接指定,也可以基于
Dockerfile
文件构建
1、备份容器
docker commit -p <容器ID> 备份命名
将备份的镜像导出到本地
docker save 备份名 > 位置/名.tar
2、恢复容器
docker load < 本地容器路径
#或者docker load -i 本地容器路径
查看镜像可以看到导入成功
在项目文件夹下创建Dockerfile文件,然后在项目文件夹下
docker build -t 自己起个镜像名儿 .
类似python的requirements.txt的使用方式
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS
支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS
里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 目前支持的联合文件系统包括 OverlayFS
, AUFS
, Btrfs
, VFS
, ZFS
和 Device Mapper
。
chroot & pivot_root可以修改进程和系统的根目录到一个新的位置
namespace划定一个个的命名空间,然后把进程划分到这些命名空间中。而每个命名空间都是独立存在的,命名空间里面的进程都无法看到空间之外的进程、用户、网络等等信息。
CGroup它可以划定一个个的分组,然后限制每个分组能够使用的资源,比如内存的上限值、CPU的使用率、硬盘空间总量等等。
./mvnw spring-boot:build-image
修改docker.service文件
vim /usr/lib/systemd/system/docker.service
需要修改的部分:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
配置生效
systemctl daemon-reload
重新启动Docker服务
systemctl stop docker
systemctl start docker
开启2375端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
无法连接到 Docker for Windows:需要事先在 Docker设置 的 General 部分,启用 Expose daemon on tcp://localhost:2375 without TLS 选项(其作用是:将docker与本地的连接设置为不需要TLS加密)。
docker pull docker.io/zookeeper:latest
docker run --name zk --privileged=true -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart always -d -v $(pwd)/conf:/conf zookeeper
–name zk :自定义名称
–privileged=true :开放权限 是否让docker 应用容器 获取宿主机root权限(特殊权限-),否则docker无法读取映射配置
-p 2181:2181 -p 2888:2888 -p 3888:3888: 端口映射
1、2181:对cline端提供服务
2、3888:选举leader使用
3、2888:集群内机器通讯使用(Leader监听此端口)
-d :后台运行
$(pwd)/conf:/conf :配置文件映射
或者
docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:3.6
先pull的zookeeper3.6,用的openjdk11
9002端口
主机kafka运行在自己的容器环境,宿主机的host不起作用
启动后,如果使用docker logs zookeeper或者kafka查看日志,会有8小时时差,可以在run命令里添加参数-e TZ="Asia/Shanghai"解决,楼主的方式启动后容器内时间和虚拟机时间是一致的,但是日志的时间还是不对
[0](javascript:[回复](javascript:
kafka要绑定宿主机,就是ifconfig里docker0的IP地址
172.17.0.2:2181/kafka
配置了consumer订阅,却仍报错:没有订阅任何topic
To use the group management or offset commit APIs, you must provide a valid group.id in the consumer configuration.
2023-04-26 05:52:44 [alerter-worker-0] ERROR com.usthe.alert.AlerterWorkerPool - workerExecutor has uncaughtException.
java.lang.IllegalStateException: Consumer is not subscribed to any topics or assigned any partitions
at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1223)
原因:没有配置consumer的groupid
properties.put("group.id", "console-consumer-myapp");
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "console-consumer-myapp")
原因:没有配置consumer的groupid
```java
properties.put("group.id", "console-consumer-myapp");
properties.put(ConsumerConfig.GROUP_ID_CONFIG, "console-consumer-myapp")