找回密码
 立即注册
首页 业界区 科技 Docker 持续集成部署+ELK日志相关等 完美实践 ...

Docker 持续集成部署+ELK日志相关等 完美实践

汲佩杉 2025-6-7 13:21:20
docker(ubuntu)卸载docker
  1. # 卸载(如有)
  2. for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
复制代码
安装docker
  1. # 更新并安装工具
  2. sudo apt-get update
  3. sudo apt-get install ca-certificates curl
  4. # 添加阿里云GPG秘钥
  5. sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  6. # 配置docker软件源信息到阿里云
  7. sudo echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  8. # 安装docker
  9. sudo apt-get update
  10. sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  11. # 启动并测试
  12. sudo systemctl start docker
  13. sudo docker run hello-world
  14. # 校验(出现这个,说明安装成功了)
  15. Hello from Docker!
  16. This message shows that your installation appears to be working correctly.
  17. ...
复制代码
更改docker国内镜像
  1. # 添加Docker镜像
  2. echo '{"registry-mirrors": ["https://docker.1ms.run"]}' | sudo tee /etc/docker/daemon.json > /dev/null
  3. systemctl daemon-reload
  4. systemctl restart docker
复制代码
更改docker存储位置
  1. # 更改docker存储位置,假如想存在/data/docker目录里
  2. cd /data
  3. mkdir docker
  4. # 修改 /etc/docker/daemon.json,在根对象增加 "data-root": "/data/docker" 配置
复制代码
安装docker-compose
  1. # 下载docker-compose
  2. # 版本需要替换到最新,从下面链接查看
  3. # https://github.com/docker/compose/releases
  4. curl -L "https://github.com/docker/compose/releases/download/v2.32.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  5. # 增加执行权限
  6. chmod +x /usr/local/bin/docker-compose
复制代码
jenkins

拉取镜像
  1. docker pull jenkins/jenkins
复制代码
创建挂载目录
  1. mkdir -p /data/jenkins/{jenkins_home,docker.sock}
复制代码
创建启动Jenkins容器
  1. docker run -d \
  2.   --name jenkins \
  3.   --user $(id -u):$(id -g) \
  4.   -p 9080:8080 \
  5.   -p 50000:50000 \
  6.   -v /data/jenkins/jenkins_home:/var/jenkins_home \
  7.   -v /data/jenkins/docker.sock:/var/run/docker.sock \
  8.   -v $(which docker):/usr/bin/docker \
  9.   --restart=always \
  10.   jenkins/jenkins
复制代码
详细解释:
  1. # 使用 Docker 运行一个新的容器
  2. docker run -d \
  3.   # 为容器指定一个名字
  4.   --name jenkins \
  5.   # 以当前用户身份运行容器内的进程,$(id -u) 获取当前用户的用户ID,$(id -g) 获取当前用户的组ID
  6.   --user $(id -u):$(id -g) \
  7.   # 将宿主机的端口 9010 映射到容器的端口 8080,用于访问 Jenkins 的 Web 界面
  8.   -p 9080:8080 \
  9.   # 将宿主机的端口 9011 映射到容器的端口 50000,用于 Jenkins 的 JNLP 代理连接
  10.   -p 50000:50000 \
  11.   # 将宿主机上的 /data/jenkins/jenkins_home 目录挂载到容器的 /var/jenkins_home 目录,用于持久化 Jenkins 数据
  12.   -v /data/jenkins/jenkins_home:/var/jenkins_home \
  13.   # 将宿主机上的 Docker 套接字文件挂载到容器中,使得容器内的 Jenkins 可以使用宿主机的 Docker 守护进程
  14.   -v /data/jenkins/docker.sock:/var/run/docker.sock \
  15.   # 将宿主机上的 Docker 命令挂载到容器中,使得容器内的 Jenkins 可以执行 Docker 命令
  16.   -v $(which docker):/usr/bin/docker \
  17.   # 指定要运行的镜像,这里是 Jenkins 官方提供的 Jenkins 镜像
  18.   jenkins/jenkins
复制代码
查看jenkins 解锁密码
  1. docker logs  -f jenkins
