docker 镜像 容器 存储 网络 仓库 监控

本文深入探讨Docker的使用,包括镜像创建与管理、容器的运行与优化、端口映射、数据卷的持久化、Dockerfile的编写技巧、容器编排、私有仓库 Harbor 的搭建以及网络配置如macvlan和overlay。此外,还介绍了如何利用Prometheus进行监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

容器是一个进程,共用宿主机内核,docker cs架构 是一个软件的打包技术。
net.ipv4.ip_forward内核转发参数

镜像

docker images 查看所有镜像
docker rmi 删除镜像
docker pull 从hub.docker.com上拉取镜像
docker search 从hub.docker.com上搜索镜像
docker load -i 从tar包导入镜像(一个tar包可以导入多个镜像)
docker import 导入镜像不显示标签
docker save 镜像名称 -o tar包名称 导出镜像
docker tag 给镜像打标签
docker image prune 清理镜像
docker history 查看镜像构建历史

容器

docker run 启动一个容器,无匹配镜像会自动下载 -d 后台运行 -i 交互式 -t 开启一个窗口 --restart=always 开机自启 --cpus 1 --memory 10M 限制容器资 源 --name 指定容器名称,不指定是随机字符 --rm容器退出后删除数据
docker ps 查看正在运行的容器 -a 查看所有容器 -q 只显示容器的id -l  显示第一个容器 --no-trunc 显示全部id号
docker start 启动容器
docker stop 停止容器 docker kill 强制停止
docker restart 重启容器
docker rm 删除容器 -f 强制删除正在运行的容器
docker exec -it 容器id或名称 命令 进入一个容器 ctrl+d 退出
docker attach 进入正在运行的容器 使用一个窗口 ctrl+p+q 偷偷退出
docker container prune 清理无效容器
docker stats 查看容器资源占用情况 --no-trunc 显示全部id号 查看所有容器
docker top 查看容器内的进程
docker logs 查看容器的输出信息
docker inspect 查看容器详情

docker system prune 镜像和容器

  • nginx 前台运行 nginx -g ‘daemon off;’
  • php前台运行 /usr/sbin/php-fpm --nodaemonize
  • httpd 前台运行 /usr/sbin/httpd -D FOREGROUND

docker login 登录hub.docker.com logout退出登录
docker login ip:port 登录私有仓库
密码文件 /root/.docker/config.json 加密方式base64

端口映射

-p 宿主机端口:容器端口/udp 使用udp协议做随机端口映射

-p 宿主机ip:宿主机端口:容器端口 (监听多个网卡)

-p 宿主机ip::容器端口 随机端口映射

-p 1111-1119:1111-1119 端口范围映射

-P 自动随机端口映射
net.ipv4.ip_local_port_range 调整随机端口的内核参数

数据卷

docker run

-v 宿主机绝对目录:容器目录 - -mount区别是自动创建文件

-v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据/var/lib/docker/volumes目录下

-v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据

- -volumes-from 跟某一个容器挂载所有相同的卷

docker cp 文件名称 容器id:容器路径 拷贝文件到容器

docker volume create 创建一个持久化卷

docker volume ls 查看所有持久化卷

docker volume rm 删除持久化卷

docker volume inspect 查看持久化卷详情

dockerfile

FROM基础镜像 继承CMD
RUN执行的命令
ADD添加的文件 自动解压tar包
COPY不自动解压tar包
CMD启动容器时的默认指令 [“nginx” “-g” “daemon off;”]
ENTRYPOINT不能被替换 启动容器时的指令可用做参数
VOLUME创建挂载点 用于容器之间的共享 ["/data1","/data2"]
ENV环境变量 (ssh密码)
LABEL镜像属性标签
MAINTAINER管理者标示
WORKDIR指定容器的工作目录 相当于cd
EXPOSE暴露的端口 使用-P参数
USER如果某个服务不需要特权执行,建议使用 USER 指令切换到非 root 用户
ONBUILD<其它指令>只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
ARG仅仅在build docker image的过程中生效的环境变量

docker build -t 镜像标签 . 创建镜像 寻找当前目录下的dockerfile文件
–no-cache=true build时不适用缓存

启用 BuildKit 构建
DOCKER_BUILDKIT=1 docker build .
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

dockerfile的优化

  1. 要修改的内容放到下层
  2. 使用体积小的alpine
  3. yum clean all 清理缓存
  4. 删除已解压的包
  5. 创建.dockerignore文件 写入当前目录忽略的文件和目录

一个宿主机内的容器通过容器名称进行互联,会修改hosts文件,仅支持单向通讯

docker run --name mysql-server -it \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -d mysql:5.7 \
      --character-set-server=utf8 --collation-server=utf8_bin
    
docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest
   
docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest
      
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

容器的编排

yum install docker-compose 需要epel源 双向通讯

version: '3'

