Docker全环境操作手册(更新中)

Docker全环境操作手册

    • 编者寄语
    • 本文面向人群
    • 序言
    • 目录 (标准篇:1-5 / 中级篇:6-7 / 高级篇:8-12)
    • 正文
      • 1.如何理解docker
      • 2.如何安装docker
        • 2.1文件下载
        • 2.2虚拟机、操作系统安装
        • 2.3 docker前置环境安装
        • 2.4 docker安装
      • 3.如何快速使用docker(常用操作命令)
      • 4.如何管理自己的docker仓库
        • 4.1 私有仓库创建
        • 4.2 harbor仓库创建
      • 5.docker镜像创建和使用
      • 6.docker镜像、容器操作
        • 6.1 镜像基础情况查询
        • 6.2 如何启动镜像
        • 6.3 如何查询容器状态
        • 6.4 如何进入容器进行操作
        • 6.5 如何修改运行中的容器
      • 7.常用docker镜像、容器制作和使用
        • 7.1 tomcat
        • 7.2 mysql
        • 7.3 rabbitmq
        • 7.4 redis
        • 7.5 nacos
        • 7.6 elasticSearch
        • 7.7 nginx
        • 7.8 kuboard
        • 7.9 harbor
        • 7.10 gitlab
      • 8.如何使用dockerfile
        • 8.1 dockerfile语法详解
        • 8.2 制作一个Tomcat镜像
        • 8.3 制作一个JDK镜像
        • 8.4 制作一个CentOS镜像
      • 9.基于docker搭建各类基础环境
        • 9.1 nexus3
      • 10.如何使用docker-compose
      • 11.如何使用docker配合jekeins自动构建
      • 12.如何使用k8s编排docker

期望通过每一次分享,让技术的门槛变低,落地更容易。 —— around

编者寄语

  • 本文旨在解决不太会使用docker的同事如何快速的完成想要的应用服务环境搭建和使用。
  • 本文预计耗时2个月完成(2021-06-12日正式动笔,实际8.5日投入编写),将由浅入深讲述docker技术的理解和使用,尽可能将能使用到的功能做完整的说明。聚焦解决线下实际问题。
  • 期望通过本文能够完全让你懂得docker是什么东西,且能能够独立完成基础操作。对有余力的读者,期望能将高级篇部分掌握,加入公司平台部门共同参与底层框架和技术生态建设。
  • 作为一名技术人员,思维和技术底蕴是核心竞争力,科技创新的大海才更令人心潮澎湃。
  • 最后,如果本文中画的图比较丑,请私信我,强迫症受不了。
  • 本文是有版权的,仅限于学习使用。
  • 本文别名《Docker知识从入门到精通手册》

本文面向人群

  • 运维部门同事
  • 需要创建开发环境的同事
  • 有兴趣了解容器化技术的同事
  • 对CI/CD、DevOps模式感兴趣的同事

序言

一门新的技术和知识,想要快速的掌握,先得了解他的大概全貌,知道它长什么样,能有什么作用,环境需求是什么样的,有了这些理解后,我们才能更好的去学习它。

我个人一直学习的经验是,了解清楚后,通过目标倒推需要什么技术和基础做支撑,这样才能逐步构建自己的技术思维和设计逻辑,当然到目前为止我以此类方式逐渐发展到现在,掌握了架构设计的种种思路和想法,希望你也能跳出被业务的束缚,让自己的技术给业务插上翅膀,而不是被业务捆住。

程序员不过是门槛比较高罢了,本质都是考验人如何思考和解决问题的能力,我相信很多非技术岗位的人员如果具备了编码能力,很多程序员都会失业,希望各位不要停下学习和在某个领域精研的脚步。

希望透过本文,作者能作为很多人Docker入门到中级阶段的引路人,往后若有其他问题无法解决,请联系作者详细咨询即可。

目录 (标准篇:1-5 / 中级篇:6-7 / 高级篇:8-12)

  1. 如何理解docker
  2. 如何安装docker
  3. 如何快速使用docker(常用操作命令)
  4. 如何管理自己的docker仓库
  5. docker镜像创建和使用
  6. docker镜像、容器操作
  7. 常用docker镜像、容器制作和使用
  8. 如何使用dockerfile
  9. 基于docker搭建各类基础环境
  10. 如何使用docker-compose
  11. 如何使用docker配合jekeins自动构建
  12. 如何使用k8s编排docker

注:如果只是要理解并掌握大部分日常使用,学习第1、2、3、5章到第6章第3节即可

正文

1.如何理解docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

此外,我们需要弄清楚在学习docker中存在的一些特殊名词:

  • 镜像:实际上就是模板
  • 容器:基于镜像运行起来的操作系统
  • 挂载:两个操作系统之间同步文件和数据
  • 持久化:可以把想要留下来的资源目录保留
  • 映射:将两个不同网络连接起来
  • 端口:开放的服务精确指向,是URL的组成部分
  • 共享存储:就是将参与共享的系统文件目录映射到一个公共地址上