复制代码
  1. 如下所示
  2. *************************************************************
  3. *************************************************************
  4. *************************************************************
  5. Jenkins initial setup is required. An admin user has been created and a password generated.
  6. Please use the following password to proceed to installation:
  7. 6f1c8e1131974079ace00e89507c6a16
  8. This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
  9. *************************************************************
  10. *************************************************************
  11. *************************************************************
复制代码
设置密码

admin admin123Jenkins dotnet命令无法执行
  1. docker exec -it jenkins bash
  2. #dotnet
  3. apt-get install wget
  4. wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
  5. dpkg -i packages-microsoft-prod.deb
  6. apt-get update
  7. apt-get install dotnet-sdk-6.0
复制代码
添加自定义Nuget源

 
  1. docker exec -it jenkins bash
  2. cd ~/.nuget/NuGet
  3. # 添加第一个源#
  4. sed -i '/<\/packageSources>/i \    ' NuGet.Config
  5. # 添加第二个源
  6. sed -i '/<\/packageSources>/i \    ' NuGet.Config
复制代码
将现有容器打包成镜像
  1. # docker commit -m "提交信息" -a "作者" <容器ID或名称> mynewimage:latest
  2. docker commit -m '配置后的jenkins' -a 'TE' jenkins myjenkins:1.0
复制代码
配置NodeJs
  1. 系统管理 => 插件管理 => 安装NodeJS
  2. 系统管理 => 全局工具配置 => NodeJS安装 => 勾选自动安装 选择需要的 NodeJS 版本
  3. 配置流水线 => 环境 => 为PATH提供Node 和 npm bin/文件夹 (Provide Node & npm bin/ folder to PATH)=> 选择你在全局工具配置的nodejs 名  即可
复制代码
apollo

部署mysql
  1. # 拉取mysql镜像
  2. docker pull mysql:5.7.44
  3. # 创建mysql挂载目录
  4. mkdir -p /data/mysql/{log,data,conf.d}
  5. # 创建mysql配置文件
  6. echo "" > /data/mysql/my.cnf
  7. # 启动mysql容器
  8. docker run -d --restart=always --name mysql \
  9. -v /data/mysql/data:/var/lib/mysql \
  10. -v /data/mysql/log:/var/log/mysql \
  11. -v /data/mysql/conf.d:/etc/mysql/conf.d \
  12. -v /data/mysql/my.cnf:/etc/my.cnf \
  13. -p 3306:3306 \
  14. -e TZ=Asia/Shanghai \
  15. -e MYSQL_ROOT_PASSWORD=NCwkaR14 \
  16. mysql:5.7.44
复制代码
初始化数据库


  • 使用docker-compose 部署本地apollo - 高宏顺 - 博客园
  • 最终创建多环境数据库,ApolloConfigDB每个环境一个
拉取apollo镜像
  1. docker pull apolloconfig/apollo-portal
  2. docker pull apolloconfig/apollo-configservice
  3. docker pull apolloconfig/apollo-adminservice
复制代码
创建docker-compose.yaml
  1. # 创建目录
  2. mkdir -p /etc/apollo
  3. # 创建docker-compose文件,复制下面的ymal进去保存
  4. vim /etc/apollo/docker-compose.yaml
