掘金 后端 ( ) • 2024-04-24 14:16

Docker 最佳实战:Docker 和 Docker Compose 离线部署实战

2024 年云原生运维实战文档 99 篇原创计划 第 008 篇 |Docker 最佳实战「2024」系列 第 008 篇

你好,欢迎来到运维有术

今天分享的内容是 Docker 最佳实战「2024」 系列文档中的 Docker 和 Docker Compose 离线部署实战

内容导图

docker-compose-mindmap

实战服务器配置 (架构 1:1 复刻小规模生产环境,配置略有不同)

主机名 IP CPU(核) 内存(GB) 系统盘(GB) 数据盘(GB) 用途 docker-node-1 192.168.9.81 4 16 40 100 Docker 节点 1 docker-node-2 192.168.9.82 4 16 40 100 Docker 节点 2 docker-node-3 192.168.9.83 4 16 40 100 Docker 节点 3 合计 3 12 48 120 300

实战环境涉及软件版本信息

  • 操作系统:openEuler 22.03 LTS SP3
  • Docker:24.0.9
  • Docker-Compose:v2.24.7

1. 安装 Docker

1.1 上传 docker 离线二进制包

在能联网的机器上,从 docker 官网下载二进制包,上传到部署服务器 /srv 目录(个人习惯自定义安装软件和数据默认都放在该目录)。

# wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.9.tgz
cd /srv

1.2 离线安装 Docker

  • 解压并复制所有二进制文件到 /usr/local/bin 目录下