缺docker图文详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTIeq4Xq-1648103527322)(docker手册/main2.png)]

2.如何安装docker

本章节包含全部环境安装到快速执行傻瓜式安装过程。

2.1文件下载

文件内容包含VMwareWorkstation16.0CentOS-7-x86_64-Minimal-2009,其他的命令集合随意选择,可下载也可不下载。

# 先去阿里云盘下载资源(给阿里云盘打个广告,免费不限速)
https://www.aliyundrive.com/s/fhGvqgL3nUt
2.2虚拟机、操作系统安装

下载完成后,请先安装完我们的VMwareWorkstation16.0,接着打开软件,依次按如下操作。
我们新建一个虚拟机。
Docker全环境操作手册(更新中)_第1张图片

在新建面板的配置类型选择上直接选典型配置,然后下一步即可。
在下面弹出的操作系统iso选择界面按下图操作,找到之前从云盘上下载的CentOS-7-x86_64-Minimal-2009文件
Docker全环境操作手册(更新中)_第2张图片

在虚拟机存储路径设置上请注意,务必选择自己空间较多的盘符,否则后期扩容有些麻烦。
Docker全环境操作手册(更新中)_第3张图片

配置系统空间的时候,默认是20G,请尽量给多点,这个就是虚拟机的全部空间,后面我们会有很多操作都在里面做的,建议直接分到100G空间,它是按需增长的,不是创建完虚拟机后,你的电脑硬盘就会被瞬间占用100G,只是签了个协议,可以慢慢增加,一直到100G就不给了。
Docker全环境操作手册(更新中)_第4张图片

最后在配置硬件部分的设置,建议进入自定义硬件调整,设置合理的CPU内存,并可以删除掉打印机声卡硬件。(即便忘了做此步骤也行,后面可以自己修改的)
Docker全环境操作手册(更新中)_第5张图片

最后,点击完成后,虚拟机就创建启动了,下面开始在启动过程中配置相关内容。
请先根据下图选择安装选项,只有30秒默认,如果没来得及操作,就等待步骤2的自检后依然可以进入安装。
Docker全环境操作手册(更新中)_第6张图片

等待一段时候,会弹出如下界面设置语言,请通过移入光标或键盘将左侧选项栏拉倒最下选择中文,后单机继续。
Docker全环境操作手册(更新中)_第7张图片

接下来着重在下图界面上配置硬盘网络,如果不配置,后面操作更麻烦。
Docker全环境操作手册(更新中)_第8张图片

单击安装位置选项,进入后直接在左上角点击完成按钮即可完成保存。
单击网络和主机选项,进入后按下图操作,除打开网络开关外,还应记得保存当前分配的IPDNS信息,我这里的是IP=10.1.100.132DNS=10.1.100.2。(IP和DNS改网络要用)
Docker全环境操作手册(更新中)_第9张图片

完成上述配置后点击开始安装进行到下一步,在新界面上如下图,去编辑一下Root的密码,单击ROOT密码,填入自己设置的密码点击保存即可。
Docker全环境操作手册(更新中)_第10张图片

以上就完成了Centos系统虚拟机的安装,当系统启动完成后,进入系统,填入账号root,回车输入密码,即可完成登录。

当登录后记得修改网络信息,建议将动态IP改成静态IP便于后期使用。

# 修改网络
vi /etc/sysconfig/network-scripts/ifcfg-ens33

# 修改部分,找到对应的参数,将下面2个属性设置改成下文内容
BOOTPROTO="static" #dhcp
ONBOOT="yes"

# 到文件末尾,新添加下面4行,IPADDR=IP,GATEWAY和DNS1=DNS,
# 需要将前面的信息填到这里,也可以自己修改其他未被占用的IP,DNS不懂不建议改
IPADDR=10.1.100.132
NETMASK=255.255.255.0
GATEWAY=10.1.100.2
DNS1=10.1.100.2

# 修改完成后保存文本,重新加载网络设置即可生效
service network restart

以上,就是全部关于虚拟机和Centos系统的安装步骤。

2.3 docker前置环境安装
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
vi /etc/selinux/config
# 将下面这行参数属性改为disabled
SELINUX=disabled
# 完成上述操作重启
reboot

# 安装wget
yum install -y wget

# 备份默认的yum (二选一)
# 操作1
mv /etc/yum.repos.d /etc/yum.repos.d.backup
# 设置新的yum目录 
mkdir -p /etc/yum.repos.d

# 操作2
cp -rf /etc/yum.repos.d /etc/yum.repos.d.backup


# 下载阿里yum配置到该目录中,选择对应版本 
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# epel源为阿里云epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 验证文件是否存在
ll /etc/yum.repos.d/

# 重建缓存
yum clean all 
yum makecache

# 看一下yum仓库有多少包 
yum repolist
yum update


# 升级系统内核(取消)
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm  #https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install -y kernel-lt
grep initrd16 /boot/grub2/grub.cfg 
grub2-set-default 0
# 完成上述操作重启
reboot

