Docker 单机

felix.shao2025-04-19

Docker 单机

1 Docker 安装

1.1 Docker 安装

 安装步骤如下。

# 设置 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

1.1.1 离线安装

离线安装包下载open in new window
 有便捷安装脚本:sh install-docker.sh docker-23.0.0.tgz, 其中 install-docker.sh 脚本代码见附录。

1.1.2 search 查询 tag

 使用 ./docker-search.sh mysql,其中 docker-search.sh 脚本代码见附录。

1.2 镜像源加速

# 将 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 

1.3 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

1.4 常用命令

# 进入容器
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

1.5 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

2 插件

2.1 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。

2.2 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

2.3 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/。

3 数据库插件

3.1 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%';

3.2 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

3.3 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;

3.4 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"

3.4.1 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

3.5 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

附录一、脚本文件

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-search.sh

#!/bin/sh
# docker-search.sh centos
for Repo in $* ; do
  curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$Repo/tags/" | \
    sed -e 's/,/,\n/g' -e 's/\[/\[\n/g' | \
    grep '"name"' | \
    awk -F\" '{print $4;}' | \
    sort -fu | \
    sed -e "s/^/${Repo}:/"
done
Last Updated 4/20/2025, 9:23:27 PM