Docker系列01-Docker的离线安装和卸载

概述

本文内容为:如何使用Docker容器来替代传统线上部署方案。

并且为了支持内网环境部署,本文所有的安装都是使用离线包,所以需要提前备好文件。

准备工作

环境准备

  • Linux系统,建议使用Ubuntu
  • x64架构

离线包准备

Docker离线包:download.docker.com/linux/stati...

本文选择的版本是:docker-20.10.9.tgz

docker-compose离线包:github.com/docker/comp...

本文选择的版本是:docker-compose-linux-x86_64

Docker安装步骤

shell 复制代码
# 关闭selinux
getenforce
cat /etc/selinux/config
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
cat /etc/selinux/config

# 解压Docker
tar -xzvf docker-20.10.9.tgz

# 移动到/usr/bin目录下:
mv docker/* /usr/bin
rmdir docker

# 增加systemd管理配置
sudo tee /etc/systemd/system/docker.service <<-'EOF'
[Unit]
Description=Docker Application Container  Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
  
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
  
[Install]
WantedBy=multi-user.target

EOF

# 授权
chmod +x /etc/systemd/system/docker.service

# Docker配置文件

mkdir /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
  "http://hub-mirror.c.163.com",
  "http://mirrors.ustc.edu.cn/",
  "http://mirror.azure.cn/",
  "https://cr.console.aliyun.com"
  ]
  , "data-root": "/application/docker/data-root"
}
EOF

# 重载
systemctl daemon-reload
# 设置开启启动
systemctl enable docker.service
# 查看自启动状态
systemctl is-enabled docker
# 启动Docker,第一次启动会初始化
systemctl start docker
# 查看Docker版本
docker version

如果成功就没事了,但是如果卡住不动,那么请确认是否修改了SELINUX配置并重启服务器。

但如果不允许重启,可以将正在运行的Docker进程kill掉,然后手动启动Docker服务:

不能重启的情况

关闭有问题的Docker进程:

shell 复制代码
[root@localhost home] systemctl stop docker
[root@localhost home]# ps -aux | grep docker
root      58048  0.3  0.8 1506888 34412 ?       Ssl  11:39   0:00 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
[root@localhost home]# kill -9 58048

重复执行ps检查是否关闭完成

手动启动Docker服务(即不使用systemctl):

shell 复制代码
sudo dockerd & 或
sudo dockerd

可以重启的情况

修改SELINUX配置,重启服务器后再执行systemctl start docker。

shell 复制代码
vi /etc/sysconfig/selinux

将SELINUX=enforcing改成:
SELINUX=disabled

如果selinux必须要enforcing或者permissive,那么在重启系统并且执行过一次:systemctl start docker之后,可以修改回去再重启,我们的目的是需要systemctl start docker命令执行完,让docker进行过一次初始化,这样才能使docker自启动生效。 

最后通过docker version 查看版本,然后docker ps命令不报错,则表示安装完成了。

卸载Docker

shell 复制代码
# 停止 Docker 服务:打开终端或命令提示符,执行以下命令停止 Docker 服务:
sudo systemctl stop docker

# 删除 Docker 相关文件和目录:执行以下命令删除 Docker 相关的文件和目录(包括镜像、容器等):
sudo rm -rf /var/lib/docker

# 删除 Docker 二进制文件:执行以下命令删除 Docker 二进制文件:
sudo rm /usr/bin/docker

# 删除 Docker 配置文件:执行以下命令删除 Docker 配置文件:
sudo rm /etc/docker/daemon.json

# 删除 Docker 服务文件:执行以下命令删除 Docker 服务文件:
sudo rm /etc/systemd/system/docker.service
sudo rm /etc/systemd/system/docker.socket

# 刷新服务配置:执行以下命令刷新系统服务配置:
sudo systemctl daemon-reload

修改Docker镜像源和镜像存储路径

Docker向远程仓库拉取镜像时,拉取的速度受网络的影响,所以我们可以配置多个国内镜像源提高镜像的拉取速度:

镜像源信息来源:developer.aliyun.com/article/111...

shell 复制代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
  "http://hub-mirror.c.163.com",
  "http://mirrors.ustc.edu.cn/",
  "http://mirror.azure.cn/",
  "https://cr.console.aliyun.com"
  ]
}
EOF

# 重载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

上面的JSON配置可以在拉取镜像时多一些源的选择。

然后是镜像存储路径,Docker在运行过程中会持续的占用存储空间,如果不加以控制,容易导致硬盘空间不足,造成不足的原因主要有两点:

  • 镜像:持续构建或拉取新的镜像,比如应用的不断迭代升级;
  • 容器:容器运行过程中对硬盘空间的占用,比如MySQL容器。

镜像

当镜像越来越多,磁盘空间不足的时候,我们可以修改存储路径来实现扩容和数据迁移,迁移方式有两种:

第一种方案:软链接

修改软链接的原理很简单,就是将本来应该存储到的docker默认路径软链到实际路径,操作步骤如下:

  1. 停止docker服务

    shell 复制代码
    systemctl stop docker
  2. 将默认路径目录移动到指定路径:

    shell 复制代码
    mv /var/lib/docker /home/data/docker
  3. 软链接

    shell 复制代码
    ln -sf /home/data/docker /var/lib/docker

第二种方案:修改daemon.json配置

保险起见,还是一样停止服务吧。

shell 复制代码
systemctl stop docker

编辑daemon.json文件,如果没有该文件或该路径,请提前创建好:

shell 复制代码
mkdir /etc/docker
vi /etc/docker/daemon.json

/etc/docker/daemon.json:

json 复制代码
{
    // ...
    // 加上这一条
    "data-root": "/application/docker/data-root"
}

然后重启docker:

shell 复制代码
# 重载配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

daemon.json还可以进行更多配置,比如加速源,但是因为我们是离线安装的,所以就不用管了。

最后使用docker info命令再看一次,就能发现路径变化了。

容器

容器的数据迁移十分简单,只要修改容器的路径映射即可。

相关推荐
m0_5873830038 分钟前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·1 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停2 小时前
自动化测试(java)
java·开发语言·selenium·自动化
行百里er2 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
高频因子挖掘机3 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
鬼手点金4 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
孟健4 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
paopaokaka_luck5 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
阿里嘎多学长5 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
码事漫谈5 小时前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端