经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
对于Docker和Podman的一点使用经验
来源:cnblogs  作者:好看的hk  时间:2024/5/11 8:55:53  对本文有异议

前言:本文会以多个实际的线上例子,分享自己对于Docker和Podman的一点使用经验及踩过的坑,希望对读者有一点帮助。

本文bash脚本初步加工后可直接使用(兼容mac和linux系统),对于关键点会有注重说明,但是对于一些细节需要读者自行去查阅相关文档,这里不会具体展开。

一、部署Apollo

1、docker脚本

  1. version=2.0.1
  2. dbhost_port=host.docker.internal:3306
  3. dbuser=root
  4. dbpwd=xxxx
  5. docker stop apollo-configservice && docker rm apollo-configservice
  6. docker stop apollo-adminservice && docker rm apollo-adminservice
  7. docker stop apollo-portal && docker rm apollo-portal
  8. docker run -p 28080:8080 --init --add-host=host.docker.internal:host-gateway -v /etc/localtime:/etc/localtime:ro -e SPRING_DATASOURCE_URL="jdbc:mysql://$dbhost_port/ApolloConfigDB?characterEncoding=utf8" -e SPRING_DATASOURCE_USERNAME=$dbuser -e SPRING_DATASOURCE_PASSWORD=$dbpwd -e ENV=dev -e JAVA_OPTS='-Xmx128m -Xms128m' -d -v /tmp/logs:/opt/logs --name apollo-configservice apolloconfig/apollo-configservice:$version
  9. sleep 30s
  10. docker run -p 28090:8090 --init --add-host=host.docker.internal:host-gateway --link apollo-configservice:apollo-configservice -v /etc/localtime:/etc/localtime:ro -e SPRING_DATASOURCE_URL="jdbc:mysql://$dbhost_port/ApolloConfigDB?characterEncoding=utf8" -e SPRING_DATASOURCE_USERNAME=$dbuser -e SPRING_DATASOURCE_PASSWORD=$dbpwd -e ENV=dev -e JAVA_OPTS='-Xmx128m -Xms128m' -d -v /tmp/logs:/opt/logs --name apollo-adminservice apolloconfig/apollo-adminservice:$version
  11. sleep 30s
  12. docker run -p 28070:8070 --init --link apollo-configservice:apollo-configservice --add-host=host.docker.internal:host-gateway -v /etc/localtime:/etc/localtime:ro -e SPRING_DATASOURCE_URL="jdbc:mysql://$dbhost_port/ApolloPortalDB?characterEncoding=utf8" -e SPRING_DATASOURCE_USERNAME=$dbuser -e SPRING_DATASOURCE_PASSWORD=$dbpwd -e APOLLO_PORTAL_ENVS=dev,prd -e DEV_META=http://host.docker.internal:28080 -e PRD_META=http://host.docker.internal:28080 -e ENV=dev -e JAVA_OPTS='-Xmx128m -Xms128m' -d -v /tmp/logs:/opt/logs --name apollo-portal apolloconfig/apollo-portal:$version
  13. echo "apollo启动完成"

