一、Docker容器虚拟化技术
1.1 容器虚拟化技术
容器虚拟化是一种轻量级虚拟化技术,通过将应用程序及其所有运行时环境打包成一个独立的容器,实现了应用程序的隔离和环境的一致性。每个容器都运行在共享的操作系统内核上,通过隔离和安全性,具有独立的文件系统、网络和进程空间。
1.2 容器与虚拟机
用户运行在容器里的应用进程,与宿主机上的其他进程一样,都由宿主机操作系统统一管理,Docker在这里更多的是辅助和管理工作。

容器化后的用户应用,依然还是宿主机上的一个普通进程,这就意味着这些因为虚拟化而带来的性能损耗都不存在。 使用Namespace作为隔离手段的容器无需单独的Guest OS,使得容器额外的资源占用可忽略不计。
1.3 Docker架构
Docker 使用客户端-服务器架构。
Docker 守护进程 (dockerd) 监听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。
Docker 客户端 (docker) 是许多 Docker 用户与 Docker 交互的主要方式。客户端发送命令发送到 dockerd 来执行。
Docker 客户端和守护进程可以在同一系统上运行,或者以将 Docker 客户端连接到远程 Docker 守护进程。

二、安装配置
1.1 安装
yum安装(Centos )
先下载docker repositry文件到 /etc/yum.repos.d/
https://download.docker.com/linux/centos/docker-ce.repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum 安装: yum install docker-ce
二进制包基本安装
下载二进制包,在下面目录找到对应CPU架构目录,下载需要的版本。
https://mirrors.aliyun.com/docker-ce/linux/static/stable/
https://download.docker.com/linux/static/stable/
如:wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-20.10.20.tgz
解压后为docker目录,把里面文件移到 PATH 路径下:
tar -zxvf docker-20.10.20.tgz
mv docker/* /usr/local/bin/
注:二进制包安装可能涉及到安全策略,Seccomp 配置或安装对应的 selinux 包。
运行服务
systemctl start docker-ce
或(二进制包) dockerd &
检查运行版本: docker version # docker info
1.2 开始使用
运行一个服务 nginx
# -d 作为后台守护进程运行, nginx:1.20 服务镜像,如果本地没有会从镜像源先下载到本地库。
docker run -d nginx:1.20 # --name nginx 运行容器指定一个名字
docker ps [-a] # 列出运行的 docker 服务进程, -a 显示所有的
docker rm 容器ID(或名称) # 删掉运行的容器进程, -f 强制
docker start | stop | restart | kill 容器ID(或名称)
# 登录到容器内,交互方式运行并连接到终端( -i 和 -t ),运行容器内的 /bin/bash命令,即在容器内bash环境, exit 退出
docker exec -it nginx /bin/bash
docker exec nginx ls /opt/ # 执行容器内命令 ls /opt/, 无终端交互,命令完成后自动退出
非后台运行进程退出: CRTL+P, 按 Q 退出不中断容器。
镜像管理
# 在线下载时需配置好镜像源(下节)
docker pull nginx:1.20 # 下载镜像 nginx 的 1.20版本到本地镜像库
docker images # 列出本地库的镜像。删除: docker rmi 镜像ID
docker save 50fe74b50e0d -o nginx-120.tar # 导出本地镜像为文件:nginx-120.tar
docker load -i nginx-120.tar # 导入镜像文件 nginx-120.tar
docker tag 50fe74b50e0d nginx:1.20 # id 50fe74b50e0d 的镜像 标记为 nginx:1.20
网络端口映射
将容器的服务端口映射到宿主机,-p <宿主机端口>:<容器服务端口>,( -p 可多次指定)。
# 容器nginx服务端口80/tcp 映射到宿主机的8080/tcp
docker run -d --name nginx -p 8080:80 nginx:1.20
# curl http://localhost:8080/
# iptables -nL DOCKER -t nat
存储卷挂载(映射)
将宿主机目录挂载(映射)到容器内,为容器提供持久化存储。-p <宿主机目录或文件>:<容器目录或文件>,( -v 可多次指定)。
docker run -d --name nginx -v /kdata/ngxdir:/usr/share/nginx/ nginx:1.20
# -v /kdata/ngxetc:/etc/nginx 增加配置目录
挂载目录时,注意文件目录权限, 容器进程用户对目录有权限要求。
日志
容器运行文件默认在:/var/lib/docker/containers/<容器ID>。日志文件 id*-json.log
docker logs <容器ID或名称> # -f 参数
容器文件复制
docker cp <容器ID或名称>:/dirfile <宿主机>:/dirfile
# 双向复制,不区分目录或文件, 是目录时表示复制目录及包含的文件。
1.3 镜像源
Docker 默认公共镜像仓库访问不稳定,国内镜像源配置参考: /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"https://docker.chenby.cn",
"http://mirror.azure.cn",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://hub.rat.dev"
]
}
修改后,重启服务或 dockerd 进程。
代理配置: /etc/docker/daemon.json
{
"proxies": {
"http-proxy": "http://127.0.0.1:7890",
"https-proxy": "http://127.0.0.1:7890"
}
}
默认数据目录
Docker 默认的目录在:/var/lib/docker/, 在 docker19 版本以后使用参数 data-root 来代替 graph
dockerd --data-root=/kdata/docker
或者 /etc/docker/daemon.json
{
"data-root": "/kdata/docker"
}
容器制作镜像
docker commit <容器ID> mydmg:v1 # [-a "author"] [-m "rev.tip"]
上传镜像需要登录: docker login, 可使用nexus自建镜像仓库
docker push mynexus/mydmg:v1
1.4 命令状态图
Docker命令执行及状态图

三、组件及实例
3.1 网络network
容器创建网络环境(Namespace 隔离) 。docker network --help
docker network create mynet # -d bridge 默认驱动 bridge, bridge | host | overlay | macvlan |i pvlan|none
docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 mynet
docker network ls | rm | connect
其中host 模式与宿主机共享网络,即不再用端口映射, 与 docker run --net host 相同,docker run 命令 --network 连接网络
3.2 卷volume
容器持久化存储,使用本地目录挂载到容器内目录,也可通过docker管理。 volume 目录在:/var/lib/docker/volumes/
docker volume create datavol # 创建存储卷 datavol
docker volume ls | rm | inspect datavol
docker run 命令里使用 -v datavol:/var/lib/mysql 挂载; 或者 --mount source=datavol,destination=/var/lib/mysql
3.3 mariadb数据库
mariadb 数据库使用本地目录挂载数据目录,还应该挂载配置文件实现参数调整。可先临时运行一次数据库镜像,把/etc/mysql目录复制出来。
mkdir /opt/mdbase; cd /opt/mdbase # mariadb 容器存储目录
mkdir -p mysql etc # mysql 为数据目录, etc 为配置文件目录,
etc 目录可从容器里复制出来进行修改, 或者直接简单生成: 空目录conf.d 文件mariadb.cnf
mariadb.cnf:
[client-server]
# port = 3306
socket = /run/mysqld/mysqld.sock
[mariadbd]
skip-host-cache
skip-name-resolve
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
初始化数据库,root 密码是"jdbAat10m"
docker run --name mariadb -v /opt/mdbase/mysql:/var/lib/mysql -v /opt/mdbase/etc:/etc/mysql \
-e MYSQL_ROOT_PASSWORD="jdbAat10m" -d mariadb:10.5.10
正常运行: docker run -v /opt/mdbase/mysql:/var/lib/mysql -v /opt/mdbase/etc:/etc/mysql --name mariadb -d mariadb:10.5.10
使用 -p 3306:3306 映射服务端口到宿主机, 或者 --net=host 模式与主机共用网络。修改mariadb.cnf参数后重启容器。
3.4 docker-compose
容器虚拟化是一种轻量级虚拟化技术,通过将应用程序及其所有运行时环境打包成一个独立的容器,实现了应用程序的隔离和环境的一致性。每个容器都运行在共享的操作系统内核上,通过隔离和安全性,具有独立的文件系统、网络和进程空间。
四、Zabbix容器部署
3.1 准备环境
Mariadb 数据库镜像
docker pull mariadb:10.5.10
Zabbix官方容器镜像
docker pull zabbix/zabbix-server-mysql:ol-6.0.40
docker pull zabbix/zabbix-web-apache-mysql:ol-6.0.40
关于镜像 tag:alpine-, ubuntu-, ol- 基于操作系统: alpine- 最小,兼容好适用于比较老 glibc,; ol Oracle Linux 稳定功能最全, ubuntu 居中。
tag中版本: 5.0-latest 5.0.* , 6.0-latest 6.0.* , 7.0-latest 7.0.*, 7.2-latest 7.2.* 对应zabbix 版本
本地目录(存储)规划
mkdir /opt/zbxdocker; cd /opt/zbxdocker # 作为 zabbix 容器部署目录
mkdir mariadb # 数据库目录, 其中有 mysql 数据目录和etc 配置目录及文件(方法见前文)
mkdir zbxserver # zabbix-server目录,其中有 etc/zabbix_server.conf 复制自容器;可创建脚本目录为容器扩展提供脚本
mkdir zbxweb # zabbix-web-mysql目录, 前端配置文件目录,可供修改的不多
网络子网
数据库到前端服务和后端程序可使用容器隔离的网络,不需要对外暴露。当然也可以 host 模式与宿主机共用
docker network create zbxnet
3.2 数据库(zabbix)
初始化数据库,root 密码"jdbAat10m",创建zabbix数据库和用户及密码。
docker run --name mariadb -t -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="centsuper" \
-v /opt//zbx6docker/mdbase/mysql:/var/lib/mysql -v /opt/zbx6docker/mdbase/etc:/etc/mysql \
-e MYSQL_ROOT_PASSWORD="jdbAat10m" --network=zbxnet -d mariadb:10.5.10
初始化完成后删除容器,后续正常运行:
docker run -v /opt/zbx6docker/mdbase/mysql:/var/lib/mysql -v /opt/zbx6docker/mdbase/etc:/etc/mysql --name mariadb --network=zbxnet -d mariadb:10.5.10
3.3 zabbix-server
初始化数据库,root 密码"jdbAat10m",创建zabbix数据库和用户及密码。
docker run --name zabbix-server -t -e DB_SERVER_HOST="mariadb" -e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zbx6super" \
-p 10051:10051 --network=zbxnet --init -d zabbix/zabbix-server-mysql:ol-6.0.40
把zabbix-server配置文件从容器里复制出来到本地目录: docker cp /etc/zabbix/zabbix_server.conf /opt/zbx6docker/zbxserver/etc
正常运行时挂载配置目录文件,供修改配置即:
docker run --name zabbix-server -t -e DB_SERVER_HOST="mariadb" -e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zbx6super" \
-v /opt/zbx6docker/zbxserver/etc:/etc/zabbix \
-p 10051:10051 --network=zbxnet --init -d zabbix/zabbix-server-mysql:ol-6.0.40
相同方法增加脚本目录,以便扩展功能
容器内目录: /usr/lib/zabbix/alertscripts externalscripts # parameter in zabbix_server.conf:
3.4 zabbix-web
zabbix前端这里为 apache/mysql 组合, 映射到宿主机端口 80/tcp
docker run --name zabbix-web -t -e ZBX_SERVER_HOST="zabbix-server" -e DB_SERVER_HOST="mariadb" \
-e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zbx6super" \
-p 80:8080 --network=zbxnet -d zabbix/zabbix-web-apache-mysql:ol-6.0.40
前端web 配置文件在容器内: /etc/zabbix/ /etc/zabbix/web 可视情况挂载本地。
3.5 docker-compose.yaml
zabbix前端这里为 apache/mysql 组合,
五、命令大全
1.1 命令
容器虚拟化是一种轻量级虚拟化技术,通过将应用程序及其所有运行时环境打包成一个独立的容器,实现了应用程序的隔离和环境的一致性。每个容器都运行在共享的操作系统内核上,通过隔离和安全性,具有独立的文件系统、网络和进程空间。