环境及相关软件:CentOS。
Docker 将应用程序与该程序的依赖,打包在一个文件里面,该文件包括了所有打包得应用程序的所有依赖,像数据库等;直接运行该文件,就可以让程序跑起来,从而不用再去考虑环境问题。
sudo yum install docker-ce
开发服务器随着docker运行服务的变多,docker目录占用磁盘空间也在逐渐变大,终于在最近磁盘彻底占满导致容器启动不起来并提示"no device space left"。为了防止以后出现docker占用磁盘容量不够的情况决定对docker数据目录迁移。
# 1)
$ docker info | grep "Docker Root Dir"
errors pretty printing info
# 若还是报错,先启动docker后台服务进程:sudo systemctl start docker
$ sudo docker info | grep "Docker Root Dir"
Docker Root Dir: /var/lib/docker
可看出,docker数据默认存储在/var/lib/docker 目录下。
# 2)
# 从下图中看出目前大容量硬盘挂载在了/home目录下,所以新目录建立在/home目录下
df -h
# 3)创建目录
mkdir -p ~/data/lib
# sudo systemctl stop docker 或者 sudo service docker stop
# 解释:这是docker在关闭状态下被访问自动唤醒机制,很人性化,即这时再执行任意docker命令会直接启动
# 注:如果真的不希望docker被访问自动唤醒,执行 systemctl stop docker 后再执行systemctl stop docker.socket即可
$ sudo systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
(1)迁移整个/var/lib/docker目录到目的路径:
sudo mv /var/lib/docker ~/data/lib/
(2)建立symlink软链接
sudo ln -s ~/data/lib/docker /var/lib/docker
(3)确认文件夹类型
ls -al /var/lib/docker
(1)迁移整个/var/lib/docker目录到目的路径:
# cp命令这两个参数比较关键(R:递归复制;p:保留原有权限),如果不加p参数可能会导致迁移后的目录的/tmp目录og(其他人&&组)丢失w(写)权限。教训:mongo容器启动需要在/tmp目录下创建****.sock监听请求,由于cp没有加上 p参数导致/tmp目录从drwxrwxrwt权限变为drwxr-xr-t权限,无法成功启动。t权限是x+SBIT形成的。
sudo cp -rp /var/lib/docker ~/data/lib/
# 或 sudo cp -Rp /var/lib/docker/* ~/data/lib/
(2)编辑docker配置文件(也可建立软链接,需要删除原目录或者ln命令加上f参数强行移除)
vim /etc/docker/daemon.json
{
"registry-mirrors": [],
"graph": "/home/data/lib"
}
sudo systemctl start docker
# 或 sudo service docker start
(1)增大文件监控限制。
用vim编辑 sudo vim /etc/sysctl.conf ,加入下面两行
fs.inotify.max_user_watches=524288
fs.inotify.max_user_instances=8192
fs.inotify.max_user_instances=8192 # 表示每一个real user ID可创建的inotify instatnces的数量上限,默认128
fs.inotify.max_user_watches=524288 # 同一用户同时可以添加的watch数目,默认8192
(2)刷新sysctl
sudo sysctl -p
Linux文件权限由三个数据左右,drwxrwxrwx
其中第一位d代表该文件是一个文件夹
前三位、中三位、后三位分别代表着属主权限、属组权限、其他人权限
(1)将当前用户添加到docker属组:
sudo groupadd docker
(2)将用户加入该group内,然后退出并重新登录:
sudo gpasswd -a ${USER} docker
(3)查看是否添加成功:
cat /etc/group | grep ^docker
(4)重启docker服务:
sudo service docker restart
(5)切换当前会话到新group或者重启X会话:
newgrp - docker
(6)执行docker命令,比如:
docker ps -a
# 查看是否有daemon.json文件
ls /etc/docker
若没有,vim /etc/docker/daemon.json 创建该文件并加入以下内容,配置registry-mirrors镜像源和insecure-registries私有仓库(按实际需要添加),以下还加入了阿里云的docker 镜像加速地址:
{
"registry-mirrors":["https://registry.docker-cn.com","https://y4xpdpoy.mirror.aliyuncs.com"],
"insecure-registries":["10.76.10.25:80"]
}
重新加载daemon:
systemctl daemon-reload
重启docker:
systemctl restart docker
(1)导入ubuntu 18.04基础镜像(本地有现成的,不然要去镜像仓库pull一个)
docker load < ubuntu.18.04.tar
(2)查看导入的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 54919e10a95d 12 months ago 63.1MB
(3)利用Dockfile制作一个新的docker 镜像。
# 进入Dockfile所在目录,ubuntu-18.04:compile_v1表示镜像名称:镜像标签,可自定义
docker build -t="ubuntu-18.04:compile_v1" .
# 或者直接执行脚本 bash docker_build.sh
(1)本地构建镜像,并启容器:
docker run --rm -it ubuntu-18.04:compile_v1 /bin/bash
(2)安装所需的环境
(3)再执行以下命令对根目录下的文件打包:
tar -cvf img.tar / --exclude=/proc --exclude=/sys --exclude=img.tar
(4)然后将打包好的文件拷贝到宿主机下随便一个目录下:
# 容器ID通过docker ps查看
docker cp 容器ID:/img.tar .
(5)最后生成新的镜像:
cat img.tar | sudo docker import - img