# 网桥过滤
vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward=1
net.ipv4.ip_forward_use_pmtu = 0
# 生效命令 
sysctl --system 
# 查看效果 
sysctl -a|grep "ip_forward"

# 命令补全安装bash-completion
yum -y install bash-completion bash-completion-extras
# 使用bash-completion 
source /etc/profile.d/bash_completion.sh

# 关闭swap分区
swapoff -a 
# 永久关闭: 
vi /etc/fstab
# 将文件中的/dev/mapper/centos-swap这行代码注释掉 
#/dev/mapper/centos-swap swap  swap    defaults        0 0
# 确认swap已经关闭:若swap行都显示 0 则表示关闭成功 
free -m

2.4 docker安装
# 安装阿里云工具包
yum install -y yum-utils device-mapper-persistent-data lvm21
# 设置docker源为阿里云源,避免下载过慢
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fas

# 查看可选版本
yum list docker-ce --showduplicates | sort -r

# 安装docker,版本号可以对应上一个查询的内容
yum install -y docker-ce-19.03.15-3.el7

# 开启docker服务
systemctl start docker
systemctl status docker

# 安装阿里云镜像加速器
mkdir -p /etc/docker

# 配置docker加速下载地址,这个是我私人的阿里云地址,到2021-12月到期
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://7mf4ieir.mirror.aliyuncs.com"]
}
EOF

# 重启docker服务
systemctl daemon-reload
systemctl restart docker

# 查看修改后状态
docker info | grep Cgroup

# 设置自动启动
systemctl enable docker

至此,完成docker环境安装,查询docker状态systemctl status docker

3.如何快速使用docker(常用操作命令)

本章节将会把docker中存在的所有命令做一个介绍,并对细节进行描述,提供语法示例,下面镜像统一命名mysql:latest,容器名称统一命名为mysql-contain,压缩包统一命名mysql.tar

同时,对于以下示例,基本是按名称进行操作的,在docker中,既支持用名称也支持用ID,这里可以把镜像名称换成镜像ID去操作,也可以把容器名称换成容器ID去操作。

命令 用途 简单示例
docker search 查询image镜像 docker search mysql
docker pull 下载image镜像 docker pull mysql
docker images 查询本地仓库镜像列表 docker images
docker ps 查询本地容器列表 docker ps -a
docker load 加载tar包镜像 docker load < mysql.tar
docker import 加载tar包镜像(修改的东西还在) docker import mysql.tar
docker save 保存镜像tar包镜像 docker save -o mysql.tar mysql:latest
docker export 将容器读写层文件系统导出一个tar包 docker export -o mysql.tar mysql-contain
docker rmi 删除镜像 docker rmi mysql:latest
docker tag 修改镜像名称 docker tag mysql:latest around/mysql:new
docker rename 修改容器名称 docker rename mysql-contain mysql-new
docker build 基于Dockerfile构建镜像 docker build -f Dockerfile -t around/mysql:latest
docker run 启动docker镜像 docker run --name mysql -d mysql:latest
docker create 创建docker镜像但不启动 docker create --name mysql -d mysql:latest
docker stop 停止运行的容器 docker stop mysql-contain
docker start 启动容器 docker start mysql-contain
docker restart 重启容器 docker restart mysql-contain
docker exec 进入容器系统 docker exec -it mysql-contain bash
docker cp 容器与宿主机相互复制文件 docker cp /data/mysql mysql-contain:/var/lib/mysql
docker rm 删除容器 docker rm mysql-contain
docker stats 动态查看容器利用率 docker stats
docker logs 查看容器运行日志 docker logs mysql-contain
docker diff 查询容器启动以来新增文件 docker diff mysql-contain
docker inspect 查询容器信息 docker inspect mysql-contain

4.如何管理自己的docker仓库

4.1 私有仓库创建
  1. 下载镜像
docker pull docker.io/registry

下载完成后查看镜像docker images,有以下内容则是正确的。
Docker全环境操作手册(更新中)_第11张图片

  1. 创建仓库账号密码
# 生成目录
mkdir -p /data/docker/registry/auth
# around=用户名 4545888=密码   /data/docker/registry/auth/htpasswd = 存储账号密码的文件
docker run --entrypoint htpasswd registry -Bbn around 4545888  >> /data/docker/registry/auth/htpasswd

#如果出现下列报错情况,请参考后续步骤(若没有直接跳过本代码块)
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "htpasswd": executable file not found in $PATH: unknown.

#替换镜像地址,重新下载
docker pull registry:2.5
#替换镜像,重新执行生成账号密码
docker run --entrypoint htpasswd registry2.5 -Bbn around 4545888  >> /data/docker/registry/auth/htpasswd

接着去到htpasswd路径的地址查看文件内容是否生成了加密的账号密码。
在这里插入图片描述

  1. 配置启动仓库
# 生成配置目录
mkdir -p /data/docker/registry/config
# 创建配置文件
vi /data/docker/registry/config/config.yml

