Docker 容器虚拟化技术

目录

加载中...

一、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 命令

容器虚拟化是一种轻量级虚拟化技术,通过将应用程序及其所有运行时环境打包成一个独立的容器,实现了应用程序的隔离和环境的一致性。每个容器都运行在共享的操作系统内核上,通过隔离和安全性,具有独立的文件系统、网络和进程空间。

docker attach #连接到正在运行中的容器
docker build #使用 Dockerfile 创建镜像
docker builder #管理builds
    docker builder prune #清除build缓存
docker checkpoint #管理checkpoints
    docker checkpoint create #从正在运行的容器创建检查点
    docker checkpoint ls #列出容器的检查点
    docker checkpoint rm #删除指定的检查点
docker commit #从容器创建一个新的镜像
docker config #管理Docker配置
    docker config create #创建配置文件
    docker config inspect #查看配置文件信息
    docker config ls #显示docker里已经保存得配置文件
    docker config rm #删除配置文件
docker container #管理容器
    docker container prune #删除所有已停止的容器
docker context #管理contexts
    docker context create #创建一个上下文
    docker context export #将上下文导出到tar或kubecconfig文件中
    docker context import #从tar或zip文件导入上下文
    docker context inspect #在一个或多个上下文上显示详细信息
    docker context ls #列出上下文
    docker context rm #删除一个或多个上下文
    docker context update #更新
    docker context use #设置当前docker的上下文
docker cp #用于容器与主机之间的数据拷贝
docker create #创建一个新的容器但不启动它
docker diff #检查容器里文件结构的更改
docker events #从服务器获取实时事件
docker exec #在运行的容器中执行命令
docker export #将文件系统作为一个tar归档文件导出到STDOUT
docker history #查看指定镜像的创建历史
docker image #管理镜像
    docker image inspect #显示一个或多个镜像的元数据
    docker image ls #列出本地镜像
    docker image prune #删除没有使用的镜像
    docker image rm #删除一个或多个镜像
docker images #列出本地镜像
docker import #从归档文件中创建镜像
docker info #显示 Docker 系统信息,包括镜像和容器数
docker inspect #获取容器/镜像的元数据
docker kill #杀掉一个运行中的容器
docker load #导入使用 docker save 命令导出的镜像
docker login #登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout #登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logs #获取容器的日志
docker manifest #管理manifest(实验,不应用于生产环境)
    docker manifest annotate #向本地镜像清单添加附加信息
    docker manifest create #创建用于注释和推入注册表的本地清单列表
    docker manifest inspect #显示镜像清单或清单列表
    docker manifest push #将清单列表推入仓库
    docker manifest rm #从本地存储中删除一个或多个清单列表
docker network #管理网络
    docker network connect #将容器连接到网络
    docker network create #创建一个网络
    docker network disconnect #断开容器的网络
    docker network inspect #显示一个或多个网络的元数据
    docker network ls #列出网络
    docker network prune #删除所有没有使用的网络
    docker network rm #删除一个或多个网络
docker node #管理集群(swarm)节点
    docker node demote #从群集(swarm)管理器中降级一个或多个节点
    docker node inspect #显示一个或多个节点的元数据
    docker node ls #列出群集(swarm)中的节点
    docker node promote #将一个或多个节点推入到群集管理器中
    docker node ps #列出在一个或多个节点上运行的任务,默认为当前节点
    docker node rm #从群集(swarm)删除一个或多个节点
    docker node update #更新一个节点
docker pause #暂停容器中所有的进程
docker plugin #管理插件
    docker plugin create #从rootfs和配置创建一个插件。插件数据目录必须包含config.json和rootfs目录。
    docker plugin disable #禁用插件
    docker plugin enable #启用插件
    docker plugin inspect #显示一个或多个插件的元数据
    docker plugin install #安装一个插件
    docker plugin ls #列出所有插件
    docker plugin push #将插件推送到注册表
    docker plugin rm #删除一个或多个插件
    docker plugin set #更改插件的设置
    docker plugin upgrade #升级现有插件
docker port #列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口
docker ps #列出容器
docker pull #从镜像仓库中拉取或者更新指定镜像
docker push #将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker rename #重命名容器
docker restart #重启容器
docker rm #删除一个或多个容器
docker rmi #删除一个或多个镜像
docker run #创建一个新的容器并运行一个命令
docker save #将指定镜像保存成 tar 归档文件
docker search #从Docker Hub查找镜像
docker secret #管理Docker secrets
    docker secret create #从文件或STDIN创建一个秘密作为内容
    docker secret inspect #显示有关一个或多个秘密的详细信息
    docker secret ls #列出秘密
    docker secret rm #删除一个或多个秘密
docker service #管理服务
    docker service create #创建一个服务
    docker service inspect #查看服务的元数据
    docker service logs #获取服务的日志
    docker service ls #列出服务
    docker service ps #列出一个或多个服务的任务
    docker service rm #删除一个或多个服务
    docker service rollback #将更改恢复到服务的配置
    docker service scale #缩放一个或多个复制服务
    docker service update #更新服务
docker stack #管理堆栈
    docker stack deploy #部署新的堆栈或更新现有堆栈
    docker stack ls #列出现有堆栈
    docker stack ps #列出堆栈中的任务
    docker stack rm#删除堆栈
    docker stack services #列出堆栈中的服务
docker start #启动一个或多个已经被停止的容器
docker stats #显示容器的实时流资源使用统计信息
docker stop #停止一个运行中的容器
docker swarm #管理集群(Swarm)
    docker swarm ca #查看或旋转当前群集CA证书。此命令必须针对管理器节点
    docker swarm init #初始化一个群集(Swarm)
    docker swarm join #加入群集作为节点和/或管理器
    docker swarm join-token #管理加入令牌
    docker swarm leave #离开群集(Swarm)
    docker swarm unlock #解锁群集(Swarm)
    docker swarm unlock-key #管理解锁钥匙
    docker swarm update #更新群集(Swarm)
docker system #管理Docker
    docker system df #显示docker磁盘使用情况
    docker system events #从服务器获取实时事件
    docker system info #显示系统范围的信息
    docker system prune #删除未使用的数据
docker tag #标记本地镜像,将其归入某一仓库
docker top #查看容器中运行的进程信息,支持 ps 命令参数
docker trust #管理Docker镜像的信任
    docker trust inspect #返回有关key和签名的低级信息
    docker trust key #管理登入Docker镜像的keys
    docker trust key generate #生成并加载签名密钥对
docker trust key load#加载私钥文件以进行签名
    docker trust revoke #删除对镜像的认证
    docker trust sign #镜像签名
    docker trust signer #管理可以登录Docker镜像的实体
    docker trust signer add #新增一个签名者
docker trust signer remove#删除一个签名者
docker unpause #恢复容器中所有的进程
docker update #更新一个或多个容器的配置
docker version #显示 Docker 版本信息
docker volume #管理volumes
    docker volume create #创建一个卷
    docker volume inspect #显示一个或多个卷的元数据
    docker volume ls #列出卷
    docker volume prune #删除所有未使用的卷
    docker volume rm #删除一个或多个卷
docker wait #阻塞运行直到容器停止,然后打印出它的退出代码