docker

lishihuan大约 21 分钟

docker

docker汉化open in new window

https://www.learnfk.com/docker/docker.htmlopen in new window

检查端口是否被占用 sudo netstat -tuln | grep 15672

1. Docker

https://docs.docker.com/engine/install/centos/open in new window

https://www.learnfk.com/docker/docker.htmlopen in new window

https://blog.csdn.net/qq_39997939/article/details/131005939open in new window

https://blog.csdn.net/qq_27820913/article/details/128156684open in new window

https://blog.csdn.net/qq_39997939/article/details/122796687open in new window

学习目标

  • 能够知道什么是docker
  • 能够使用命令启动或停止docker
  • 能够使用docker镜像相关命令
  • 能够使用docker容器相关命令
  • 能够部署MySQL、Tomcat、Nginx、Redis
  • 能够修docker-compose模板文件启动容器
  • 能够将容器保存为镜像
  • 能够知道Dockerfile的常用命令

常用命令

## 后面启动
docker start <container_id>
## 查看日志
docker logs ntainer_id>
# 关闭
docker stop <container_id>
# 设置自动启动
docker update --restart=always <container_id>

安装&卸载

检查是否启动ps aux |grep docker

安装

一、更新你的系统 首先,确保你的操作系统是最新的。这可以通过运行下面的命令来完成: yum update -y

二、安装 Docker CentOS 7 的默认仓库中已经包含 Docker,你可以直接使用 yum 命令进行安装。不过为了确保能安装到最新版本的 Docker,我们将使用 Docker 的官方仓库进行安装。

首先安装一些必要的包:

yum install -y yum-utils device-mapper-persistent-data lvm2

然后添加 Docker 仓库:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

注:如果出现如下错误,这个是因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过命令yum -y install yum-utils安装就可以了

[root@ecs-1pku3 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager:找不到命令
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

现在,你可以安装 Docker 了:

yum install docker-ce

三、启动 Docker 并设置开机启动

安装完 Docker 后,我们需要启动 Docker:

systemctl start docker ## 启动docker

我们也可以让 Docker 在启动时自动运行

systemctl enable docker ## 设置开启启动
## 验证docker 是否开机启动
systemctl list-unit-files | grep docker

四、验证 Docker 安装 为了验证 Docker 是否正确安装,你可以运行一个测试的 Docker 镜像。例如,你可以运行一个 Hello World 镜像:

docker run hello-world

如果 Docker 安装正确,你将看到一条消息告诉你你的 Docker 工作正常。

检查是否安装成功

  1. 检查 Docker 版本:在终端中运行以下命令,可以查看 Docker 的版本信息:
docker version

如果成功显示了 Docker 的版本信息,则说明 Docker 已经成功安装。

  1. 运行一个简单的容器:使用以下命令来拉取并运行一个简单的容器,以验证 Docker 是否能正常工作:
docker run hello-world

如果您看到类似于 "Hello from Docker!" 的输出,那么说明 Docker 已经正确安装并且可以正常运行容器。

  1. 查看正在运行的容器:可以使用以下命令来查看当前正在运行的 Docker 容器:
docker ps
docker ps -a

如果您看到类似于 "CONTAINER ID"、"IMAGE"、"COMMAND" 等列的输出,那么说明有一个或多个容器正在运行。

  1. 运行更多容器:您可以选择尝试拉取和运行其他容器镜像,例如 Nginx、MySQL、Redis 等。通过运行这些容器并验证其功能,也能进一步确认 Docker 的安装和配置是否正确。

卸载

# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源  . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

设置开机启动-补充

docker update --restart=always 容器ID 命令用于设置容器的重启策略为 "always",即无论何时容器停止运行,都会自动重新启动。

systemctl enable docker 命令用于在 Linux 系统中启用 Docker 服务,并将其设置为开机启动。这样,在系统启动时,Docker 服务会自动启动,从而使得容器能够在系统启动后继续运行。

因此 一个命令是设置容器在服务停止后自动重启,另一个命令是设置 Docker 服务在系统启动时自动启动。

查看开机自启项列表 systemctl list-unit-files

设置docker服务开机启动 systemctl enable docker

查看docker服务是否开机启动 systemctl list-unit-files | grep docker

设置docker容器的自动重启 需添加restart参数 docker run -d --restart=always

参数含义如下: --restart=always # 表示容器退出时,docker会总是自动重启这个容器 --restart=on-failure:3 # 表示容器的退出状态码非0(非正常退出),自动重启容器,3是自动重启的次数。超过3此则不重启 --restart=no # 默认值,容器退出时,docker不自动重启容器 --restart=unless-stopped # 表示容器退出时总是重启,但是不考虑docker守护进程运行时就已经停止的容器

如果你的容器已经启动,可使用以下命令设置开机自启 docker update --restart=always 容器ID

删除容器


docker rm -f 容器id

执行报错

解决docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“:open in new window net/http: request canc

首先进入/etc/docker/daemon.json文件

然后在里面加入下面的配置

{
  "registry-mirrors": [
		"https://docker.registry.cyou",
		"https://docker-cf.registry.cyou",
		"https://dockercf.jsdelivr.fyi",
		"https://docker.jsdelivr.fyi",
		"https://dockertest.jsdelivr.fyi",
		"https://mirror.aliyuncs.com",
		"https://dockerproxy.com",
		"https://mirror.baidubce.com",
		"https://docker.m.daocloud.io",
		"https://docker.nju.edu.cn",
		"https://docker.mirrors.sjtug.sjtu.edu.cn",
		"https://docker.mirrors.ustc.edu.cn",
		"https://mirror.iscas.ac.cn",
		"https://docker.rainbond.cc"
	]
}

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com",
    "https://reg-mirror.qiniu.com"
  ]

}