# 添加以下内容
version: 0.1
log:
  fields:
    service: registry
storage:
  delete:
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
threshold: 3

# 结束后,保存文件,启动镜像
docker run -d -p 5000:5000 --restart=always  --name=registry\
  -v /data/docker/registry/config/:/etc/docker/registry/ \
  -v /data/docker/registry/auth/:/auth/ \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v /data/docker/registry/:/var/lib/registry/ \
registry:2.5

  1. 访问仓库
# 编辑docker宿主机
vi /etc/docker/daemon.json
# 在原有文件内添加属性,IP填写当前宿主机的,端口根据之前启动docker外挂出来的端口一致
"insecure-registries":["127.0.0.1:5000"]

# 变成这样
{
  "registry-mirrors": ["https://7mf4ieir.mirror.aliyuncs.com"],
  "insecure-registries":["10.1.100.128:5000"]
}

# 最后重启docker服务
systemctl daemon-reload
systemctl restart docker


# 登录
docker login 10.1.100.128:5000 -uaround -p4545888

# 出现下列内容则成功
[root@localhost registry]# docker login 10.1.100.128:5000 -uaround -p4545888
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  1. 测试上传
# 修改镜像名称,与仓库前缀统一
docker tag registry:latest 10.1.100.128:5000/registry:6.11
# 将新标签镜像上传到私仓
docker push 10.1.100.128:5000/registry:6.11
# 删除本地镜像
docker rmi 10.1.100.128:5000/registry:6.11
# 将私仓的镜像拉下来
docker pull 10.1.100.128:5000/registry:6.11

# 通过以上测试即可完成仓库的镜像上传下载使用,后附校验操作流程图

Docker全环境操作手册(更新中)_第12张图片
Docker全环境操作手册(更新中)_第13张图片
Docker全环境操作手册(更新中)_第14张图片

4.2 harbor仓库创建

后续将补充一个使用Harbor创建镜像仓库服务的教程说明

5.docker镜像创建和使用

# 导入镜像,根据本地文件名导入
docker load < xxxx.tar

# 导出镜像,xxxx.tar=导出存储的文件名  后面空格接的全部是镜像名称
docker save -o xxxx.tar catalog/image1:tag catalog/image2:tag ...

注:导出的镜像不要通过imageid进行导出,否则导入时没有镜像名称了

# 删除镜像
docker rmi 

# 检索镜像
docker search xxx/image:tag

# 下载镜像
docker pull xxx/image:tag

# 构建镜像,注意后面有个“.”
docker build -f Dockerfile -t image:tag . 

# 上传镜像
docker push xxx/image:tag

6.docker镜像、容器操作

6.1 镜像基础情况查询
# 查询仓库已有镜像
docker images 
-a:列出本地所有的镜像。
-q:只显示镜像ID。可以与-a组合。
--digests:显示镜像的摘要信息。
--no-trunc:显示完整的镜像信息。

Docker全环境操作手册(更新中)_第15张图片

  • REPOSITORY:表示镜像的名称。(“/”前信息用于标记所属仓库、用户、源地址等)
  • TAG:镜像的标签。
  • IMAGE ID:镜像ID。
  • CREATED:镜像创建时间。
  • SIZE:镜像大小。
6.2 如何启动镜像

镜像作为一个小系统,也是需要启动才具有使用意义的,在我们不具备制作镜像的能力之前,我们先学会如何运行镜像。

# 启动命令
docker run
--name:给容器起一个名称
-p:设置端口号,<容器外端口>:<容器内端口> (允许出现多次)
-v:挂载,<容器外目录>:<容器内目录> (允许出现多次)
-e:环境变量,配置到系统里的属性。 (允许出现多次)
-d:镜像名称,表示启动指定的镜像

# 例子
docker run --name rabbitmq3 \
-v /data/rabbitmq:/var/lib/rabbitmq \
-e RABBITMQ_DEFAULT_USER=netiler \
-e RABBITMQ_DEFAULT_PASS=netilermanager \
-p 15672:15672 -p 5672:5672 \
-d rabbitmq:3.8.2-management

# 容器关闭
docker stop rabbitmq3
# 容器重启
docker restart rabbitmq3
# 容器删除 
docker rm rabbitmq3

注:如果容器不是关闭的是不能删除的,如果容器没删除,是不能删除对应镜像的

6.3 如何查询容器状态

容器运行起来之后,是需要进行管理和使用的,我们可以通过以下命令查看容器的状态和信息

# 查询容器
docker ps 
# 查询所有容器
docker ps -a
# 查询容器日志
docker logs <容器id>

6.4 如何进入容器进行操作

能够进入的容器,必须是启动正常的容器。

# 进入容器
docker exec -it <容器id或容器名称> bash

进入后相当于一个新的linux系统,在内部有相关的各种各样的软件已经安装,退出容器就比较简单了,执行exit即可。

6.5 如何修改运行中的容器

