Docker的安装使用以及常见的网络问题
一、什么是Docker
Docker是一种容器化技术,用于快速打包、分发和运行程序。他的核心思想是"一次构建,到处运行",通过将应用及其依赖的环境打包到一个轻量级、可移植的容器中,实现跨平台一致运行。
二、Docker的安装
1.CentOS7.9版本
#添加Docker软件包源
sudo wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g' /etc/yum.repos.d/docker-ce.repo
#安装Docker社区版本,容器运行时containerd.io,以及Docker构建和Compose插件
sudo yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#启动Docker
sudo systemctl start docker
#设置Docker守护进程在系统启动时自动启动
sudo systemctl enable docker
2.检查Docker是否安装成功
docker -v
docker compose version
3.添加国内镜像加速地址(这段配置是只有在下载失败时添加此配置)(如镜像可以正常下载则不用天添加此配置)
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://tmtvgb0d.mirror.aliyuncs.com",#最好用最稳定的镜像加速地址
"http://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://tmtvgb0d.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.m.daocloud.io",
"https://t4cjkbtd.mirror.aliyuncs.com"]
}
#如镜像加速地址不可用请必应自行查找#修改完成后操作
systemctl daemon-reload #重载docker配置
systemctl restart docker #重启docker
#重启后检查镜像加速地址是否添加成功
docker info #使用该指令后查看Registry Mirrors字样下是否存在刚刚添加的镜像加速地址
三、Docker常用指令
docker篇
#基础指令
docker pull 镜像 #拉取镜像
docker images #查看docker镜像
docker stop 容器 #停止容器运行
docker rm #删除已停止运行的容器
docker rmi #删除未被使用的镜像
docker ps #查看docker中容器的状态
docker ps -a #查看docker中的所有容器状态
docker search #搜索镜像
docker exec -it 容器名 /bin/bash #进入容器内部
docker run -d --name my-nginx -p 80:80 nginx #运行一个nginx容器
-d 后台运行
--name 容器名
-p 宿主机的80端口映射到容器的80端口
nginx 是所需要的镜像
#网络层指令
docker info #查看docker的信息
docker network ls #列出docker中所有网络
docker network disconnect 网络名 容器名
docker inspect 容器ID #查看容器的详细信息(ip地址、挂载卷、端口等)
docker inspect 镜像ID #查看创建时间、层信息、环境变量等
docker inspect 网络 #查看网络、Volume、插件等信息
#查看日志
docker logs --tail -f 容器名 #查看容 器的日志输出
docker logs --since 1h 容器名 #查看容器一个小时内所有的日志输出
#系统维护
docker system df #查看容器镜像占用的磁盘空间
docker system prune #清理docker镜像占用的磁盘空间
docker compose篇
#基础指令
docker compose up -d #后台运行一个容器
使用前提是当前文件夹下有已经编写好的docker-compose.yaml文件
docker compose down #停止运行docker-compose.yaml文件对应的容器
docker compose exec -it 容器名 /bin/bash #进去容器内部
该指令执行时当前文件夹下必须有对应的dtocker-compose.yaml文件才行
三、Docker中常见的网络问题
个人建议:这个网络问题对于初学者来说,我觉得不用在意这个也是有一定的好处呢,有什么好处呢,就是后续遇到问题的时候,可以排查网络问题的同时,了解docker内部的网络
场景前提:在阿里云中有一台ECS主机和一个rocketmq实例,并且这两台实例都在一个VPC中,所以这两台实例的内网一定是互通的。
问题解决思路:在某次启动时,出现服务端连接不到rocketmq实例,因为都在同一个VPC下,起初我并没有往网络层想,我排查了阿里云中的AccessKey,并没有发现什么问题,继续排查了rocketmq控制台中的访问控制的智能身份识别,结果没有发现什么异常,随后启动了第二台主机,发现第二台主机,并没有出现这样的问题,这会又想到的一个问题就是可能是Jenkins缓存机制的问题,拉的代码并不是最新的代码,随后把第二台主机的代码运行到第一台主机中,结果一样,还是出现rocketmq连接不上的问题,这会我才意思到应该是网络层的问题
解决方案:使用route -n找到一个系统中存在一个与rocketmq路由表中有一个相同的IP端
使用docker inspect指令得到docker中的其他服务正在使用该IP段,停止该容器运行
使用ip link delete直接删除了本机的该IP端后重启服务
后续跟进处理:
在daemon.json文件中添加一个默认的IP端
#强制使用100.100IP端
"default-address-pools": [{"base": "100.100.0.0/16","size": 24},{"base": "172.xx.0.0/16","size": 24}
]
添加此配置后使用systemctl daemon-reload
重启服务 docker compose down
docker compose up -d