修炼者
修炼者
发布于 2025-06-19 / 17 阅读
0
0

用Docker管理常用软件

Docker管理软件非常方便,而且还有很好的隔离性。例如安装mysql、redis、mosquitto、kafuka、superset、nginx、jenkins等。

环境准备

安装Docker

# 1. 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

sudo apt purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

# 2. 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# 3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4. 设置仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 6. 验证安装 : 这里可能会失败,因为docker的镜像站在国内访问连同性不好
sudo docker run hello-world

设置镜像源站

编辑文件daemon.json如下内容与路径。

$ cat /etc/docker/daemon.json 
{
	"registry-mirrors": [
		"https://ccr.ccs.tencentyun.com",
	],
	"bip":"192.168.2.1/24"
}
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

然后拉一个nginx看看

$ sudo docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
c353fd29d8c5: Pull complete 
98b095d7d2b4: Pull complete 
af5f0e3644c1: Pull complete 
Digest: sha256:fad8e1cd52e24bce7b72cd7cb674a2efad671647b917055f5bd8a1f7ac9b1af8
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

授权

避免每次都要sudo,可以授权当前用户具有docker的操作权限

# 将当前用户加入 docker 组
sudo usermod -aG docker $USER

# 退出当前会话重新登录(或重启)
newgrp docker  # 立即生效(或直接重启终端)

网络

# 创建两个容器,默认会自动连接到 bridge 网络
docker run -d --name container1 nginx
docker run -d --name container2 nginx

# 进入container1
docker exec -it container1 bash

# 在container1中ping container2
ping container2

# 创建自定义网络
docker network create my-network

限定网络资源

# 创建自定义网络并限制带宽
docker network create --driver bridge \
  --opt com.docker.network.driver.mtu=1500 \
  my-network

# 使用tc在容器内限制 (需要特权模式)
docker run -it --cap-add=NET_ADMIN ubuntu:latest

# 或者在宿主机上对容器网络接口使用tc

磁盘

限定磁盘资源

# 磁盘读写限制
docker run -it \
  --device-read-bps /dev/sda:1mb \
  --device-write-bps /dev/sda:1mb \
  --device-read-iops /dev/sda:100 \
  --device-write-iops /dev/sda:100 \
  ubuntu:latest

CPU

限定CPU资源

# 限制CPU使用
docker run -it --cpus="1.5" ubuntu:latest  # 使用1.5个CPU核心
docker run -it --cpuset-cpus="0-3" ubuntu:latest  # 绑定到特定CPU

# CPU份额限制 (相对权重)
docker run -it --cpu-shares=512 ubuntu:latest

内存

限定内存资源

# 内存限制
docker run -it -m 512m ubuntu:latest  # 512MB内存
docker run -it -m 1g --memory-swap 2g ubuntu:latest  # 1GB内存,2GB交换空间

运行软件

用docker compose限定资源

version: '3.8'
services:
  app:
    image: my-app:latest
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M
    blkio_config:
      device_read_bps:
        - path: /dev/sda
          rate: '1mb'
      device_write_bps:
        - path: /dev/sda
          rate: '1mb'

nginx

mysql

redis

jenkins

superset

halo


评论