2、podman脚本

  1. podman stop apollo-configservice && podman rm apollo-configservice
  2. podman run -p 28080:8080 -d --rm -v /etc/localtime:/etc/localtime:ro -e SPRING_DATASOURCE_URL="jdbc:mysql://host.containers.internal:3306/ApolloConfigDB?characterEncoding=utf8" -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=xxxx -e ENV=dev -e JAVA_OPTS='-Xmx128m -Xms128m' --name apollo-configservice apolloconfig/apollo-configservice:2.0.1
  3. sleep 30s
  4. podman stop apollo-adminservice && podman rm apollo-adminservice
  5. podman run -p 28090:8090 -d --rm -v /etc/localtime:/etc/localtime:ro -e SPRING_DATASOURCE_URL="jdbc:mysql://host.containers.internal:3306/ApolloConfigDB?characterEncoding=utf8" -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=xxxx -e ENV=dev -e JAVA_OPTS='-Xmx128m -Xms128m' --name apollo-adminservice apolloconfig/apollo-adminservice:2.0.1
  6. sleep 30s
  7. podman stop apollo-portal && podman rm apollo-portal
  8. podman run -p 28070:8070 -d --rm -v /etc/localtime:/etc/localtime:ro -e SPRING_DATASOURCE_URL="jdbc:mysql://host.containers.internal:3306/ApolloPortalDB?characterEncoding=utf8" -e SPRING_DATASOURCE_USERNAME=root -e SPRING_DATASOURCE_PASSWORD=xxxx -e APOLLO_PORTAL_ENVS=dev,prd -e DEV_META=http://host.containers.internal:28080 -e PRD_META=http://host.containers.internal:28080 -e ENV=dev -e JAVA_OPTS='-Xmx128m -Xms128m' --name apollo-portal apolloconfig/apollo-portal:2.0.1
  9. sleep 30s
  10. echo "apollo启动完成"

3、注意事项

  1. docker里面容器可以通过 host.docker.internal 来访问宿主机,而podman容器里面是通过 host.containers.internal 来访问宿主机,注意区分。

  2. docker里面可以通过 --link 参数来连接两个容器的网络,使得容器之间可以互相通过 --name 指定的容器名 + 端口来访问。但podman不行,即使显式指定 --hostname 也不行。podman两个容器之间只能通过 ip 地址来访问,可以用 --ip 参数显式指定ip。ip的网段是10.88.0.0/16,个数为2^16 - 2 = 65536 -2 = 65534个 。

  3. 对于第2条,在mac高版本上是不适用的(即容器之间可以通过hostname来访问),虽然翻遍了官方文档,也没找到支持的论据,只能怀疑是高版本的feature(linux podman版本4.4.1,mac podman版本4.8.3)。

  4. 不要使用docker-compose,自己写bash脚本更为灵活自主可控。

  5. podman和docke命令可以互相替换,一般来说podman已经内置了命令转换功能,如果没有的话,可以通过下面代码来实现在脚本中的命令互换(脚本跟命令行的实现方式不一样)

  1. #!/bin/bash
  2. # 参考链接:https://blog.51cto.com/u_15162069/2780080?articleABtest=1
  3. # 已前置设置 alias docker=podman
  4. shopt -s expand_aliases
  5. source ~/.bash_profile
  6. alias
  7. # 使用which命令判断命令是否存在
  8. if which docker >/dev/null 2>&1; then
  9. echo "use docker"
  10. else
  11. echo "use podman replace docker"
  12. docker -v
  13. fi
  14. # put your docker or podman command in here

二、部署kafka

1、docker脚本

  1. docker stop zookeeper && docker rm zookeeper
  2. # https://hub.docker.com/r/bitnami/zookeeper
  3. docker run -d --name zookeeper -p 2181:2181 --network=common_container_network -v /home/data/docker/bitnami/zookeeper:/bitnami -e TZ=CST-8 -e ALLOW_ANONYMOUS_LOGIN=YES bitnami/zookeeper:3.9
  4. sleep 5s
  5. docker stop kafka && docker rm kafka
  6. docker run -d --name kafka -p 19092:19092 --network=common_container_network -v /home/data/docker/bitnami/kafka:/bitnami -e KAFKA_HEAP_OPTS='-Xmx512m -Xms512m' -e KAFKA_CFG_NODE_ID=0 -e TZ=CST-8 -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:127.0.0.1:19092 -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT -e KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://:9092,EXTERNAL://127.0.0.1:19092 -e KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:19092 -e KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL bitnami/kafka:3.4
  7. sleep 20s
  8. docker stop kafka-exporter && docker rm kafka-exporter
  9. docker run -d --name kafka-exporter --restart=no --network=common_container_network -u root -p 19308:19308 danielqsj/kafka-exporter:v1.7.0 --web.listen-address=:19308 --kafka.server=kafka:9092 --kafka.version=3.4.1

