Docker 最佳实战:Docker 和 Docker Compose 离线部署实战
2024 年云原生运维实战文档 99 篇原创计划 第 008 篇 |Docker 最佳实战「2024」系列 第 008 篇
你好,欢迎来到运维有术。
今天分享的内容是 Docker 最佳实战「2024」 系列文档中的 Docker 和 Docker Compose 离线部署实战。
内容导图
实战服务器配置 (架构 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 服务并设置开机自启
代码语言:bash复制systemctl daemon-reload
systemctl enable docker --now
1.6 验证 Docker 服务信息
代码语言:bash复制[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 目录(个人习惯自定义安装软件和数据默认都放在该目录)。
代码语言:bash复制# 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 信息
代码语言:bash复制[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 文件
代码语言:yaml复制name: busybox
services:
busybox:
container_name: busybox
image: busybox
command: /bin/sh -c "sleep 3600"
3.2 创建测试容器
代码语言:bash复制[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 查看容器运行状态
代码语言:bash复制[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 删除测试容器
代码语言:bash复制# 删除
[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 本文实战视频(请注意,文档视频异步发行,请先关注)
- B 站|运维有术
如果你喜欢本文,请分享、收藏、点赞、评论! 请持续关注 @运维有术,及时收看更多好文!
欢迎加入 「知识星球|运维有术」 ,获取更多的 KubeSphere、Kubernetes、云原生运维、自动化运维、AI 大模型等实战技能。未来运维生涯始终有我坐在你的副驾。
版权声明
- 所有内容均属于原创,感谢阅读、收藏,转载请联系授权,未经授权不得转载。