Docker常见命令
Docker下载及启动
- yum更新
Docker是需要使用yum命令进行安装的
所以如果yum命令包版本较低需要进行更新
yum update
- 下载yum-config-manager及devicemapper驱动依赖(挂载阿里云Docker镜像使用)
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置yum源为阿里云
阿里云docker镜像Wiki
如果你想直接在docker官网上下载可以忽略
当然你可以在docker上自行下载桌面版本
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
也可以使用命令直接下载
yum install -y docker
- docker下载
你可以在docker上自行下载桌面版本
也可以使用命令直接下载
yum install -y docker
yum install -y docker-ce
- 验证
显示docker版本号
docker -v
- 设置国内镜像
Docker默认采用官方镜像进行数据下载,建议设置国内镜像下载更快捷
设置指南
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
- 启动
systemctl start docker
- 重启
systemctl restart docker
- 停止
systemctl stop docker
- 设置开机自启动
systemctl enable docker
- 查看Docker状态
systemctl status docker
- 查看相关概要
docker info
- 查询Docker相关命令
docker --help
Docker镜像相关
查看本地拥有的镜像
docker images
查看网络上的镜像
docker search 镜像关键词
拉取网上镜像
docker pull 镜像名称:版本号
如果镜像是最后版本,即latest版本,则不加“:版本号”
删除镜像
删除指定镜像需要获知其镜像ID,并且此镜像需要没有引用
docker rmi 镜像ID
还可以删除全部镜像
docker rmi `docker images -q`
Docker容器相关
查看容器
查看当前正在运行的容器
docker ps
查看所有容器
docker ps -a
查看最后一次运行的镜像
docker ps -l
按照条件查询
docker ps -f 查询列=列值
eg:
docker ps -f status=exited
容器状态释义
Docker容器状态 | 进程/应用程序状态 |
---|---|
Created | 已创建但未启动 |
Restarting | 重新启动中 |
Running | 正在运行 |
Paused | 暂停执行 |
Exited | 已停止运行 |
Dead | 无法恢复的错误或崩溃 |
OOMKilled | 内存溢出导致终止 |
这个对比表格旨在将 Docker 容器状态与进程或应用程序状态进行对比,以便更好地理解容器状态与其内部进程或应用程序之间的关系。
请注意,容器状态和进程/应用程序状态之间的对应关系是相对的,可能因具体的应用程序和环境而有所不同。例如,对于某个容器来说,Running 状态可能表示应用程序正在正常运行,而对另一个容器来说,Running 状态可能表示应用程序出现问题,但容器本身仍在运行。
因此,在分析容器和应用程序的状态时,还应考虑容器内部的具体实现和配置,以及应用程序的自身特点和行为。对于准确的状态判断和故障排除,还需要综合考虑日志、监控和其他诊断工具的输出。
容器的创建
交互式创建
docker run -i -t --name=容器名称 镜像名称:标签(版本)交互式的命令
eg:
docker run -i -t --name=MySQL mysql /bin/bash
当命令执行完成之后会进入到容器中,当容器使用之后不再需要使用,可执行一下命令退出容器
exit
守护式创建
守护式创建就是我们常说的后端运行
docker run -i -d --name=镜像名称:标签(版本)交互式的命令
当我们执行完命令之后,容器会在后台进行运行,如果此时我们需要进入到容器之中,可执行以下命令
docker exec -i -t 容器名称(容器ID)交互命令
eg:
docker exec -i -t MySQL /bin/bash
交互命令具体可以使用哪些需要看容器中的环境变量配置了那些命令,如果我们在宿主机时需要直接使用这些命令,有时需要写该命令的全路径才可以生效。
容器的启动与停止
启动
docker start 容器名称(容器ID)
停止
docker stop 容器名称(容器ID)
注意:容器的创建只是保证拥有此容器,启动和停止是指在拥有容器前提之下,执行命令可以变更容器状态
文件拷贝
有时我们会需要将文件在Docker客户端和容器之间相互拷贝
客户端->容器
docker cp 客户端目录 容器名称:容器目录
容器->客户端
docker cp 容器名称:容器目录 客户端目录
目录挂载
有时候我们需要将容器中的目录映射到客户端内,因此,就需要进行容器的挂载,来将容器和客户端之间建立映射。
docker run -i -t -v 客户端目录:容器目录 --name:容器名称 容器镜像 /bin/bash
这个命令有可能会涉及到Liunx本身的权限问题,需要具备Linux权限方面的知识。
查看容器的IP地址
查看容器IP相对来说是比较常见的操作。
我们可以使用以下命令获取容器中的配置,以此检测容器中的IP
docker inspect 容器名称(容器ID)
当然我们也可以直接查询容器IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
删除容器
删除容器前必须先stop容器
docker rm 容器名称(容器ID)
常用实战部署
挑选了部分组件进行实战部署
需要虚拟机镜像的私聊我
MySQL
查询相关的镜像
docker search centos/mysql
下载镜像
docker pull centos/mysql-57-centos7
创建容器
docker run -id --name=mysql_default -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 docker.io/centos/mysql-57-centos7
-p指的是客户端的IP和容器之中的IP之间的映射关系,
-e指的是环境变量的设置
这里必须设置环境变量,否则在启动完成之后,容器启动正常,但是容器中的应用程序(MySQL)会出问题。
mysql_1 | 2021-09-05 02:42:12+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
mysql_1 | You need to specify one of the following:
mysql_1 | - MYSQL_ROOT_PASSWORD
mysql_1 | - MYSQL_ALLOW_EMPTY_PASSWORD
mysql_1 | - MYSQL_RANDOM_ROOT_PASSWORD
连接Docker数据库
FQA
- Q:WARNING: IPv4 forwarding is disabled. Networking will not work.
我在启动容器时发现IPV4没有打开,这样的话网络通信会出现问题。
报错详情
WARNING: IPv4 forwarding is disabled. Networking will not work.
此时需要配置宿主机ipv4的开关
echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf
重新启动宿主机
systemctl restart network && systemctl restart docker
之后删除容器重新启动就可以了。
-Q:宿主机与容器之间不通信,导致远程连接数据库时一直在超时
这个问题困扰了我一下我,最开始我将目光集中在网络模式上,由于不同网络模式采用的连接方式不同,因此我先将默认的网络模式(桥接模式)调整为HOST,发现链接正常,之后我定位到应该时桥接模式的问题,了解到桥接模式之间需要通过虚拟网桥的建立后,去查看虚拟网桥
ip a
查询后发现虚拟网桥docker0是出于关闭状态,之后重启发现没用,还是关闭状态,并且网桥信息不变,怀疑是网桥再重启过程中复用了,于是删除网桥
brctl delbr docker0
之后再重启,发现网桥已经启用,连接成功!
期间我还进行了相关的网络通信查询、防火墙的查询以及docker info下网络连接的查询。如果发生问题可以按照这些方面进行排查。
整体的通信路径大概是:外部链接 - docker宿主机网卡-docker0网桥 - 容器链接,我觉得这一部分还是很有意思的,可以深入研究一下,这种方式看似繁琐,但是将平台可移植性发挥的淋漓尽致。但是通过这个我也发现了docker的维护性可能并没有想象的那么好。