复制代码
  1. version: '4'
  2. services:
  3.   # DEV
  4.   apollo-configservice-dev:
  5.     image: apolloconfig/apollo-configservice   
  6.     environment:
  7.       # jdbc mysql 地址
  8.       SPRING_DATASOURCE_URL: jdbc:mysql://192.168.0.16:3306/ApolloConfigDB_DEV?useSSL=false&characterEncoding=utf8
  9.       SPRING_DATASOURCE_USERNAME: root
  10.       SPRING_DATASOURCE_PASSWORD: NCwkaR14 # 密码需要替换
  11.       SERVER_PORT: 8080
  12.     network_mode: host
  13.   apollo-adminservice-dev:
  14.     image: apolloconfig/apollo-adminservice   
  15.     depends_on:
  16.       - apollo-configservice-dev
  17.     environment:
  18.       # jdbc mysql 地址
  19.       SPRING_DATASOURCE_URL: jdbc:mysql://192.168.0.16:3306/ApolloConfigDB_DEV?useSSL=false&characterEncoding=utf8
  20.       SPRING_DATASOURCE_USERNAME: root
  21.       SPRING_DATASOURCE_PASSWORD: NCwkaR14 # 密码需要替换
  22.       SERVER_PORT: 8090
  23.     network_mode: host
  24.   apollo-configservice-pro:
  25.     image: apolloconfig/apollo-configservice   
  26.     environment:
  27.       # jdbc mysql 地址
  28.       SPRING_DATASOURCE_URL: jdbc:mysql://192.168.0.16:3306/ApolloConfigDB_PRO?useSSL=false&characterEncoding=utf8
  29.       SPRING_DATASOURCE_USERNAME: root
  30.       SPRING_DATASOURCE_PASSWORD: NCwkaR14 # 密码需要替换
  31.       SERVER_PORT: 8081
  32.     network_mode: host
  33.   apollo-adminservice-pro:
  34.     image: apolloconfig/apollo-adminservice   
  35.     depends_on:
  36.       - apollo-configservice-pro
  37.     environment:
  38.       # jdbc mysql 地址
  39.       SPRING_DATASOURCE_URL: jdbc:mysql://192.168.0.16:3306/ApolloConfigDB_PRO?useSSL=false&characterEncoding=utf8
  40.       SPRING_DATASOURCE_USERNAME: root
  41.       SPRING_DATASOURCE_PASSWORD: NCwkaR14 # 密码需要替换
  42.       SERVER_PORT: 8091
  43.     network_mode: host
  44.   apollo-portal:
  45.     image: apolloconfig/apollo-portal
  46.     depends_on:
  47.       - apollo-adminservice-dev
  48.       - apollo-adminservice-pro
  49.     environment:
  50.       # jdbc mysql 地址
  51.       SPRING_DATASOURCE_URL: jdbc:mysql://192.168.0.16:3306/ApolloPortalDB?useSSL=false&characterEncoding=utf8
  52.       SPRING_DATASOURCE_USERNAME: root
  53.       SPRING_DATASOURCE_PASSWORD: NCwkaR14 # 密码需要替换      
  54.       SERVER_PORT: 8070
  55.     network_mode: host
复制代码
执行docker 命令
  1. # 安装yaml
  2. docker-compose -f /etc/apollo/docker-compose.yaml up -d
  3. # 默认账号密码:用户名:apollo 密码:admin
  4. # 卸载yaml
  5. docker-compose -f /etc/apollo/docker-compose.yaml down
  6. # 重启yaml
  7. docker-compose -f /etc/apollo/docker-compose.yaml restart
复制代码
docker私有仓

拉取镜像
  1. # 拉取registry镜像
  2. docker pull registry
复制代码
修改docker的daemon文件
  1. "insecure-registries": ["192.168.0.16:5000"]
复制代码

  • 增加"insecure-registries"节点:

    • 直接IP+端口即可

重启docker
  1. # 重新加载文件
  2. systemctl daemon-reload
  3. # 重启docker
  4. systemctl restart docker
复制代码
registry配置文件

有两种方式,选择其中之一即可,无论哪种方式,先创建目录
  1. # 创建配置文件存放目录
  2. mkdir -p /data/docker/registry
复制代码
方式一:从容器内部复制
  1. # 启动一个容器
  2. docker run -d -p 5000:5000 --name registry2 -v /data/etc/registry:/var/lib/ registry registry
  3. # 复制容器内配置文件
  4. docker cp registry2:/etc/docker/registry/config.yml /data/docker/registry/config.yml
  5. # 删除容器
  6. docker rm registry2
  7. # 修改配置文件,增加Access-Control-Allow-Origin和Access-Control-Allow-Methods节点
  8. http:
  9.   addr: :5000
  10.   headers:
  11.     X-Content-Type-Options: [nosniff]
  12.     # 增加这一行
  13.     Access-Control-Allow-Origin: ['*']
  14.     # 增加这一行
  15.     Access-Control-Allow-Methods: ['*']
