通俗理解:镜像是类,容器是对象实例
仓库 = 应用商店、镜像 = 下载的应用安装程序、容器 = 应用程序
镜像(Image)
这里面保存了应用和需要的依赖环境
为什么需要多个镜像?当开发、构建和运行容器化应用程序时,我们通常会有不同优先级。通过为这些独立的任务提供不同镜像
容器(Container)
镜像的实例。一个容器代表一个正在运行的应用程序、进程或服务。它由 Docker 镜像、执行环境和标准指令集组成。需要扩展服务时,我真正将镜像跑起来的东西,镜像在容器里面。可以看作是一个完全隔离的盒子。
一个容器镜像实例代表一个独立的进程。
Hub
远程存放镜像的平台, hub上已经有很多制作好的镜像(可以使用国内镜像平台)。
仓库(repository)
仓库用来保存镜像的地方。
镜像构建完成后,可以直接在当前宿主上运行,但是 如果需要在其它服务器上使用这个镜像,就需要一个集中存储、分发镜像的服务。仓库就是这样的一个服务。
1. 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
2. 添加稳定镜像源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
因为docker默认官方的镜像源地址是国外的,速度很慢,这里将数据源设置为阿里云的镜像。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装 Docker-CE
yum install docker-ce
4. 启动 Docker-CE
#设置开机启动 docker服务:
systemctl enable docker
systemctl start docker
5. 卸载 Docker-CE
yum remove docker-ce
#清除所有的文件目录
rm -rf /var/lib/docker
1. 修改配置文件
配置文件:/etc/docker/daemon.json,编辑该文件(没有的话先手动创建)加入国内镜像源
# 编辑 Docker 配置文件
$ sudo vim /etc/docker/daemon.json
# 加入以下配置项
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ccr.ccs.tencentyun.com"
]
}
Docker镜像加速器(阿里云镜像源)
也可以使用 阿里云-容器镜像服务ACR > 镜像工具 > 镜像加速器
2. 重启 Docker 服务
# 方法一,采用 systemctl 来重启,推荐
systemctl daemon-reload
systemctl restart docker
# 方法二,采用 service 来重启
service docker restart
3. 查看是否成功
# 查看 Docker 信息
docker info
# 出现以下字段代表配置成功
Registry Mirrors:
https://dockerproxy.com/
https://hub-mirror.c.163.com/
https://mirror.baidubce.com/
https://ccr.ccs.tencentyun.com/
#查看容器(-a 显示包括已经停止的容器):
docker ps -a
#拉取镜像:
docker pull
#查看镜像:
docker images
#删除镜像:
docker rmi 镜像name/id
#创建镜像(常用方式),注意结尾的.
#使用当前目录的 Dockerfile 创建镜像(版本号不加默认为 latest)
docker build -t [新镜像名称]:[新镜像标签] .
#通过 -f Dockerfile 文件的位置
docker build -f [Dockerfile的路径] .
#创建容器(运行镜像):
docker run --name [容器名] -d -p 8080:80 [镜像名称]:[镜像标签]
--name 容器名称 ,后面跟着是镜像路径或名称
--rm 运行完后删除该容器
-p 端口映射 8000 外部端口 80镜像里面运行的端口 将8000映射到镜像里面的80
-it 输出容器命令行的内容 即容器的自身的程序输出在控制台(进入容器)
-d 和it相反 隐藏后台运行
#容器交互:
docker exec -it [容器name/id] /bin/bash
#退出交互:
Ctrl+P,Ctrl+Q(Ctrl键一直保持按下)
#启动容器:
docker start 容器name/id
#重启容器:
docker restart 容器name/id
#停止容器:
docker stop 容器name/id
#杀掉运行中的容器
docker kill 容器name/id
#删除容器:
docker rm 容器name/id
#查看容器日志
docker logs -f -t 容器name/id
-f : 跟踪日志输出
-t : 显示时间戳
#设置开机自启:
systemctl enable docker
Docker镜像无法删除的解决办法
#使用强制删除命令:
docker rmi -f 镜像id
Docker容器无法stop的解决办法
docker在rm或者kill相应的容器时,发现无法删除,或者出现报错
提示 Error response from daemon: Conflict, cannot remove the default name of the container
解决方法:
#使用强制删除命令:
docker rm -f 容器id
#清理该容器的网络占用:
docker network disconnect --force bridge 容器id
将docker image导出保存为tar文件,方便在服务器之间进行传输
1. Docker镜像导出
-o 和 > 表示输出到文件(不加路径则会输出到当前所在目录),[新镜像名称].tar为目标文件
docker save -o D:\[新镜像名称].tar [镜像名称]:[镜像标签]
或
docker save [镜像名称]:[镜像标签] > D:\[新镜像名称].tar
2. 通过Xftp将导出的tar文件传输到其他服务器上
3. Docker镜像导入
docker load -i [新镜像名称].tar
4. 导出-导入过程中遇到的问题
导入完成后,镜像的名字和 TAG为
这个问题的根本在于这个镜像压缩包在打包的时候操作不当所导致
例如,使用镜像ID打包的话导致解压的出来的镜像没有名字
docker save -o D:\[新镜像名称].tar [镜像id]
因此,推荐使用镜像名进行打包,此方式打包的镜像,解压出来就有镜像名称了
docker save -o D:\[新镜像名称].tar [镜像名称]:[镜像标签]
重命名镜像的方法:
docker tag [镜像id] [新镜像名称]:[新镜像标签]