没验证

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

然后在终端重新启动一下docker

systemctl daemon-reload
systemctl restart docker

目前由于被强,下载非常慢可以使用 阿里的镜像源

# step 1: 安装必要的一些系统工具 
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 
# Step 2: 添加软件源信息 
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
# Step 3: 更新并安装Docker-CE 
sudo yum makecache fast sudo yum -y install docker-ce 
# Step 4: 开启Docker服务 
sudo service docker start 
# Step 5: Docker-compose安装 
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
sudo chmod +x /usr/local/bin/docker-compose 
docker-compose -v

#下载完成后,给 docker-compose 二进制文件添加执行权限:
sudo chmod +x /usr/local/bin/docker-compose

docker拉取镜像超时

https://blog.csdn.net/mjh1667002013/article/details/140001206open in new window

docker拉去镜像超时拉去不下来,报错如下

error pulling image configuration: download failed after attempts=6: dial tcp 47.88.58.234:443: connect: connection refused

解决:设置国内镜像

1.创建/etc/docker目录

sudo mkdir -p /etc/docker

2.创建docker镜像配置文件

2.创建docker镜像配置文件

sudo tee /etc/docker/daemon.json <<-'EOF'

 {
  "registry-mirrors": [
          "https://ox288s4f.mirror.aliyuncs.com",
          "https://registry.docker-cn.com",
          "http://hub-mirror.c.163.com",
          "https://mirror.ccs.tencentyun.com"
  ]
}

EOF

3.重启

sudo systemctl daemon-reload
sudo systemctl restart docker
# 或者
sudo service docker restart

4.检查是否生效

docker info

无法安装docker-compose

使用本地安装的方式

docker-compose-linux-x86_64

指定目录下下载,然后将文件迁移到 /usr/local/bin/docker-compose

sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version

  • 卸载重新安装
rm /usr/local/bin/docker-compose

docker desktop

C:\Users\lihuan\.docker\daemon.json

汉化open in new window

查询下面的错误表示需要登录

Error response from daemon: Head "https://registry-1.docker.io/v2/library/mongo/manifests/4.0": unauthorized: incorrect username or password