复制代码
方式二:使用现有文件


  • 文件名,命名为:config.yml
  • 复制以下内容到配置文件中
  1. # 命名为 config.yml
  2. version: 0.1
  3. log:
  4.   fields:
  5.     service: registry
  6. storage:
  7.   cache:
  8.     blobdescriptor: inmemory
  9.   filesystem:
  10.     rootdirectory: /var/lib/registry
  11. http:
  12.   addr: :5000
  13.   headers:
  14.     X-Content-Type-Options: [nosniff]
  15.     Access-Control-Allow-Origin: ['*']
  16.     Access-Control-Allow-Methods: ['*']
  17. health:
  18.   storagedriver:
  19.     enabled: true
  20.     interval: 10s
  21.     threshold: 3
复制代码
启动镜像仓容器
  1. # 启动容器
  2. docker run -d -p 5000:5000 --name registry \
  3. -v /data/docker/registry:/var/lib/registry \
  4. -v /data/docker/registry/config.yml:/etc/docker/registry/config.yml \
  5. --restart=always \
  6. registry
复制代码
测试容器是否启动成功
  1. # 测试是否部署成功
  2. curl -XGET http://192.168.0.16:5000/v2/_catalog
  3. # 若成功会返回:
  4. # {"repositories":[]}
复制代码
测试推送、拉取镜像
  1. # 测试推送镜像
  2. docker pull nginx
  3. # 打标签
  4. docker tag nginx:latest 192.168.0.16:5000/nginx
  5. # 上传
  6. docker push 192.168.0.16:5000/nginx
  7. # 校验镜像是否上传成功
  8. curl -XGET http://192.168.0.16:5000/v2/_catalog
  9. # 若推送成功,会返回:
  10. # {"repositories":["nginx"]}
  11. # 拉取镜像
  12. # 删除现有镜像
  13. docker rmi 192.168.0.16:5000/nginx:latest
  14. # 拉取镜像
  15. docker pull 192.168.0.16:5000/nginx
复制代码
es+kibana
  1. version: '3'
  2. services:
  3.   elasticsearch:
  4.     image: elasticsearch:8.16.2
  5.     restart: unless-stopped
  6.     container_name: elasticsearch
  7.     environment:
  8.       - "discovery.type=single-node"
  9.       - "cluster.name=docker-cluster"
  10.       - "network.host=0.0.0.0"
  11.       - "http.cors.enabled=true"
  12.       - "http.cors.allow-headers=Authorization,X-Requested-With,Content-Length,Content-Type"
  13.       - "xpack.security.enabled=false"
  14.       - "ELASTIC_PASSWORD=123456"
  15.       - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
  16.     volumes:
  17.       - /data/elasticsearch/data:/usr/share/elasticsearch/data
  18.       - /data/elasticsearch/logs:/usr/share/elasticsearch/logs
  19.       - /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins
  20.         #- /data/elasticsearch/config:/usr/share/elasticsearch/config # 容器内没权限获取这个文件夹权限
  21.     ports:
  22.       - "9200:9200"
  23.       - "9300:9300"
  24.     networks:
  25.       - elastic_net
  26.   kibana:
  27.     image: kibana:8.16.2
  28.     container_name: kibana
  29.     restart: unless-stopped
  30.     depends_on:
  31.       - elasticsearch
  32.     environment:
  33.       - "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
  34.       - "ELASTICSEARCH_USERNAME=elastic"
  35.       - "ELASTICSEARCH_PASSWORD=123456"
  36.       - "monitoring.ui.container.elasticsearch.enabled:true"
  37.     ports:
  38.       - "5601:5601"
  39.     networks:
  40.       - elastic_net
  41. networks:
  42.   elastic_net:
  43.     driver: bridge
复制代码
由于容器权限问题 需要先将部分文件
  1.   #- /data/elasticsearch/config:/usr/share/elasticsearch/config # 容器内没权限获取这个文件夹权限
复制代码

  • 先注释这行 将容器跑起来
  • 拷贝配置文件到本地
  • 创建用户
  • 卸载容器
  • 重新安装
拷贝文件
  1. docker cp elasticsearch:/usr/share/elasticsearch/data /opt/elasticsearch/
  2. docker cp elasticsearch:/usr/share/elasticsearch/plugins /opt/elasticsearch/
  3. docker cp elasticsearch:/usr/share/elasticsearch/config /opt/elasticsearch/