对运行中的容器,修改的最多的就是开放的端口号,这里以修改外放端口号为例子进行,将映射端口由2444变为3444。

# 查询运行中的容器
docker ps -a

Docker全环境操作手册(更新中)_第16张图片

注意查看容器对应的ContainerID值,为77f45e7327e8这里的id省略了很多字符。

接着进入目录/var/lib/docker/containers,查看下面的内容,你会发现运行的容器相关配置都存储在该目录下,但因是id文件夹名称,所以用上面查询到的ContainerID与文件夹开头一定字符进行匹配,相同则是该容器的设置目录。
Docker全环境操作手册(更新中)_第17张图片

之后进入该容器目录,找到hostconfig.json文件,该文件为修改端口映射的配置文件,我们进入其中找到源端口2444,将其改为3444
Docker全环境操作手册(更新中)_第18张图片

修改完成后保存即可退出,重启一下docker即可生效。

systemctl restart docker

以上,就完成了docker映射端口的更改。

7.常用docker镜像、容器制作和使用

本章节包含java开发过程中常见的各类中间件和运行环境搭建和正常使用。尽量做到提供完美无缝的环境提供和技术支持。

7.1 tomcat

关于tomcat正常能运行,除了需要tomcat软件外,还需要支持的jdk,目前主要稳定的是jdk1.8和tomcat8版本,我们围绕一下提供支持。

docker官方对tomcat镜像制作的文档见下网址:

https://hub.docker.com/_/tomcat

提供一个人的Dockerfile文件

#Dockerfile
FROM inovatrend/tomcat8-java8:latest

MAINTAINER around <[email protected]>

CMD /opt/tomcat/bin/shutdown.sh
RUN sed -i 's|"8080"|"7080"|' /opt/tomcat/conf/server.xml

# 需要本地给catalin.sh设置chmod权限
COPY catalina.sh /opt/tomcat/bin/catalina.sh
RUN ln -s /opt/tomcat/webapps /webapp

COPY ROOT /webapp/ROOT/
RUN rm -rf /webapp/ROOT/WEB-INF/classes/
COPY classes /webapp/ROOT/WEB-INF/classes/
COPY lib /webapp/ROOT/WEB-INF/lib/
COPY netiler /webapp/ROOT/WEB-INF/netiler/

VOLUME ["/webapp/ROOT/WEB-INF/resource","/webapp/ROOT/WEB-INF/pref"]

EXPOSE 8080
CMD ["catalina.sh", "run"]

提供常用命令集合

# 构建镜像
docker build -f Dockerfile.centos.tomcat -t goodrain.me/around-tomcat8:v1 .

# 启动镜像
docker run --name tomcat8 \
-v /nas/webapp/netiler/:/webapp \
-v /nas/logs:/opt/tomcat/logs \
-p 16888:6888 \
-p 8080:8080 \
-d around/tomcat-ce:v3

# 直接启动镜像
docker run --name tomcat8.1 -v/data/tomcat/webapp:/opt/tomcat/webapps -v /data/tomcat/logs:/opt/tomcat/logs -p 8080:8080 -d inovatrend/tomcat8-java8:latest
7.2 mysql

在mysql的使用上,如果是公司项目上,建议容器统一上到5.7版本,否则需要配置mysql以socket方式连接,不然会因为项目启动连接次数过多导致mysql服务崩溃。

以下为我个人提供的Dockerfile,请参考下面注释做使用

FROM mysql:5.7.27

# 配置用户名密码和默认数据库
ENV MYSQL_ROOT_PASSWORD=netilermanager
ENV MYSQL_USER=netiler
ENV MYSQL_PASSWORD=netilermanager

# 在dockerfile同目录创建一个mysqld.cnf,内容后面给出,此处宿主机的mysqld.cnf请一定给755权限,不然build失败
COPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf

