Docker

felix.shao2025-06-06

Docker

1 Docker 管理

Docker 安装
 CentOS 在线安装

 步骤如下。

# 设置 yum 源
yum -y install yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 查看 docker yum 源
yum list docker-ce --showduplicates | sort -r

# 安装 docker
yum -y install docker-ce-20.10.15-3.el9

# 查看 docker 版本
docker version

# 启动并加入开机启动
systemctl start docker
systemctl enable docker
 离线安装

离线安装包下载open in new window
 有便捷安装脚本:sh install-docker.sh docker-23.0.0.tgz, 脚本如下。

  install-docker.sh
#!/bin/sh

usage(){
  echo "Usage: $0 FILE_NAME_DOCKER_CE_TAR_GZ"
  echo "       $0 docker-17.09.0-ce.tgz"
  echo "Get docker-ce binary from: https://download.docker.com/linux/static/stable/x86_64/"
  echo "eg: wget https://download.docker.com/linux/static/stable/x86_64/docker-17.09.0-ce.tgz"
  echo ""
}
SYSTEMDDIR=/usr/lib/systemd/system
SERVICEFILE=docker.service
DOCKERDIR=/usr/bin
DOCKERBIN=docker
SERVICENAME=docker

if [ $# -ne 1 ]; then
  usage
  exit 1
else
  FILETARGZ="$1"
fi

if [ ! -f ${FILETARGZ} ]; then
  echo "Docker binary tgz files does not exist, please check it"
  echo "Get docker-ce binary from: https://download.docker.com/linux/static/stable/x86_64/"
  echo "eg: wget https://download.docker.com/linux/static/stable/x86_64/docker-17.09.0-ce.tgz"
  exit 1
fi

echo "##unzip : tar xvpf ${FILETARGZ}"
tar xvpf ${FILETARGZ}
echo

echo "##binary : ${DOCKERBIN} copy to ${DOCKERDIR}"
cp -p ${DOCKERBIN}/* ${DOCKERDIR} >/dev/null 2>&1
which ${DOCKERBIN}

echo "##systemd service: ${SERVICEFILE}"
echo "##docker.service: create docker systemd file"
cat >${SYSTEMDDIR}/${SERVICEFILE} <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
[Service]
Type=notify
EnvironmentFile=-/run/flannel/docker
WorkingDirectory=/usr/local/bin
ExecStart=/usr/bin/dockerd \
                -H tcp://0.0.0.0:4243 \
                -H unix:///var/run/docker.sock \
                --selinux-enabled=false \
                --log-opt max-size=1g
ExecReload=/bin/kill -s HUP $MAINPID
# 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=on-failure
[Install]
WantedBy=multi-user.target
EOF

echo ""

systemctl daemon-reload
echo "##Service status: ${SERVICENAME}"
systemctl status ${SERVICENAME}
echo "##Service restart: ${SERVICENAME}"
systemctl restart ${SERVICENAME}
echo "##Service status: ${SERVICENAME}"
systemctl status ${SERVICENAME}

echo "##Service enabled: ${SERVICENAME}"
systemctl enable ${SERVICENAME}

echo "## docker version"
docker version
 docker tag 查看

 先安装依赖。

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum install jq

 再查询,比如查询 redis 的 tag。

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/redis/tags?page_size=1024' | jq '.results[]["name"]' | sed 's/\"//g' | sort -u
Docker 镜像源加速
# 将 docker 镜像源修改为国内的,即在 daemon.json 文件中添加以下参数(没有该文件则新建)
vi /etc/docker/daemon.json
{
"registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://docker.awsl9527.cn",
    "https://mirror.baidubce.com"
  ]
}

# 服务重启:
systemctl daemon-reload
systemctl restart docker
# 查看是否生效,关注 Insecure Registries
docker info 
docker-compose 安装
# 下载文件,下载的文件最后放在 /usr/local/bin/docker-compose 中
curl -L "https://github.com/docker/compose/releases/download/1.28.4/docker-compose-$(uname -s)-$(uname -m)" -o ./docker-compose
cp ./docker-compose /usr/local/bin/docker-compose

# 授予权限
chmod +x /usr/local/bin/docker-compose

# 检查是否安装成功
docker-compose version
Docker 常用命令
# 进入容器
docker exec -it name bash

# 查看centos版本
cat /etc/redhat-release 

# 查看 docker 容器 ip
docker inspect  
docker 网关默认为:172.17.0.1

# 提交镜像
docker stop name
docker commit name name:version

# 导入导出镜像
docker save -o filename.tar name:version 
docker load -i filename.tar

# 运行镜像
docker run -tdi --privileged -m 10240M --memory-swap -1 --hostname=hostname --net=host --name=containname xx:xxx /usr/sbin/init
Docker 本地私有仓库
 环境搭建

 步骤如下。

# 1. 首先下载 registry 镜像
docker pull registry

# 2. 在 daemon.json 文件中添加私有镜像仓库的地址并重启,192.168.37.101:5000 是本地的 IP
vim /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.37.101:5000"],
  "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker

# 3. 运行 registry 容器
docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

# 4. 为镜像打标签
docker pull registry
docker tag registry:latest 192.168.37.101:5000/registry:v1
docker images

# 5. 上传到私有仓库
docker push 192.168.37.101:5000/registry:v1

# 6. 列出私有仓库的所有镜像
curl http://192.168.37.101:5000/v2/_catalog
{"repositories":["registry"]}

curl http://192.168.37.101:5000/v2/registry/tags/list
{"name":"registry","tags":["v1"]}

# 7. 先删除原有的 registry 镜像,在从本地仓库下载进行测试
docker rmi -f 192.168.37.101:5000/registry:v1 
docker pull 192.168.37.101:5000/registry:v1

# 8. 查看私有仓库镜像
## 8.1 查看私有仓库执行此命令
curl http://192.168.37.101:5000/v2/_catalog
## 8.2 获取某个镜像的标签列表
curl http://192.168.37.101:5000/v2/私有仓库镜像名称/tags/list
 异常处理
Error response from daemon: Get "https://192.168.37.101:5000/v2/": http: server gave HTTP response to HTTPS client
解决: 配置 daemon.json 并重启
Harbor 私有镜像仓库

 需要提前安装好 docker、docker-compose,详细步骤如下。

 1. 配置 https 域名

 非强制,不配置 https 域名的话,配置 harbor.yml 文件时,注释 https 配置即可,命令如下。

vi /etc/hosts
192.168.37.101 mydocker

 注意:启动 https 必须配置,若启用则还需要配置 https 证书,生成 https 证书步骤如下。
 1. 首先创建私钥。

mkdir /root/certs
cd /root/certs
openssl genrsa -des3 -out mydocker.key 1024   
#密码设置为 123456

 2. 去除之前创建私钥设置的密码,不然配置到 nginx 后启动还要输入密码,太麻烦。

cp mydocker.key mydocker.key.org
openssl rsa -in mydocker.key.org -out mydocker.key
# 然后输入之前设置的密码:123456

 3. 创建 csr 文件。

openssl req -new -key mydocker.key -out mydocker.csr
以下是输入的一系列信息:注意域名是最重要的。
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:CHINA
Locality Name (eg, city) []:shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:mydocker
Organizational Unit Name (eg, section) []:test
Common Name (e.g. server FQDN or YOUR name) []:test
Email Address []:test

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:mydocker

 4.生成 crt 证书。

openssl x509 -req -days 365 -in mydocker.csr -signkey mydocker.key -out mydocker.crt
 2. harbor 安装部署

 安装命令如下

# 1. 下载、解压 harbor
wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-installer-v2.5.3.tgz
tar zxf harbor-offline-installer-v2.5.3.tgz

# 2. 更改配置,修改 hostname、https 证书路径、admin 密码(管理员账号和密码)
cd harbor 
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
hostname: mydocker
# 注意如果打开 https 后,才配置,否则不配置。
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /root/certs/mydocker.crt
  private_key: /root/certs/mydocker.key

# 对外访问地址
external_url: https://mydocker
harbor_admin_password: Harbor12345

# 文件存储目录,找个磁盘大的目录配置
data_volume: /data/harbor

# 3. 编译安装
./prepare
./install.sh
docker-compose ps

# 4. 安装好后访问: https://mydocker admin/Harbor12345
 3. 修改配置
# 进入 harbor 的安装目录
# 修改 harbor.yml
./prepare
docker-compose down -v
docker-compose up -d
 4. 发布镜像

 1. 配置用户和项目。

  • 创建用户。打开页面 https://mydocker,创建 develop/Admin123(账号/密码) 用户。
  • 创建项目。继续创建项目 dockerproj。进入创建的项目,将 develop 添加到成员中,赋予开发角色,这样 develop 就有 push、pull 权限了。
     以下是注意要点。
  • 推送镜像格式为:docker push ip/project/[IMAGE[:TAG]]

 2. 配置 Docker 源。
 在 daemon.json 文件中添加私有镜像仓库的地址并重启,mydocker 是本地的 IP

vim /etc/docker/daemon.json
{
  "insecure-registries": ["mydocker"],
  "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}

systemctl daemon-reload
systemctl restart docker

 3. 登录。

docker login mydocker -u develop -p Admin123
# ... 
# Login Succeeded
cat /root/.docker/config.json
{
	"auths": {
		"mydocker": {
			"auth": "ZGV2ZWxvcDpBZG1pbjEyMw=="
		}
	}
}

 4. 推送一个镜像。
 命令如下。

# 1 登录 
docker login mydocker -u develop -p Harbor12345

# 2. 为镜像打标签,注意标签有格式限制
docker pull redis:6.2.10
docker tag redis:6.2.10 mydocker/dockerproj/redis:v1

# 3. 上传到私有仓库
docker push mydocker/dockerproj/redis:v1

# 4. 在页面上查看镜像
# https://mydocker/harbor/projects/2/repositories

2 docker 容器管理

FTP
docker pull fauria/vsftpd
docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 -v /mnt/hgfs/vmshare/ftp:/home/vsftpd/ftp -e FTP_USER=ftp -e FTP_PASS=123456 -e PASV_ADDRESS=192.168.37.200 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
docker exec -it vsftpd bash

 安装好后以下是配置信息。

  • FTP 主机: 192.168.37.200。
  • FTP 用户名以及密码:ftp/123456。
  • FTP 端口 2121。
Nginx

 一般不推荐在容器中安装 Nginx,因为其配置文件经常变动。

docker search nginx
docker pull nginx
mkdir -p /dkdata/dkconf/nginx
# 复制 nginx.conf 至 /etc/nginx/nginx.conf 中,如 cp nginx.conf /dkdata/dkconf/nginx/
mkdir -p /dkdata/data/nginx/dist,前端文件,需要按实际配置更改
#复制 dist 至目录中,如 cp -rf dist /dkdata/data/nginx/dist/
docker run -tid --name nginx --net=host -v /dkdata/data/nginx/dist:/dist -v /dkdata/dkconf/nginx/nginx.conf:/etc/nginx/nginx.conf nginx

 以下是离线安装 Nginx。

docker pull nginx
docker save -o nginx.tar nginx:latest  
docker load -i nginx.tar
mkdir -p /data/nginx/www /data/nginx/logs /data/nginx/conf
docker run -tdi --privileged -m 10240M --memory-swap -1 --hostname=mynginx -p 21050:80 --name=mynginx -v /data/nginx/www:/usr/share/nginx/html -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/logs:/var/log/nginx nginx:latest 
docker exec -it -e COLUMNS=288 mynginx /bin/bash
RabbitMQ

 安装 RabbitMQ 3。

docker search rabbitmq
docker pull rabbitmq:3-management
# mkdir -p /dkdata/data/rabbitmq
docker run -tid --name rabbitmq -p 5672:5672 -p 15672:15672 -v /dkdata/data/rabbitmq:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3-management

 以下是安装好的配置信息。

  • 监控网址:http://192.168.37.100:15672/。
MySQL

config/my.cnf 配置文件内容如下。

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
symbolic-links = 0
lower_case_table_names=1

 以下是 MySQL 安装命令。参考来源open in new window

docker pull mysql:8.0.32
docker run -tid -v /data/mysql/config/my.cnf:/etc/my.cnf -v /data/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --restart always --privileged=true --name mysql mysql:8.0.32 --character-set-server=utf8 --collation-server=utf8_general_ci
# 注意,这种默认安装的 mysql 是支持远程访问的,假如不能访问,可以排除是不是 vm 修改了虚拟 IP 等网络环境变化后,docker 网络环境没变化导致的。
docker exec -it -e COLUMNS=288 mysql /bin/bash
docker save -o mysql8.0.tar mysql:8.0  
docker load -i mysql8.0.tar
/etc/mysql/mysql.conf.d/mysqld.cnf
show global variables like '%lower_case%';
Postgres

 安装 Postgres 13.2-alpine。

docker search postgres
docker pull postgres:13.2-alpine
docker run -tid -v /mnt/hgfs/vmshare/pg:/data -e POSTGRES_PASSWORD=postgres --net=host --name pg  --restart always postgres:13.2-alpine
docker exec -it pg bash
# 以下是备份命令
# pg_dump –h localhost –U db_username –p 5432 –d db_name –f /data/127.0.0.1.sql
# psql -d db_name -f /data/127.0.0.1.sql db_name
# psql -d db_name -f /data/schema_name.sql db_name
Oracle

 安装 Oracle 19c。

# 1. 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c

# 2. 保存镜像
docker save -o oracle-19c.tar registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c
docker load -i oracle-19c.tar

# 3.启动
chmod -R 777 /data/dkdata/teloracle

docker run -tid -p 1521:1521 -p 5500:5500 \
    -e ORACLE_SID=orcl \
    -e ORACLE_PDB=orclpdb1 \
    -e ORACLE_PWD=123456 \
    -e ORACLE_CHARACTERSET=al32utf8 \
    -e ORACLE_ALLOW_REMOTE=true \
    -e ORACLE_BASE=/opt/oracle \
    -e ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 \
    -e PATH=/opt/oracle/product/19c/dbhome_1/bin:/opt/oracle/product/19c/dbhome_1/OPatch/:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
    -v /data/dkdata/teloracle:/opt/oracle/oradata \
    --name teloracle registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c

# 管理员:sys 123456

# 4. 进入容器
docker exec -it -e COLUMNS=288 teloracle /bin/bash
# 修改密码
docker exec  teloracle ./setPassword.sh 123456

# 5. 监控
# https://192.168.37.100:5500/em/login
# 账号	system/sys/ 等
# 密码	123456
# 容器名	orclpdb1

 以下是安装好后的配置。

-- 创建用户并授权
-- 1. 使用 SYSDBA 登录
-- 2. 查询其他容器
select con_id, dbid, NAME, OPEN_MODE from v$pdbs;
-- 3. 开启 pdb(需要 SYSDBA 权限)
alter pluggable database ORCLPDB1 open
-- 4. 切换容器到 pdb
alter session set container=ORCLPDB1;
-- 5. 查看当前使用容器
select sys_context ('USERENV', 'CON_NAME') from dual;
-- 6. 创建表空间
create tablespace myoracle datafile '/opt/oracle/oradata/myoracle/myoracle_1.dbf' size 2000M;
-- 7. 创建用户分配表空间
create user myoracle_dev identified by myoracle_dev default tablespace myoracle;
create user myoracle_shj identified by myoracle_shj default tablespace myoracle;
-- 8. 分配权限
grant connect,resource,dba to myoracle_dev;
grant connect,resource,dba to myoracle_shj;

drop user myoracle_dev cascade;
drop tablespace myoracle;
Redis
 官网镜像安装

 安装 Redis 6,注意官方镜像默认无配置文件。

docker search redis
docker pull redis:6.2.10
docker run -tid -p 6379:6379 --name=redis  --restart always redis:6.2.10 redis-server --appendonly yes --requirepass "12345678"
 Redis 离线版镜像封装
docker search redis
docker pull redis:4.0.10
docker save -o redis-4.0.10.tar redis:4.0.10  
docker load -i redis-4.0.10.tar
docker image ls -a
docker run -d -v /usr/local/redis4.0.10/data:/data --net=host --name=dev-redis redis:4.0.10  redis-server --appendonly yes --requirepass "12345678"
# -d 守护进程运行容器
# -v /usr/local/redis4.0.10/data:/data : 将主机中 /usr/local/redis4.0.10/data 挂载到容器的 /data
# --net=host net 模式为 host 模式,容器与主机共享 ip
# redis-server --appendonly yes : 在容器执行 redis-server 启动命令,并打开 redis 持久化配置
docker run -p 6699:6379 --name myredis -v $PWD/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data -d redis:3.2 redis-server /etc/redis/redis.conf --appendonly yes
Kafka

 使用 docker-compose 启动。
 新建 /usr/local/kafka/docker-compose.yml 文件,宿主机创建好 mkdir -p /data/kafka 目录。

services:
  kafka:
    image: apache/kafka:3.9.0      # 使用官方最新版 Kafka 镜像
    container_name: kafka          # 容器命名为 kafka
    # restart: always
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    environment:
      TZ: Asia/Shanghai
      # 核心身份配置
      KAFKA_NODE_ID: 1             # 节点唯一标识符(集群中不可重复)
      KAFKA_PROCESS_ROLES: broker,controller # 同时扮演 Broker 和 Controller 角色
      
      # 网络监听配置
      KAFKA_LISTENERS: PLAINTEXT://192.168.37.100:9092,CONTROLLER://192.168.37.100:9093
      # - PLAINTEXT 监听器用于客户端通信(生产者/消费者)
      # - CONTROLLER 监听器用于集群内部通信
      
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.37.100:9092 # 对外暴露的地址
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER            # 指定控制器监听器名称
      
      # 安全协议映射(这里未启用加密)
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      
      # 集群仲裁配置(单节点模式)
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.37.100:9093 
      # 格式为 nodeId@host:port,这里只有自己一个投票节点
      
      # 主题配置(单节点优化)
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1     # __consumer_offsets 副本数
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 # 事务日志副本数
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1        # 最小同步副本数
      
      # 消费者组优化
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0     # 快速启动消费者组
      KAFKA_NUM_PARTITIONS: 3                       # 自动创建主题的默认分区数
    volumes:
      - ./data/kafka:/var/lib/kafka/data
      - /etc/localtime:/etc/localtime:ro
    network_mode: host  # 使用宿主机网络模式,避免端口映射问题

 启动 docker-compose up -d
 详细参考 docker 单机部署 kafkaopen in new window

Last Updated 6/6/2025, 3:42:39 PM