容器是一个进程,共用宿主机内核,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的优化
- 要修改的内容放到下层
- 使用体积小的alpine
- yum clean all 清理缓存
- 删除已解压的包
- 创建.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