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