概述
本文内容为:如何使用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默认路径软链到实际路径,操作步骤如下:
-
停止docker服务
shellsystemctl stop docker
-
将默认路径目录移动到指定路径:
shellmv /var/lib/docker /home/data/docker
-
软链接
shellln -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命令再看一次,就能发现路径变化了。
容器
容器的数据迁移十分简单,只要修改容器的路径映射即可。