复制代码
创建用户
  1. 创建新账户
  2. elasticsearch-users useradd kibana
  3. 给账户授权
  4. elasticsearch-users roles -a superuser username
  5. elasticsearch-users roles -a kibana_system username
复制代码
 nuget

redis

拉取镜像
  1. docker pull redis
复制代码
创建映射目录
  1. mkdir -p /data/redis/{conf,data,log}
复制代码
启动redis
  1. docker run -d \
  2.   --name redis \
  3.   -p 6379:6379 \
  4.   -v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
  5.   -v /data/redis/data:/data \
  6.   -v /data/redis/log:/var/log/redis \
  7.   --restart=always \
  8.   redis redis-server --requirepass '!QA2ws3ed'
复制代码
nginx

拉取镜像
  1. docker pull nginx
复制代码
创建映射文件夹
  1. mkdir -p /data/nginx/{conf,html,log}
复制代码
创建容器 并copy 配置文件
  1. #生成容器
  2. docker run --name nginx -p 9001:80 -d nginx
  3. #将容器nginx.conf文件复制到宿主机
  4. docker cp nginx:/etc/nginx/nginx.conf /data/nginx/conf/nginx.conf
  5. #将容器conf.d文件夹下内容复制到宿主机
  6. docker cp nginx:/etc/nginx/conf.d /data/nginx/conf/conf.d
  7. #将容器中的html文件夹复制到宿主机
  8. docker cp nginx:/usr/share/nginx/html /data/nginx/
复制代码
卸载镜像
  1. docker stop nginx
  2. docker rm nginx
复制代码
安装镜像
  1. docker run -p 80:80 --name nginx \
  2. -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  \
  3. -v /data/nginx/conf/conf.d:/etc/nginx/conf.d  \
  4. -v /data/nginx/log:/var/log/nginx  \
  5. -v /data/nginx/html:/usr/shard/nginx/html -d \
  6. --restart=always \
  7. nginx
复制代码
在/data/nginx/conf/conf.d下创建jenkins.conf
  1. # 定义一个名为 jenkins_upstream 的上游服务器组
  2. server {
  3.     listen 80;
  4.     server_name jenkins.yych.me;
  5.     # 访问日志配置
  6.     access_log /var/log/nginx/jenkins.access.log;
  7.     error_log /var/log/nginx/jenkins.error.log;
  8.    
  9.     proxy_set_header Host $host;
  10.     proxy_set_header X-Real-IP $remote_addr;
  11.     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  12.     proxy_set_header X-Forwarded-Proto $scheme;
  13.     # SSL 配置(如果需要的话)
  14.     # listen 443 ssl;
  15.     # ssl_certificate /etc/nginx/ssl/myjdyun.com.crt;
  16.     # ssl_certificate_key /etc/nginx/ssl/myjdyun.com.key;
  17.     # ssl_protocols TLSv1.2 TLSv1.3;
  18.     # ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...';
  19.     # ssl_prefer_server_ciphers on;
  20.     # HSTS 配置(如果需要的话)
  21.     # add_header Strict-Transport-Security "max-age=31536000" always;
  22.     # 设置客户端请求体大小限制
  23.     client_max_body_size 100m;
  24.     client_body_buffer_size 100k;
  25.    
  26.      # 设置代理连接的超时时间
  27.     proxy_connect_timeout 60s;
  28.     proxy_send_timeout 60s;
  29.     proxy_read_timeout 60s;
  30.     # 设置根目录(如果需要的话)
  31.     # root /usr/share/nginx/html;
  32.     location / {
  33.         proxy_pass http://192.168.0.16:9080;
  34.         add_header Strict-Transport-Security "max-age=31536000";
  35.     }
  36.     # 如果需要,可以添加更多的 location 块来处理特定的路径或文件类型
  37.     # 错误页面配置
  38.     error_page 404 /404.html;
  39.     location = /404.html {
  40.         root /usr/share/nginx/html;
  41.         internal;
  42.     }
  43.     error_page 500 502 503 504 /50x.html;
  44.     location = /50x.html {
  45.         root /usr/share/nginx/html;
  46.     }
  47. }
复制代码
重启nginx
  1. docker restart  nginx
复制代码
 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册