# 给出一个初始化脚本,mysql5.7提供了默认初始化,如果没有会导致用户都无法登录,可以把你授权、创建账号写成sql脚本放进去
COPY sql/*.sql /docker-entrypoint-initdb.d/

补充mysqld.cnf文件,请直接以下面内容创建即可

[mysqld]
user		= mysql
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
port		= 3306
basedir		= /usr
datadir		= /var/lib/mysql
tmpdir		= /tmp
lc-messages-dir	= /usr/share/mysql
explicit_defaults_for_timestamp
lower_case_table_names=1
character-set-server=utf8
collation-server=utf8_general_ci
max_connections = 3500
max_connect_errors = 20
interactive_timeout = 288000
wait_timeout = 288000

default-storage-engine=INNODB
sort_buffer_size = 32M
join_buffer_size = 128M
max_allowed_packet = 1024M
tmp_table_size = 2097152
explicit_defaults_for_timestamp = 1
read_buffer_size = 16M
read_rnd_buffer_size = 32M
query_cache_type = 1
query_cache_size = 2M
table_open_cache = 1500
table_definition_cache = 1000
thread_cache_size = 768
back_log = 3000
open_files_limit = 65536
#skip-name-resolve

########innodb settings########
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_buffer_pool_size = 6144M
innodb_file_per_table = on
innodb_buffer_pool_instances = 20
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_log_file_size = 300M
innodb_log_files_in_group = 2
innodb_log_buffer_size = 16M

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address	= 127.0.0.1

#log-error	= /var/log/mysql/error.log

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
#!includedir /etc/mysql/conf.d/
7.3 rabbitmq
#官网
https://hub.docker.com/_/rabbitmq
#更多配置
https://www.rabbitmq.com/configure.html
#下载
docker pull rabbitmq:3-management
#也可通过此方式,额外下载插件
docker build -f Dockerfile.centos.rabbitmq -t goodrain.me/around-rabbitmq:v3 . 

#启动
docker run \
--name rabbitmq3 \
-v /data/rabbitmq:/var/lib/rabbitmq \
-e RABBITMQ_DEFAULT_USER=netiler \
-e RABBITMQ_DEFAULT_PASS=netilermanager \
-p 15672:15672 \
-p 5672:5672 \
-d rabbitmq:3-management
7.4 redis

直接在官方上抄他们的dockerfile,通过上述3、6章节进行docker build构建即可生成镜像,甚至可以不去构建,直接使用docker run

#官网
https://hub.docker.com/_/redis

# 启动一个镜像
docker run --name redis -p 6379:6379 -d redis:latest --appendonly yes
docker run  --name --name myredis redis redis-server /usr/local/etc/redis/redis.conf
docker run  --name redis -p 6379:6379 -d hczy-redis:v3 /usr/local/etc/redis/redis.conf
7.5 nacos
#新建logs目录
mkdir -p /mydata/nacos/logs/                      
mkdir -p /mydata/nacos/init.d/
#修改配置文件
vi /mydata/nacos/init.d/custom.properties        

对于custom.properties内容应该是

server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://xx.xx.xx.x:3306/nacos_devtest_prod?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=user
db.password=pass

nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
nacos.naming.distro.taskDispatchThreadCount=1
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.expireInstance=true

直接启动命令

docker  run \
--name nacos -d \
-p 8848:8848 \
--privileged=true \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=512m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /mydata/nacos/logs:/home/nacos/logs \
-v /mydata/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \
nacos/nacos-server
7.6 elasticSearch
# 基本启动命令
# -e "discovery.type=single-node" \  单节点集群
# -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ 制定运行参数,不然如果机器内存太小,启动后会非常卡顿
# --name 起个别名
docker run -p 9200:9200 -p 9300:9300 --name es7.8 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-d goodrain.me/around-elasticsearch:v1

#去当前的镜像中修改一下配置,这个ES_JAVA_OPTS参数指向的时候,自动根据空格截取了,导致只保留了-Xms512m,还是改成-Xms512m -Xmx512m

docker run -p 9200:9200 -p 9300:9300 --name es7.8 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-d elasticsearch:7.8.0

docker run -p 9200:9200 -p 9300:9300 --name aroundes7 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-d goodrain.me/around-elasticsearch:v2


# 查看集群健康状态
GET /_cat/health?v
# 查看节点健康状态
GET /_cat/nodes?v
# 查看索引信息
GET /_cat/indices?v

# Ik分词器版本要和ES和Kibana版本保持一致

# 进入容器
docker exec -it elasticsearch /bin/bash
#此命令需要在容器中运行
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.8.0/elasticsearch-analysis-ik-7.8.0.zip
# 退出容器,重启容器
docker restart elasticsearch
7.7 nginx

docker run --name mynginx \
-d -p 82:80  \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  \
-v /data/nginx/logs:/var/log/nginx \
-d docker.io/nginx

7.8 kuboard
# 管理节点
http://192.168.3.50:32567/

# 快速启动
docker run -d --restart=unless-stopped --name=kuboard \
-p 10080:80/tcp \
-p 10081:10081/udp \
-p 10081:10081/tcp \
-e KUBOARD_ENDPOINT="http://192.168.3.50:10080" \
-e KUBOARD_AGENT_SERVER_UDP_PORT="10081" \
-e KUBOARD_AGENT_SERVER_TCP_PORT="10081" \
-v /root/kuboard-data:/data/kuboard-data \
eipwork/kuboard:v3 


#基于K8s完成kuboard使用
https://blog.csdn.net/weixin_47153988/article/details/108882658?utm_medium=distribute.pc_feed_404.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&dist_request_id=1328775.4580.16176801215959527&depth_1-utm_source=distribute.pc_feed_404.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecas

# 执行
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml

# 生成token
[root@k8s-master01 yaml]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') 
Name:         kuboard-user-token-kr7d6
Namespace:    kube-system
Labels:       
Annotations:  kubernetes.io/service-account.name: kuboard-user
              kubernetes.io/service-account.uid: f487898d-15ea-4794-bc3d-720c037d15c9

Type:  kubernetes.io/service-account-token

# 将token填入kuboard
7.9 harbor
7.10 gitlab
# 下载
docker pull gitlab/gitlab-ce

# 启动命令
docker run --name gitlab -p 443:443 -p 80:80 -p 22:22  \
-v /data/server/gitlab/config:/etc/gitlab \
-v /data/server/gitlab/logs:/var/log/gitlab \
-v /data/server/gitlab/data:/var/opt/gitlab \
-d gitlab/gitlab-ce --restart=always 

# 配置
vi /data/server/gitlab/config/gitlab.rb

# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://10.1.100.129'
# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '10.1.100.129'
gitlab_rails['gitlab_shell_ssh_port'] = 22 # 此端口是run时22端口映射的222端口
:wq #保存配置文件并退出

# 配置
vi /data/server/gitlab/data/gitlab-rails/etc/gitlab.yml
vi /data/server/gitlab/data/nginx/conf/gitlab-http.conf

配置完成后重启

gitlab-ctl reconfigure    让gitbal重新读取配置
gitlab-ctl hup nginx      nginx更新配置
gitlab-ctl restart

# 进入管理
gitlab-rails console -e production

# 修改账号密码
user = User.where(id: 1).first
user.password = 'hczy2021'
user.password_confirmation = 'hczy2021'
user.save!

8.如何使用dockerfile

Dockerfile本质上就是一个脚本,它里头有特殊语法,也能支持linux命令操作,为此我们需要如何掌握好这个Dockerfile,关键就是学习语法,下面我们看一个Dockerfile

FROM mysql:latest

# 同 linux cd 
#WORKDIR /data/server/soft2

WORKDIR /data/server/soft2
xxxxxx

WORKDIR /data/server/mysql
xxxxx

# 开启执行linux命令
RUN mkdir -p /data/server

# cpoy config:指的是当前dockerfile所在的计算机目录
COPY config /webapp/config
COPY config2 /webapp/copy-test

ADD config2 /webapp/config2
ADD http://www.baidu.com/download/map.tar /webapp/config3


EXPOSE 7080

CMD ["catalina.sh", "run"]

8.1 dockerfile语法详解
命令 说明 语法示例
FROM 指定创建镜像,可以填写多个 FROM mysql:latest
LABEL 创建标签信息 LABEL user=around
MAINTAINER 作者信息,写在FROM后 MAINTAINER around [email protected]
COPY 当复制一个目录时,并不会复制目录本身,而是会递归复制其下子目录 COPY data /data/
ADD ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径 ADD [“src”,…“dest”]
WORKDIR 指定工作目录 WORKDIR /data/server
RUN 执行linux命令 RUN mkdir -p /data/server
CMD 类似于RUN指令,CMD指令也可用于运行任何命令或应用程序 CMD [“catalina.sh”, “run”]
ENTRYPOINT 类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一具单独的可执行程序 ENTRYPOINT [“docker-entrypoint.sh”]
EXPOSE 指定开放端口 EXPOSE 8080
ENV 设置环境变量 ENV default_password 123456
ARG 设置dockerfile作用域内的变量 ARG namespace=mysql
USER 指定运行docker的user或userid信息 USER around
ONBUILD 让docker镜像私有package配置,后正常接上述所有语法 ONBUILD COPY ./package.json /app
8.2 制作一个Tomcat镜像

以tomcat为例

FROM goodrain.me/hczy-tomcat8-jdk8-basic:v8

ARG NETILER_SPACE=im
ARG NETILER_PORT=7102

CMD /opt/tomcat/bin/shutdown.sh

RUN sed -i 's|"8080"|"7102"|' /opt/tomcat/conf/server.xml

RUN rm -rf /webapp/ROOT/WEB-INF/classes/*

COPY deploy/classes/ /webapp/ROOT/WEB-INF/classes/
COPY deploy/jar/lib/ /webapp/ROOT/WEB-INF/lib/
COPY deploy/jar/netiler/ /webapp/ROOT/WEB-INF/netiler/

RUN rm -rf /webapp/ROOT/WEB-INF/lib/leadal-netiler-3.0.0-SNAPSHOT.jar

#VOLUME ["/webapp/${NETILER_SPACE}/WEB-INF/resource","/webapp/${NETILER_SPACE}/WEB-INF/pref"]

EXPOSE ${NETILER_PORT}
CMD ["catalina.sh", "run"]

8.3 制作一个JDK镜像
FROM openjdk:8-jdk-alpine

MAINTAINER around

ENV FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true
ENV TimeZone=Asia/Shanghai
ENV LANG=zh_CN.UTF-8

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk add --no-cache tzdata \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && rm -rf /var/cache/apk/* /tmp/* /var/tmp/* $HOME/.cache

# createUser
RUN useradd --create-home --no-log-init --shell /bin/bash leadal \
    && echo 'leadal:leadal' | chpasswd

# use user
# USER leadal
RUN mkdir -p /webapp \
    && mkdir -p /libs 

VOLUME /webapp/WEB-INF/resource
VOLUME /webapp/WEB-INF/pref


#ARG JAR_FILE=xxx.jar

#ADD ${JAR_FILE} app.jar

#ENTRYPOINT ["java","-jar","app.jar","-Djava.ext.dirs=libs"]

#EXPOSE 9999


8.4 制作一个CentOS镜像
FROM centos:7

#AUTHOR
MAINTAINER around <[email protected]>

#安装wget
RUN yum install -y wget

#更换yum源 
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
	&& wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
	&& yum clean all \
	&& yum makecache 
	
#安装工具集
RUN yum install -y zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools git

#环境变量
ENV JAVA_VERSION 8u281
ENV JAVA_BUILD b01
ENV JAVA_HOME /usr/java/jdk1.8.0_281

# http://download.oracle.com/otn-pub/java/jdk/8u281-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u281-linux-x64.rpm
# 安装jdk
RUN curl -v -j -k -L -H "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION}-${JAVA_BUILD}/090f390dda5b47b9b721c7dfaa008135/jdk-${JAVA_VERSION}-linux-x64.rpm > /tmp/jdk-linux-x64.rpm && \
    yum -y install /tmp/jdk-linux-x64.rpm && \
    rm /tmp/jdk-linux-x64.rpm && \
    yum clean all

#安装 graphicsImagick
#1.创建目录
RUN mkdir -p /home/download

#2.安装libjpeg,libpng...
RUN yum install -y libpng-devel libjpeg-devel libtiff-devel jasper-devel freetype-devel

#3.安装graphicsImagick
WORKDIR /home/download
RUN wget http://ftp.icm.edu.pl/pub/unix/graphics/GraphicsMagick/1.3/GraphicsMagick-1.3.25.tar.gz
RUN tar -xvf GraphicsMagick-1.3.25.tar.gz
WORKDIR /home/download/GraphicsMagick-1.3.25
RUN ./configure \
    && make && make install

#4.安装ffmpeg
WORKDIR /home/download
#ADD ffmpeg-release-64bit-static.tar.xz /home/download/
# https://www.ffmpeg.org/releases/ffmpeg-3.2.8.tar.gz
# ffmpeg-static下载的版本可能和配置的不对应
RUN wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz
RUN tar -xvf ffmpeg-release-64bit-static.tar.xz
WORKDIR /home/download/ffmpeg-3.3.4-64bit-static
RUN cp {ffmpeg,ffmpeg-10bit,ffprobe} /usr/bin

#5.安装libreoffice
WORKDIR /home/download
# ADD LibreOffice_5.2.5_Linux_x86-64_rpm.tar.gz /home/download/
# RUN wget http://download.documentfoundation.org/libreoffice/stable/5.3.6/rpm/x86_64/LibreOffice_5.3.6_Linux_x86-64_rpm.tar.gz
RUN wget http://ftp.rz.tu-bs.de/pub/mirror/tdf/tdf-pub/libreoffice/stable/5.2.5/rpm/x86_64/LibreOffice_5.2.5_Linux_x86-64_rpm.tar.gz
RUN tar -xvf LibreOffice_5.2.5_Linux_x86-64_rpm.tar.gz
WORKDIR /home/download/LibreOffice_5.2.5.1_Linux_x86-64_rpm
RUN yum localinstall -y RPMS/*.rpm
RUN yum install -y cairo cups-libs libSM
ENV DISPLAY :0.0

#6.安装xpdf,swftools
WORKDIR /home/download

# RUN wget ftp://ftp.foolabs.com/pub/xpdf/xpdfbin-linux-3.04.tar.gz
# RUN tar -xvf xpdfbin-linux-3.04.tar.gz
ADD xpdfbin-linux-3.04.tar.gz /home/download/
WORKDIR /home/download/xpdfbin-linux-3.04
RUN cp bin64/* /usr/bin
# RUN wget http://www.swftools.org/swftools-2013-04-09-1007.tar.gz
# RUN tar -xvf swftools-2013-04-09-1007.tar.gz
ADD swftools-2013-04-09-1007.tar.gz /home/download/
WORKDIR /home/download/swftools-2013-04-09-1007
RUN ./configure --prefix=/usr/swftools && \
    make && make install

#7.设置环境变量
ENV PATH /usr/swftools/bin/:$PATH
ENV OFFICE_ROOT /opt/libreoffice5.2

#8.安装字体,避免转换中文乱码
ADD simsun.ttc /usr/share/fonts/
RUN chmod 644 /usr/share/fonts/simsun.ttc & fc-cache -fv

9.基于docker搭建各类基础环境

9.1 nexus3

先下载官方镜像

docker pull sonatype/nexus3

接着执行启动,这里建议挂载目录调整一下

docker run --name nexus \
-p 8081:8081 \
-v /data/nexus3:/var/nexus-data \
--restart=always -d sonatype/nexus3

10.如何使用docker-compose

11.如何使用docker配合jekeins自动构建

12.如何使用k8s编排docker

你可能感兴趣的:(java,linux,docker,docker环境,镜像仓库,容器,docker学习)