修改 config.json 文件,添加如下内容:(C:\Users\lihuan\.docker\config.json

json{
  "credStore": "wincred"
}

这样,Docker 会使用 Windows Credential Manager 存储你的登录信息,避免每次输入。

2. docker 离线部署

docker安装需要.zip

# 查看本机已安装docker依赖
yum list installed | grep docker

# 卸载安装的依赖
yum remove docker-buildx-plugin.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64 docker-compose-plugin.x86_64 docker-ce-rootless-extras.x86_64

# 安装docker
sudo rpm -ivh docker-compose-plugin-2.3.3-3.el7.x86_64.rpm
sudo rpm -ivh docker-buildx-plugin-0.10.2-1.el7.x86_64.rpm
sudo rpm -ivh docker-ce-cli-24.0.0-1.el7.x86_64.rpm
sudo rpm -ivh containerd.io-1.6.10-3.1.el7.x86_64.rpm
sudo rpm -ivh docker-ce-24.0.0-1.el7.x86_64.rpm docker-ce-rootless-extras-20.10.0-3.el7.x86_64.rpm

# 设置docker开机自启并启动docker
systemctl enable docker && systemctl start docker

redis

https://blog.csdn.net/weixin_42400413/article/details/125018387open in new window

  • 拉取镜像
docker pull redis
  • 创建redis配置文件

启动前需要先创建Redis外部挂载的配置文件 ( /home/redis/conf/redis.conf ) 之所以要先创建 , 是因为Redis本身容器只存在 /etc/redis 目录 , 本身就不创建 redis.conf 文件 当服务器和容器都不存在 redis.conf 文件时, 执行启动命令的时候 docker 会将 redis.conf 作为目录创建 , 这并不是我们想要的结果 。

## 创建目录
mkdir -p /home/redis/conf
## 创建文件
touch /home/redis/conf/redis.conf
  • 创建Redis容器并启动
docker run \
--name redis \
-p 6379:6379 \
--restart unless-stopped \
-v /home/redis/data:/data \
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf \
--requirepass "123456" \
--appendonly yes
 
命令中所有 冒号 前面的是主机配置 , 冒号 后面的是redis容器配置 。
–restart unless-stopped : 在docker重启时重启当前容器。但不包含docker重启时已停止的容器。
 
–name redis 启动容器的名字
-d   后台运行
-p 6379:6379   将容器的 6379 端口映射到主机的 6379 端口
–restart unless-stopped	 容器重启策略
-v /home/redis/data:/data	 将Redis储存文件夹挂载到主机
-v /home/redis/conf/redis.conf:/etc/redis/redis.conf 	将配置文件挂载到主机
redis	启动哪个版本的 Redis
redis-server /etc/redis/redis.conf redis容器中设置redis-server每次启动读取/etc/redis/redis.conf 这个配置为准
\  shell 命令换行
--requirepass 设置密码
--appendonly yes	在redis容器启动redis-server服务器并打开Redis持久化配置

启动

  • docker ps //运行容器;
  • docker ps -a //所以容器
  • docker start ip 启动
12123
12123
  • 执行“netstat -anp |grep 3306”命令,如果3306端口后方出现“LISTEN”,则表示该端口被占用。2、执行“netstat -nultp”命令,如果3306端口后有“LISTEN”,则 表示该端口被占用。
  • kill -9 pid //杀掉进程

设置 redis 密码

RedisDesktopManager 能访问redis,同时 telnet 也能ping 通,项目无法访问则有可能是没有设置密码

#1.进入redis的容器
docker exec -it 容器ID bash

#2.进入redis目录
cd /usr/local/bin

#3.运行命令:
redis-cli

#4.查看现有的redis密码:
config get requirepass

#5.设置redis密码
config set requirepass 密码

nginx

docker 安装nginx

https://blog.csdn.net/SmallCat0912/article/details/132061625open in new window

重启

docker restart nginx

RabbitMQ

docker ps

docker ps -a

安装

  1. 下载 RabbitMQ 镜像:在终端或命令行中运行以下命令来下载 RabbitMQ 镜像:

    docker pull rabbitmq:3-management
    

    这将下载带有 RabbitMQ 3 版本和管理插件的镜像。

  2. 创建并运行 RabbitMQ 容器:使用以下命令创建并运行 RabbitMQ 容器:

    docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=always rabbitmq:3-management
    # 下面这个没有尝试,涉及到 stomp 端口
    docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 -p 61613:61613 -p 15674:15674 -p 1883:1883 --restart=always --hostname=rabbitmq rabbitmq:3-management
    
    

    这将创建一个名为 rabbitmq 的容器,并将主机端口 5672 映射到容器内部的 RabbitMQ 端口 5672,将主机端口 15672 映射到容器内部的 RabbitMQ 管理界面端口 15672

    使用 --restart=always 参数将容器设置为始终自动重启。

  3. 访问 RabbitMQ 管理界面:打开你的浏览器,访问 http://localhost:15672,你将能够通过 RabbitMQ 管理界面进行进一步的配置和管理。默认的登录凭据为 guest/guest

启动&关闭

启动 RabbitMQ 容器:

如果容器状态仍然显示为 "Created",表示容器启动 ,Up表示容器启动正常

docker start rabbitmq
# 或者
docker start <容器名称或ID>
# 关闭
docker stop rabbitmq
# 删除
docker rm rabbitmq
docker ps  # 执行该命令后,检查容器的状态是否变为 "Up" 或 "Exited" 并且没有错误消息。
docker logs rabbitmq # 查询日志
image-20230829092123603
image-20230829092123603

设置自动启动

  1. 首先,停止已经运行的 RabbitMQ 容器:
docker stop <container_id>

<container_id> 替换为你 RabbitMQ 容器的实际 ID 或名称。

  1. 然后,使用 docker update 命令来设置容器的自启动:
docker update --restart=always <container_id>

同样,将 <container_id> 替换为你 RabbitMQ 容器的实际 ID 或名称。

异常记录

报错

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

  1. 检查 Docker 服务是否正在运行:运行以下命令来检查 Docker 服务的状态:

    ps aux |grep docker
    

    如果 Docker 服务未运行,可以使用以下命令启动它:

    sudo systemctl start docker
    
  2. 没有足够的权限:如果你不是 root 用户,请确保你的用户具有适当的权限来运行 Docker 命令。你可以通过将用户添加到 docker 组来授予 Docker 权限:

    sudo usermod -aG docker your-user
    

    重启计算机后,你的用户将具有运行 Docker 命令的权限。

  3. 错误的 Docker 守护程序套接字文件权限:请确保 /var/run/docker.sock 文件的权限正确。一般来说,该文件的所有者应该是 root 用户,并且具有 rw(读写)权限。你可以使用以下命令来更正权限问题:

    sudo chown root:root /var/run/docker.sock
    sudo chmod 666 /var/run/docker.sock
    
  4. Docker 服务配置错误:如果上述步骤都没有解决问题,可能存在 Docker 服务的配置错误。你可以尝试停止 Docker 服务并重新启动它:

    sudo systemctl stop docker
    sudo systemctl start docker
    

完成上述步骤后,请再次运行 docker ps -a 命令以查看容器的状态。

无法访问管理界面

如果无法通过访问 http://localhost:15672open in new window 打开 RabbitMQ 管理界面,可能有几个原因导致:

  1. RabbitMQ 容器未在运行中:确保 RabbitMQ 容器正在运行。你可以使用以下命令检查容器状态:

    docker ps
    

    如果容器未在运行中,请使用以下命令启动容器:

    docker start <容器名称或ID>
    # 或者
    docker start rabbitmq
    
  2. 端口映射错误:确认你的容器正确映射了主机端口 15672 到容器内部的端口 15672。你可以使用以下命令查看容器的端口映射情况:

    docker ps -a
    

    如果没有正确映射端口,你可以停止并删除现有的 RabbitMQ 容器,然后重新创建并运行一个新的容器,确保使用 -p 15672:15672 参数来进行端口映射。

  3. 防火墙或网络问题:检查防火墙设置,确保允许主机的 15672 端口的入站连接。如果你运行的是云服务(如 AWS、Azure 等),还需要检查网络安全组或网络 ACL 设置。

  4. Docker 守护进程的网络配置:如果你在远程服务器上使用 Docker,请确保 Docker 守护进程的网络配置允许远程访问。你可以参考 Docker 官方文档中关于远程访问的配置指南。

请注意,如果你正在使用虚拟机或远程服务器,请使用相应的 IP 地址替代 localhost。例如,如果你正在使用虚拟机的 IP 地址为 192.168.74.131,则应该尝试访问 http://192.168.74.131:15672/open in new window

添加延迟插件

rabbitmq 添加延迟插件

参考:https://www.cnblogs.com/qq1445496485/p/16549905.html
下载:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

​ ​ [root@node1 home]# docker cp rabbitmq_delayed_message_exchange-3.8.0.ez rabbitmq:/plugins ​ [root@node1 home]# docker exec -it rabbitmq bash ​ root@myRabbit:/# cd plugins ​ root@myRabbit:/plugins# ls ​ root@myRabbit:/plugins# rabbitmq-plugins enable rabbitmq_delayed_message_exchange

说明这里不是运行 rabbitmq-plugins enable rabbitmq_delayed_message_exchange-3.8.0.ez 否则会出现 Error: {:plugins_not_found, [:"rabbitmq_delayed_message_exchange-3.9.0.ez"]}

mv 文件名 新文件名 
rm -rf 需要删除的文件名称	



查询Docker下服务
	docker ps
重启RabbitMq容器:docker restart {rabbitmq容器id}
启动RabbitMq容器:docker exec -it {rabbitmq容器id} /bin/bash

userLocationDirectQueue sysDelayDirectQueue

docker psdocker ps -a 命令区别

docker psdocker ps -a 命令都是用于查看 Docker 容器的状态和信息,但它们有一些区别。

  • docker ps:该命令用于列出正在运行的容器。默认情况下,只会显示正在运行中的容器,也就是状态为 "Up" 的容器。docker ps 命令等效于 docker ps -f status=running
  • docker ps -a:该命令用于列出所有容器,包括正在运行的容器和已停止的容器。它会显示容器的详细信息,包括容器 ID、镜像、启动命令、创建时间、状态等。

总结而言:

  • docker ps 只显示正在运行的容器。
  • docker ps -a 显示所有容器,无论其状态是否为正在运行。

RocketMQ

https://blog.csdn.net/gsycwh/article/details/131443114open in new window

https://blog.csdn.net/qq_43600166/article/details/136187969open in new window

https://gitcode.csdn.net/6628b33ec46af9264276a80d.htmopen in new window

docker环境下安装rocketmq以及rocketmq-console可视化界面

1. 拉取镜像

RocketMQ镜像

docker pull rocketmqinc/rocketmq:4.3.2

Console可视化平台镜像

# 拉取镜像
docker pull pangliang/rocketmq-console-ng
# docker pull styletang/rocketmq-console-ng:1.0.0

# 修改镜像名字
docker tag 【镜像id】 rocketmq-console:1.0.0

注:这里如果下载超时,可以通过设置国内的镜像 docker拉取镜像超时

2. 挂载目录

1、创建nameserver挂载目录

mkdir -p /data/RocketMQ/namesrv/logs /data/RocketMQ/namesrv/store

注: logs:是nameserver的日志目录,store:是nameserver的数据目录 2、创建broker目录

mkdir -p /data/RocketMQ/broker/logs  /data/RocketMQ/broker/store /data/RocketMQ/broker/conf

注: logs:是broker的日志目录,store:是broker的数据目录,conf是broker的配置信息目录

3、编辑broker.conf配置

cd /data/RocketMQ/broker/conf
vi broker.conf
# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#文件保留时间,默认48小时 (单位是小时)
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址,也就是centosOS7的服务ip
brokerIP1 = 192.168.75.129
# 磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk full
diskMaxUsedSpaceRatio=95

注意:如果【brokerIP1 】不添加你的外网ip,则在链接服务时会链接不上。

三、启动服务 1、启动nameserver

docker run -d --restart=always --name rocketmq_nameserver -p 9876:9876  -v  /data/RocketMQ/namesrv/logs:/root/logs  -v /data/RocketMQ/namesrv/store:/root/store  -e "MAX_POSSIBLE_HEAP=100000000"  rocketmqinc/rocketmq sh mqnamesrv
参数说明
-d以守护进程的方式启动
- -restart=alwaysdocker重启时候容器自动重启
- -name rocketmq_nameserver设置容器名字
-p 9876:9876把容器内的端口9876挂载到宿主机9876上面
-v把容器内的目录挂载到宿主机上,此处的目录应为第二步设置的目录
-e “MAX_POSSIBLE_HEAP=100000000”设置容器的最大堆内存为100000000
rocketmq : 4.3.2镜像名称 :版本号
sh mqnamesrv启动nameserv服务

2、启动broker

docker run -d --restart=always --name rocketmq_broker  --link rocketmq_nameserver:namesrv -p 10911:10911 -p 10909:10909  -v /data/RocketMQ/broker/logs:/root/logs -v /data/RocketMQ/broker/store:/root/store  -v  /data/RocketMQ/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf  -e "NAMESRV_ADDR=namesrv:9876"  -e "MAX_POSSIBLE_HEAP=200000000"  rocketmqinc/rocketmq sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf 
参数说明
- -link rocketmq_nameserver:namesrv和rocketmq_nameserver容器通信(跟nameserv容器名称对应
- -name rocketmq_nameserver设置容器名字
-e “NAMESRV_ADDR=namesrv:9876”指定namesrv的地址为本机namesrv的ip地址:9876
sh mqbroker -c /opt/rocketmq-4.3.2/conf/broker.conf指定配置文件启动broker节点

3、启动可视化平台

docker run -d --restart=always --name rocketmq_console -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.75.129:9876 -Dcom.rocketmqsendMessageWithVIPChannel=false"  -p 9999:8080  pangliang/rocketmq-console-ng

PS:访问地址: 127.0.0.1:8080

image-20240722123424107
image-20240722123424107

MySQL

https://blog.51cto.com/u_16175473/6637401open in new window

1. 创建一个MySQL容器

首先,我们需要创建一个MySQL容器。可以使用以下Docker命令来创建一个MySQL容器:

docker run -d --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password mysql:tag
## 列如  docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7.17
# 如果想 挂载外部配置文件(针对需要修改配置文件的情况)
docker run -d --name mysql-container -p 3306:3306 -v /path/to/config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=your_password mysql:tag
## docker run -d --name mysql -p 3306:3306 -v /etc/mysql_docker/config:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=root mysql:5.7.17

  • docker run: 用于创建并运行新的容器。
  • -d: 参数表示要以“后台运行”(detached)的方式启动容器,即容器在后台运行而不阻塞当前终端。
  • --name mysql-container: 指定容器的名称为 "mysql-container"。您可以根据需要自定义容器的名称。
  • -p 3306:3306 参数表示将主机的 3306 端口与容器的 3306 端口进行映射,这样您可以通过主机的 IP 地址和端口来访问容器内的 MySQL 服务。
  • -v /path/to/config:/etc/mysql/conf.d:将本地主机上 /path/to/config 目录挂载到容器中的 /etc/mysql/conf.d 目录,用于提供自定义的 MySQL 配置文件。
  • -e MYSQL_ROOT_PASSWORD=your_password: 通过环境变量 -e 设置 MySQL 容器的 "root" 用户的密码。将 "your_password" 替换为您自己的密码。
  • mysql:tag: 指定所使用的 MySQL 镜像的名称以及标签。您可以将 "tag" 替换为具体的版本号(如 "5.7"、"8.0" 等)或 "latest" 来使用最新版本的 MySQL 镜像。

总结起来,这个命令将在 Docker 中以后台模式运行一个名为 "mysql-container" 的容器,使用指定的 MySQL 镜像,并设置 "root" 用户的密码为所提供的值。

2. 修改配置文件参数

现在,我们可以编辑MySQL的配置文件了。在之前创建的/path/to/config目录中创建一个名为my.cnf的文件,并填写你想要修改的MySQL配置参数。例如,如果你想要修改MySQL的字符集为utf8mb4,可以在my.cnf中添加以下内容:

[mysqld]
character-set-server = utf8mb4

3. 重启MySQL容器

完成修改配置文件后,我们需要重启MySQL容器使其生效。可以使用以下Docker命令来重启MySQL容器:

docker restart mysql-container
docker start mysql-container
# 或者
docker start <容器名称或ID>
docker ps  # 执行该命令后,检查容器的状态是否变为 "Up" 或 "Exited" 并且没有错误消息。
docker logs mysql-container # 查询日志

这个命令将重启名为mysql-container的MySQL容器。

# 关闭
docker stop mysql-container
# 删除
docker rm mysql-container

修改远程访问

docker ps # 查询MySQL容器的名称或ID
docker exec -it <container_name_or_id> mysql -u<username> -p -- 登录MySQL  
	-- docker exec -it bc8472ad6a98 mysql -u root -proot

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; 
	-- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Semdo@2021' WITH GRANT OPTION;
FLUSH PRIVILEGES;

4. 删除MySQL

docker stop mysql
docker rm mysql

注意事项

1. 端口没有放开外网能访问

目前遇到一个场景:Docker 容器未在防火墙 (firewalld) 中显式放行端口却仍可访问

目前不知道啥情况,最开始的时候都没有,但是后面突然出现的,为了安全起见,后面部署都设置一下"iptables": false,

这通常是因为 Docker 默认绕过防火墙规则。解决方案:

  • 检查是否存在/etc/docker/daemon.json 如果没有创建
  • daemon.json中添加 "iptables": false
  • 重启docker systemctl restart docker

具体原因和解决方案:

1. Docker 默认绕过防火墙的原理

  • Docker 直接操作 iptables

    当 Docker 启动容器并映射端口(如 -p 8012:8012)时,它会自动在 iptables 中添加规则(优先级高于 firewalld),直接将流量转发到容器。
    即使 firewalld 未放行端口,Docker 的 iptables 规则仍允许外部访问。

  • 验证 iptables 规则

    sudo iptables -L -n -v --line-numbers
    

    查看 Chain DOCKERChain FORWARD 中的规则,会发现类似以下条目:

    ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8012
    

2. 解决方案:控制 Docker 的端口暴露范围

▶ 方法 1:限制 Docker 的 iptables 规则范围

在 Docker 配置文件 /etc/docker/daemon.json 中添加以下配置,限制 Docker 自动添加的 iptables 规则仅允许特定 IP 访问:

{
  "iptables": false,
  "ip-masq": false
}
  • 重启 Docker 服务
    sudo systemctl restart docker
    
  • 手动管理 iptables 规则
    此方法需要您自行添加防火墙规则,适合高级用户。
▶ 方法 2:通过 firewalld 直接管理 Docker 端口
  1. 放行指定 Docker 端口
    sudo firewall-cmd --permanent --add-port=8012/tcp
    sudo firewall-cmd --reload
    
  2. 禁止 Docker 修改 iptables(可选)
    /etc/docker/daemon.json 中设置:
    {
      "iptables": false
    }
    
    重启 Docker 后,所有端口需通过 firewalld 显式放行。

3. 关键操作步骤(推荐方法 2)

  1. 放行必要端口

    # 例如放行 RabbitMQ 管理端口 15672
    sudo firewall-cmd --permanent --add-port=15672/tcp
    sudo firewall-cmd --reload
    
  2. 删除 Docker 自动添加的 iptables 规则(若已存在冲突规则):

    # 查找规则编号
    sudo iptables -L DOCKER -n --line-numbers
    # 删除指定规则(例如编号为 3 的规则)
    sudo iptables -D DOCKER 3
    
  3. 验证端口是否受防火墙控制

    # 检查端口是否在放行列表
    sudo firewall-cmd --list-ports
    # 测试外部访问
    curl http://服务器IP:15672
    

4. 安全建议

场景操作建议
生产环境使用 firewalld 严格放行必要端口,禁用 Docker 的 iptables 自动规则。
测试环境允许 Docker 自动管理 iptables,但需定期检查开放端口。
容器仅需内网访问使用 Docker 内部网络(如 --network=internal)或绑定到 127.0.0.1-p 127.0.0.1:8012:8012)。

总结

  • 根本原因:Docker 默认通过 iptables 直接转发流量,绕过 firewalld
  • 解决思路
    1. 通过 firewalld 显式控制端口放行。
    2. 限制 Docker 对 iptables 的自动修改。
  • 最终效果:所有端口暴露行为由防火墙统一管理,避免不可控风险。

2. Dockerfile构建镜像

kkfileview 为例

# 编译源码
docker build -t kkfileview-4.4.0 .

# 部署到docker容器
docker run -m 2048m --restart always -d -p 8012:8012 kkfileview-4.4.0 
命令部分作用说明
docker build告诉 Docker 引擎开始构建镜像。
-t kkfileview-4.4.0-t 表示给镜像打标签(类似命名),格式为 <镜像名>:<标签>。此处省略了 :<标签>,默认标签为 latest,但建议显式指定(如 -t kkfileview:4.4.0)。
.指定构建上下文(当前目录),Docker 会将此目录下的文件传递给构建过程,且默认查找名为 Dockerfile 的文件。

3. 将服务器中的镜像导出,部署到其他地方

# 1. 将镜像打包
docker save -o kkfileview-4.4.0.tar kkfileview-4.4.0:latest
# 2. 部署镜像
docker load -i kkfileview-4.4.0.tar
# 3. 部署到docker容器
docker run -m 2048m --restart always -d -p 8012:8012 kkfileview-4.4.0