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

容器是一个进程,共用宿主机内核,docker cs架构 是一个软件的打包技术。

镜像

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 指定容器名称,不指定是随机字符
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参数

docker build -t 镜像标签 . 创建镜像 寻找当前目录下的dockerfile文件

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"]
}

systemctl restart docker

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

使用grafana显示图形化

默认admin:admin
建立prometheus的数据源
导入图形的json文件下载地址

多台机器安装同一软件的方法
开启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

发布了48 篇原创文章 · 获赞 0 · 访问量 1843

猜你喜欢

转载自blog.csdn.net/weixin_45446068/article/details/104507350