docker
docker
https://www.learnfk.com/docker/docker.html
检查端口是否被占用
sudo netstat -tuln | grep 15672
1. Docker
https://docs.docker.com/engine/install/centos/
https://www.learnfk.com/docker/docker.html
https://blog.csdn.net/qq_39997939/article/details/131005939
学习目标
- 能够知道什么是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 工作正常。
检查是否安装成功
- 检查 Docker 版本:在终端中运行以下命令,可以查看 Docker 的版本信息:
docker version
如果成功显示了 Docker 的版本信息,则说明 Docker 已经成功安装。
- 运行一个简单的容器:使用以下命令来拉取并运行一个简单的容器,以验证 Docker 是否能正常工作:
docker run hello-world
如果您看到类似于 "Hello from Docker!" 的输出,那么说明 Docker 已经正确安装并且可以正常运行容器。
- 查看正在运行的容器:可以使用以下命令来查看当前正在运行的 Docker 容器:
docker ps
docker ps -a
如果您看到类似于 "CONTAINER ID"、"IMAGE"、"COMMAND" 等列的输出,那么说明有一个或多个容器正在运行。
- 运行更多容器:您可以选择尝试拉取和运行其他容器镜像,例如 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/“: 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/140001206
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
使用本地安装的方式
指定目录下下载,然后将文件迁移到 /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
查询下面的错误表示需要登录
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依赖
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/125018387
- 拉取镜像
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 启动

- 执行“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/132061625
重启
docker restart nginx
RabbitMQ
docker ps
docker ps -a
安装
下载 RabbitMQ 镜像:在终端或命令行中运行以下命令来下载 RabbitMQ 镜像:
docker pull rabbitmq:3-management这将下载带有 RabbitMQ 3 版本和管理插件的镜像。
创建并运行 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参数将容器设置为始终自动重启。访问 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 # 查询日志

设置自动启动
- 首先,停止已经运行的 RabbitMQ 容器:
docker stop <container_id>
将 <container_id> 替换为你 RabbitMQ 容器的实际 ID 或名称。
- 然后,使用
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?
检查 Docker 服务是否正在运行:运行以下命令来检查 Docker 服务的状态:
ps aux |grep docker如果 Docker 服务未运行,可以使用以下命令启动它:
sudo systemctl start docker没有足够的权限:如果你不是 root 用户,请确保你的用户具有适当的权限来运行 Docker 命令。你可以通过将用户添加到
docker组来授予 Docker 权限:sudo usermod -aG docker your-user重启计算机后,你的用户将具有运行 Docker 命令的权限。
错误的 Docker 守护程序套接字文件权限:请确保
/var/run/docker.sock文件的权限正确。一般来说,该文件的所有者应该是root用户,并且具有rw(读写)权限。你可以使用以下命令来更正权限问题:sudo chown root:root /var/run/docker.sock sudo chmod 666 /var/run/docker.sockDocker 服务配置错误:如果上述步骤都没有解决问题,可能存在 Docker 服务的配置错误。你可以尝试停止 Docker 服务并重新启动它:
sudo systemctl stop docker sudo systemctl start docker
完成上述步骤后,请再次运行 docker ps -a 命令以查看容器的状态。
无法访问管理界面
如果无法通过访问 http://localhost:15672 打开 RabbitMQ 管理界面,可能有几个原因导致:
RabbitMQ 容器未在运行中:确保 RabbitMQ 容器正在运行。你可以使用以下命令检查容器状态:
docker ps如果容器未在运行中,请使用以下命令启动容器:
docker start <容器名称或ID> # 或者 docker start rabbitmq端口映射错误:确认你的容器正确映射了主机端口
15672到容器内部的端口15672。你可以使用以下命令查看容器的端口映射情况:docker ps -a如果没有正确映射端口,你可以停止并删除现有的 RabbitMQ 容器,然后重新创建并运行一个新的容器,确保使用
-p 15672:15672参数来进行端口映射。防火墙或网络问题:检查防火墙设置,确保允许主机的
15672端口的入站连接。如果你运行的是云服务(如 AWS、Azure 等),还需要检查网络安全组或网络 ACL 设置。Docker 守护进程的网络配置:如果你在远程服务器上使用 Docker,请确保 Docker 守护进程的网络配置允许远程访问。你可以参考 Docker 官方文档中关于远程访问的配置指南。
请注意,如果你正在使用虚拟机或远程服务器,请使用相应的 IP 地址替代 localhost。例如,如果你正在使用虚拟机的 IP 地址为 192.168.74.131,则应该尝试访问 http://192.168.74.131:15672/
添加延迟插件
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 ps 和 docker ps -a 命令区别
docker ps 和 docker 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/131443114
https://blog.csdn.net/qq_43600166/article/details/136187969
https://gitcode.csdn.net/6628b33ec46af9264276a80d.htm
在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=always | docker重启时候容器自动重启 |
| - -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

MySQL
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 DOCKER和Chain 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 端口
- 放行指定 Docker 端口:
sudo firewall-cmd --permanent --add-port=8012/tcp sudo firewall-cmd --reload - 禁止 Docker 修改 iptables(可选):
在/etc/docker/daemon.json中设置:重启 Docker 后,所有端口需通过{ "iptables": false }firewalld显式放行。
3. 关键操作步骤(推荐方法 2)
放行必要端口:
# 例如放行 RabbitMQ 管理端口 15672 sudo firewall-cmd --permanent --add-port=15672/tcp sudo firewall-cmd --reload删除 Docker 自动添加的 iptables 规则(若已存在冲突规则):
# 查找规则编号 sudo iptables -L DOCKER -n --line-numbers # 删除指定规则(例如编号为 3 的规则) sudo iptables -D DOCKER 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。 - 解决思路:
- 通过
firewalld显式控制端口放行。 - 限制 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