services:

   mysql-server:

     image: mysql:5.7

     restart: always

     environment:

       MYSQL_ROOT_PASSWORD: root_pwd

       MYSQL_DATABASE: zabbix

       MYSQL_USER: zabbix

       MYSQL_PASSWORD: zabbix_pwd

     command: --character-set-server=utf8 --collation-server=utf8_bin

     

   zabbix-java-gateway:

     image: zabbix/zabbix-java-gateway:latest

     restart: always

     

   zabbix-server:

     depends_on:

       - mysql-server

     image: zabbix/zabbix-server-mysql:latest

     restart: always

     environment:

       DB_SERVER_HOST: mysql-server

       MYSQL_DATABASE: zabbix

       MYSQL_USER: zabbix

       MYSQL_PASSWORD: zabbix_pwd

       MYSQL_ROOT_PASSWORD: root_pwd

       ZBX_JAVAGATEWAY: zabbix-java-gateway

     ports:

       - "10051:10051"

       

   zabbix-web-nginx-mysql:

     depends_on:

       - zabbix-server

     image: zabbix/zabbix-web-nginx-mysql:latest

     ports:

       - "80:80"

     restart: always

     environment:

       DB_SERVER_HOST: mysql-server

       MYSQL_DATABASE: zabbix

       MYSQL_USER: zabbix

       MYSQL_PASSWORD: zabbix_pwd

       MYSQL_ROOT_PASSWORD: root_pwd

docker-compose up 启动docker-compose.yaml -d 后台
docker-compose down 停止服务

registry

创建仓库

docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry

打标签

docker tag alpine:3.9 10.0.0.11:5000/alpine:3.9

修改配置文件支持私人仓库

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"],#镜像加速
  "insecure-registries": ["10.0.0.11:5000"]
}

harbor

支持环境:docker 17.06.0-ce +和docker-compose 1.18.0+
install.sh 执行

网络

bridge默认NAT模式
host使用宿主机网络 性能高 不支持端口映射
container和容器共用网络 --network container:容器名称或id
none没有网络

创建网络

docker network create -d bridge --subnet 172.19.0.0/16 --gateway 172.19.0.1 xiaobing

ifconfig eth0:1 10.0.0.10/24 up 添加辅助ip
重启宿主机network会导致内核转发参数改变

macvlan

跨宿主机之间通讯 ping不通宿主机 每次需要指定ip地址
创建网络

docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1

启动容器

docker run -it --network macvlan_1 --ip 10.0.0.105 alpine:3.9 

overlay

在单独一台机器上配置consul

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap #-h指定容器主机名 server bootstrap 启动的参数

其他节点上配置允许

vim  /etc/docker/daemon.json
{
  "cluster-store": "consul://10.0.0.13:8500",#consul地址
  "cluster-advertise": "10.0.0.11:2376"#自己的地址
}

在其中一台节点创建网络

docker network create -d overlay --subnet 172.26.0.0/16 --gateway 172.26.0.1  ol1

创建的容器有两块网卡 eth0内网 eth1外网

prometheus

控制端安装主程序

vim prometheus.yml 
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'cadvisor' #容器的监控
    static_configs:
    - targets: ['10.0.0.11:8080','10.0.0.12:8080']
  - job_name: 'node_exporter' #被控端的主程序
    static_configs:
    - targets: ['10.0.0.11:9100','10.0.0.12:9100']

启动

./prometheus --config.file="prometheus.yml"

被控端安装主程序和cadvisor插件

docker run -d   -p 9100:9100   -v "/:/host:ro,rslave"   --name=node_exporter   quay.io/prometheus/node-exporter   --path.rootfs /host #ro只读 path.rootfs宿主机的系统文件挂载到/host目录下
Propagation 设置
shared原始安装的子安装会暴露给副本安装,并且副本安装的子安装也会传播到原始安装。
slave类似于共享的安装,但仅在一个方向上。如果原始安装显示一个子安装,副本安装可以看到它。但是,如果副本安装公开了子安装,则原始安装无法看到它。
private这座山是私人的。其中的子安装不会暴露给副本安装,并且副安装的子安装不会暴露给原始安装。
rshared与共享相同,但是传播也扩展到嵌套在任何原始或副本安装点内的挂载点。
rslave与从属设备相同,但传播也延伸到嵌套在任何原始或副本安装点内的挂载点。
rprivate默认。与私有相同,这意味着在原始或副本安装点内的任何位置都不会有安装点向任一方向传播。
docker run --volume=/:/rootfs:ro  --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro  --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest #detach=trun 容器运行于前台 默认false

多台机器安装同一软件的方法
开启yum缓存功能

[root@oldboy ~]# vim /etc/yum.conf 
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1

找到rpm包

find /var/cache/yum/x86_64/7/ -type f -name "*.rpm"

在其他机器上yum localinstall *.rpm

查看overlay2目录对应的容器

docker ps -q | xargs docker inspect --format ‘{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}’ | grep “”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值