likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 4

概述

本文内容为:如何使用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安装步骤

# 关闭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进程:

[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):

sudo dockerd & 或
sudo dockerd

可以重启的情况

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

vi /etc/sysconfig/selinux

将SELINUX=enforcing改成:
SELINUX=disabled

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

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

卸载Docker

# 停止 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…

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服务

    systemctl stop docker
    
  2. 将默认路径目录移动到指定路径:

    mv /var/lib/docker /home/data/docker
    
  3. 软链接

    ln -sf /home/data/docker /var/lib/docker
    

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

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

systemctl stop docker

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

mkdir /etc/docker
vi /etc/docker/daemon.json

/etc/docker/daemon.json:

{
    // ...
    // 加上这一条
    "data-root": "/application/docker/data-root"
}

然后重启docker:

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

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

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

容器

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