2、podman脚本

  1. docker stop zookeeper && docker rm zookeeper
  2. podman run -d --name=zookeeper --ip=10.88.222.1 -p 2181:2181 -v /home/data/docker/bitnami:/bitnami -e TZ=CST-8 -e ALLOW_ANONYMOUS_LOGIN=YES bitnami/zookeeper:3.9
  3. sleep 5s
  4. docker stop kafka && docker rm kafka
  5. docker run -d --name=kafka --ip=10.88.222.2 -p 19092:19092 -v /home/data/docker/bitnami:/bitnami -e KAFKA_HEAP_OPTS='-Xmx512m -Xms512m' -e KAFKA_CFG_NODE_ID=0 -e TZ=CST-8 -e KAFKA_CFG_ZOOKEEPER_CONNECT=10.88.222.1:2181 -e KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:172.18.159.144:19092 -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT -e KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://:9092,EXTERNAL://47.119.23.205:19092 -e KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:19092 -e KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL bitnami/kafka:3.4
  6. sleep 10s
  7. docker stop kafka-exporter && docker rm kafka-exporter
  8. docker run -d --name kafka-exporter --restart=no -u root -p 19308:19308 danielqsj/kafka-exporter:v1.7.0 --web.listen-address=:19308 --kafka.server=10.88.222.2:9092 --kafka.version=3.4.1

3、注意事项

  1. 注意bitnami的镜像都是rootless,但在笔者mac下,无论怎样做(已尽最大努力尝试,建议直接放弃),都不能实现文件的正确挂载。linux可以正常挂载。
  2. docker只有容器的概念,而podman里面有 容器Pod 的概念。多个容器可以在同一个pod,由pod统一管理端口映射,且pod里面容器共享网络,此时容器直接可以直接通过localhost + 端口来互相访问。
  3. 注意对于kafka的一些设置,KAFKA_CFG_ADVERTISED_LISTENERS 用于设置暴露在外网的连接地址,KAFKA_CFG_LISTENERS 用于设置暴露在内网的连接地址,这两个地址都会注册到zk上。
  4. kafka其实也可以不依赖zk,高版本已经内置KRaft(v2.8+),成熟度不详。
  5. --param 参数如果放在镜像名称之前,代表docker的参数设置,之后,则是对于镜像的参数设置。

三、部署Prometheus

1、docker脚本

  1. docker stop prometheus && docker rm prometheus
  2. # prometheus
  3. docker run -d --restart=no -u root --name prometheus --network=common_container_network --add-host=host.docker.internal:host-gateway -p 19090:19090 -v /home/data/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /home/data/docker/prometheus/data:/prometheus -v /etc/localtime:/etc/localtime:ro prom/prometheus:v2.37.0 --storage.tsdb.retention.time=30d --storage.tsdb.path=/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle --web.listen-address=:19090
  4. docker stop alertmanager && docker rm alertmanager
  5. # alertmanager
  6. docker run -d --restart=no -u root --name alertmanager --network=common_container_network --add-host=host.docker.internal:host-gateway -p 19093:19093 -v /home/data/docker/prometheus/alertmanager:/etc/prometheus/alertmanager -v /etc/localtime:/etc/localtime:ro prom/alertmanager:v0.25.0 --config.file=/etc/prometheus/alertmanager/alertmanager.yml --storage.path="/etc/prometheus/alertmanager" --data.retention=120h --web.listen-address=:19093
  7. docker stop node-exporter && docker rm node-exporter
  8. # node-exporter
  9. docker run -d --name=node-exporter --restart=no -u root --network=common_container_network --add-host=host.docker.internal:host-gateway -p 19100:19100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" prom/node-exporter:v1.6.0 --path.rootfs=/host --web.listen-address=:19100 --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

