Docker 单机
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 离线安装
离线安装包下载。
有便捷安装脚本: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 安装命令。参考来源
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 单机部署 kafka。
附录一、脚本文件
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