tar xvf docker-24.0.9.tgz 
mv docker/* /usr/local/bin/
rm -rf docker

说明: 个人习惯自定义安装服务的 bin 文件都存放在 /usr/local/bin/ 目录下,实际使用中可以放在任何路径下。

  • docker-24.0.9.tgz 解压后的文件内容如下
# [root@docker-node-1 srv]# tar xvf docker-24.0.9.tgz 
docker/
docker/docker-proxy
docker/docker-init
docker/containerd-shim-runc-v2
docker/dockerd
docker/containerd
docker/docker
docker/runc
docker/ctr
  • 添加 PATH 环境变量
echo "export PATH=$PATH:/usr/local/bin" >> /etc/profile.d/docker.sh

说明: 个性化的环境变量配置不要放在 /etc/profile 文件中,建议在 /etc/profile.d/ 目录新建一个以服务名命名的配置文件

  • 检查 Docker 版本
source /etc/profile
docker version
  • 正确的结果如下
# 因为,Docker 服务还没启动,执行命令看到的是 Client 的信息)
[root@docker-node-1 srv]# docker version
Client:
 Version:           24.0.9
 API version:       1.43
 Go version:        go1.20.13
 Git commit:        2936816
 Built:             Thu Feb  1 00:47:46 2024
 OS/Arch:           linux/amd64
 Context:           default
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

1.3 编辑 Docker 服务配置文件

为了实现 Docker 服务的个性化配置,我们需要自定义 daemon.json 配置文件。

  • 创建 docker 服务配置文件根目录
mkdir /etc/docker
  • 创建配置文件 /etc/docker/daemon.json
cat > /etc/docker/daemon.json <<EOF
{
  "data-root": "/data/docker",
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ],
  "log-level": "info",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  },
  "storage-driver": "overlay2"
}
EOF

说明:

  • data-root 指定 Docker 服务的默认数据目录为 /data/docker,生产环境使用请将独立的数据盘挂载到 /data 目录

1.4 配置 systemd 管理 Docker 服务

为了在日常使用中方便的管理 Docker 服务,我们编写 systemd 配置文件实现 Docker 服务的管理。

  • 编写 docker.service 文件
cat > /usr/lib/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
#BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
#Requires=docker.socket
​
[Service]
Type=notify
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
#Restart=on-failure 
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
​
[Install]
WantedBy=multi-user.target 
​
EOF

1.5 启动 docker 服务并设置开机自启

systemctl daemon-reload  
systemctl enable docker --now

1.6 验证 Docker 服务信息

[root@docker-node-1 srv]# docker info
Client:
 Version:    24.0.9
 Context:    default
 Debug Mode: false
​
Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 24.0.9
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7c3aca7a610df76212171d200ca3811ff6096eb8
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 5.10.0-153.51.0.129.oe2203sp2.x86_64
 Operating System: openEuler 22.03 (LTS-SP2)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.261GiB
 Name: docker-node-1
 ID: ba867abb-8ca1-440b-9376-0d335a8886ae
 Docker Root Dir: /data/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine

2. 安装 docker-compose

2.1 上传 docker-compose 离线二进制包

在能联网的机器上,从 docker 官网下载二进制包,上传到部署服务器 /srv 目录(个人习惯自定义安装软件和数据默认都放在该目录)。

# curl -L https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
cd /srv
cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

2.2 验证 docker-compose 信息

[root@docker-node-1 srv]# docker-compose version
Docker Compose version v2.24.7

3. 创建应用验证测试

接下来我们使用 docker-compose 创建一个使用 busybox 镜像的容器,测试验证 Docker 和 docker-compose 是否正确安装配置。

3.1 编辑 docker-compose.yml 文件

name: busybox
services:
  busybox:
    container_name: busybox
    image: busybox
    command:  /bin/sh -c "sleep 3600"

3.2 创建测试容器

[root@docker-node-1 srv]# docker-compose up -d
[+] Running 2/2
 ✔ busybox 1 layers [⣿]      0B/0B      Pulled                                                                                            6.4s 
   ✔ 7b2699543f22 Pull complete                                                                                                           2.2s 
[+] Running 1/2
 ⠼ Network busybox_default  Created                                                                                                       0.4s 
 ✔ Container busybox        Started                                                                                                       0.3s 

3.3 查看容器运行状态

[root@docker-node-1 srv]# docker-compose ps
NAME      IMAGE     COMMAND                  SERVICE   CREATED          STATUS          PORTS
busybox   busybox   "/bin/sh -c 'sleep 3…"   busybox   41 seconds ago   Up 41 seconds 

3.4 删除测试容器

# 删除
[root@docker-node-1 srv]# docker-compose down
[+] Running 2/2
 ✔ Container busybox        Removed                                                                                                      10.2s 
 ✔ Network busybox_default  Removed                                                                                                       0.1s 
​
# 查看验证
[root@docker-node-1 srv]# docker-compose ps
NAME      IMAGE     COMMAND   SERVICE   CREATED   STATUS    PORTS

4. 自动化 Shell 脚本

文章中所有操作步骤,已全部编排为自动化脚本,因篇幅限制,不在此文档中展示。

星球会员请到专属代码仓库下载(价值内容,仅星球会员专享)。

5. 常见问题

5.1 问题 1

  • 问题现象
# docker 服务启动失败
# 查看 journalctl 报错日志
[root@docker-node-1 srv]# journalctl -xe
░░ Subject: Process /usr/local/bin/dockerd could not be executed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ The process /usr/local/bin/dockerd could not be executed and failed.
░░ 
░░ The error number returned by this process is ERRNO.
Apr 21 11:10:44 docker-node-1 (dockerd)[18962]: docker.service: Failed at step EXEC spawning /usr/local/bin/dockerd: Permission denied
​
# 查看 messages 日志
[root@docker-node-1 srv]# tail /var/log/messages  -n 20
Apr 21 11:10:46 docker-node-1 systemd[1]: Starting Docker Application Container Engine...
Apr 21 11:10:46 docker-node-1 (dockerd)[18966]: docker.service: Failed to locate executable /usr/local/bin/dockerd: Permission denied
Apr 21 11:10:46 docker-node-1 (dockerd)[18966]: docker.service: Failed at step EXEC spawning /usr/local/bin/dockerd: Permission denied
  • 解决办法
# 关闭 selinux(重启服务器后生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
​
# 临时关闭(立刻生效)
setenforce 0

6. 总结

本文分享了使用二进制文件离线部署 Docker 和 Docker-Compose 的详细流程及注意事项。主要内容概括如下:

  • 使用二进制文件离线部署 Docker 服务
  • Docker 服务的基本安装配置
  • 使用二进制文件离线部署 Docker-Compose
  • 使用 Docker-Compose 创建应用验证测试 Docker 服务

免责声明:

  • 笔者水平有限,尽管经过多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
  • 本文所述内容仅通过实战环境验证测试,读者可学习、借鉴,但严禁直接用于生产环境由此引发的任何问题,作者概不负责

Get 本文实战视频(请注意,文档视频异步发行,请先关注)

如果你喜欢本文,请分享、收藏、点赞、评论! 请持续关注 @运维有术,及时收看更多好文!

欢迎加入 「知识星球|运维有术」 ,获取更多的 KubeSphere、Kubernetes、云原生运维、自动化运维、AI 大模型等实战技能。未来运维生涯始终有我坐在你的副驾

版权声明

  • 所有内容均属于原创,感谢阅读、收藏,转载请联系授权,未经授权不得转载