2、podman脚本

  1. docker stop prometheus && docker rm prometheus
  2. docker run -d --rm --restart=no -u root --name prometheus -p 19090:19090 -v /home/data/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /home/data/docker/prometheus/data:/prometheus -v /etc/localtime:/etc/localtime:ro prom/prometheus:v2.37.0 --storage.tsdb.retention.time=30d --storage.tsdb.path=/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle --web.listen-address=:19090
  3. docker stop alertmanager && docker rm alertmanager
  4. docker run -d --rm --restart=no -u root --name alertmanager -p 19093:19093 -v /home/data/docker/prometheus/alertmanager:/etc/prometheus/alertmanager -v /etc/localtime:/etc/localtime:ro prom/alertmanager:v0.25.0 --config.file=/etc/prometheus/alertmanager/alertmanager.yml --storage.path="/etc/prometheus/alertmanager" --data.retention=120h --web.listen-address=:19093
  5. docker stop node-exporter && docker rm node-exporter
  6. docker run -d --name=node-exporter --restart=no -u root -p 19100:19100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" prom/node-exporter:v1.6.0 --path.rootfs=/host --web.listen-address=:19100 --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

3、部署grafana

  1. # docker和grafana可以混用
  2. # 可以对配置文件进行充分定制
  3. docker stop grafana && docker rm grafana
  4. docker run -d --restart=no -u root --name=grafana -v /home/data/docker/grafana/grafana.ini:/etc/grafana/grafana.ini -p 13000:13000 -v /etc/localtime:/etc/localtime:ro grafana/grafana-enterprise:10.2.3 --config=/etc/grafana/grafana.ini

有一说一,grafana是真的香,功能是真的多。后面就直接使用grafana内置功能来做监控报表的数据展示了,不单独写UI界面了,敬请期待~

四、相关命令汇总

以下是一些可能会经常用到的命令,这里也简单列一下:

  1. # 间接实现多行注释
  2. if false; then
  3. # 快速运行
  4. docker run -d -p 19093:19093 --name alertmanager prom/alertmanager:v0.25.0
  5. # 查看镜像详细信息
  6. docker inspect grafana
  7. # 进入镜像命令行
  8. docker exec -it grafana sh
  9. # 查看日志
  10. docker logs grafana
  11. # 查看容器详细信息
  12. docker stats grafana
  13. # 复制目录到远程服务器
  14. scp -r /Users/huangkui/work/online/docker/apollo root@110.42.230.56:/home/data/docker
  15. # 复制远程服务器文件到本地
  16. scp -r root@110.42.230.56:/usr/lib/bin/jmap /Users/huangkui/work/xiaokui/docker/apollo/prd
  17. # 从容器内部复制文件出来
  18. docker cp 04b4dd7569cf:/apollo/scripts/startup.sh /Users/huangkui/work/docker/apollo
  19. # 复制文件到容器内部去
  20. docker cp /Users/huangkui/work/xiaokui/docker/apollo/jmap apollo:/usr/lib/jvm/jre/bin
  21. # 重启服务 Prometheus
  22. curl -XPOST http://localhost:19090/-/reload
  23. # 重启服务 AlertManager
  24. curl -XPOST http://localhost:19093/-/reload
  25. # 输入指定字符到文件
  26. echo "hello world" >> test.txt
  27. # 修改文件夹所有者
  28. sudo chown -R 1001:1001 /Users/huangkui/home/data/docker/bitnami
  29. # 修改文件权限
  30. sudo chmod -R 777 /Users/huangkui/home/data/docker/bitnami
  31. # 停止然后移除容器,不建议使用--rm参数,当容器启动异常时会丢失日志信息
  32. docker stop grafana && docker rm grafana
  33. fi

五、一键部署脚本

暂未发现其必要性,待补充。

欢迎关注微信公众号:好看的HK,第一时间掌握Java最新黑科技,轻轻松松进大厂!
image

原文链接:https://www.cnblogs.com/good-looking-hk/p/18182241

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号