Docker代理与容器备份
本篇将介绍Docker的基本组件,并演示Dokcer容器的迁移与备份。
首先需要说明的是,现在国内已经不能用docker加速镜像源了,具体原因不知道,现在能用的只有一些小众的源,但是大厂买的VPS还是能用内网的源的。
1、Docker基本组件
Docker里面几个主要组件是镜像(Image)、容器(Container)和数据卷(Volume)。
- 镜像(Image):Docker镜像是用于构建Docker容器的静态文件,它包含了应用程序运行所需的所有文件、依赖项和配置信息。Docker镜像可以从Docker Hub或其他镜像仓库中获取,也可以通过Dockerfile自定义构建。
- 容器(Container):Docker容器是Docker镜像的运行实例,它包含了应用程序及其依赖项,并在隔离的环境中运行。每个容器都是一个独立的进程,拥有自己的文件系统、网络空间和进程空间。
- 数据卷(Volume):Docker数据卷是Docker容器被创建时,用于存储与物理主机共享的文件,存在物理主机路径与容器路径的映射关系,是容器迁移的重要数据。相对于容器的周期性,数据卷是永久保存于主机中的。
2、常用命令
以下对Docker最常用的命令做一个概览
#安装docker
sudo apt install docker.io
#拉取镜像
docker pull imagename
#查看镜像
docker images
#删除镜像
docker rmi imagename
#查看镜像或容器构造
docker inspect imageorcontainername
#创建容器
docker run -it -d -p hostport:containerport -v /host/path:/container/path imagename
#查看容器
docker ps -a
#进入容器
docker exec -it containerhash /bin/bash
#暂停容器
docker stop containername
#删除容器
docker rm containerhash
#重启容器
docker restart containerhash
3、代理配置
首先,介绍Docker守护进程的概念。Docker守护进程(Docker daemon,dockerd),它一直运行在主机上,负责处理Docker客户端发出的请求,比如拉取镜像、创建/启动/停止容器、管理网络和存储等。Docker CLI(命令行工具)是跟守护进程通信的客户端,发送指令给守护进程完成操作。
docker镜像由docker守护进程管理,所以不能用修改shell环境变量的方法使用代理服务,而是从systemd角度设置环境变量。
#创建并修改配置文件
vi /etc/systemd/system/docker.service.d/http-proxy.conf
#写入以下内容
[Service]
Environment="HTTP_PROXY=http://192.168.31.41:10808"
Environment="HTTPS_PROXY=http://192.168.31.41:10808"
这里需要注意的是,这个变量的意思是,HTTP和HTTPS流量都走http://192.168.31.41:10808
这个代理,这个代理本身是http类型的。docker不支持socks代理。
然后,重载docker配置,重启docker,检查配置后的环境
systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker
此时,Docker守护进程发起的HTTP和HTTPS的网络请求都会走http://192.168.31.41:10808
代理。也就是说,Docker拉取镜像、推送镜像、与远程仓库通信时,会通过该代理服务器转发请求。
4、迁移实例
由于Docker容器生命周期的限制,容器的运行较依赖于当前的宿主机,将整个容器迁移并不容易,而且容器中有很多数据是由镜像决定的,用户并不需要进行维护,所以Docker专门为用户数据保存设置了数据卷机制。
Docker容器运行产生的用户数据,如MySQL数据库存储的数据,都会保存到其容器中的路径A,而该路径A又与宿主机的路径B有映射关系,从而将用户数据直接存储至宿主机。不论是容器还是宿主机,都能直接对该块数据空间直接操作。
下面,拉一个typecho容器做实战
#搜索typecho相关镜像,或直接在dockerhub中搜索
docker search typecho
#拉取可靠typecho镜像
docker pull joyqi/typecho:nightly-php8.2-apache
#查看镜像构建中的volume映射,此处也可用哈希值代替名字
docker inspect joyqi/typecho:nightly-php8.2-apache
找到其中volume的映射关系,寻找Volume字段:
其中/app
就是创建容器后映射到宿主机Volume的文件地址,也可用inspect查看创建容器后/app映射的宿主机路径。
#创建容器,获取初始volume
docker run -d joyqi/typecho:nightly-php8.2-apache
之后会在/var/lib/docker/volumes
路径中,创建一个以hash值命名的文件夹,这就是容器数据卷的初始数据,我们只需保存这个数据卷,就可以轻松实现对容器用户数据的备份。
不过,我们还需做一件可有可无的事,为了避免文件夹混乱,可以将其重命名后保存,然后重新构建容器,命令如下
cd /var/lib/docker/volumes
找到hash命名的对应volume,然后将其中的_data移到volumes文件夹,并重命名为typecho(可自定义)。然后为了避免混乱,删除原来的hash值文件夹。之后就可以创建我们正式的容器了。同时,查看一个端口映射关系,同样是用inspect命令。
docker run -d -p 127.0.0.1:8080:80 -v /var/lib/docker/volumes/typecho:/app joyqi/typecho:nightly-php8.2-apache
这里的意思是,将容器80端口映射到主机127.0.0.1的8080端口,同时将容器的/app
路基映射到/var/lib/docker/volumes/typecho
,-d表示后台运行。
回顾一下,为什么不一开始就创建一个文件夹,然后将/app
映射过去呢?原因是,如果这样,最终创建出来的容器/app
文件夹将跟随宿主机,也就是不会初始化容器自己的文件,这样容器便丢失了自己部分的数据。