1. 什么是容器
容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理
1)docker-ce的安装
主机名 | 内存 | ip |
---|---|---|
docker01 | 2G | 10.0.0.11 |
docker02 | 2G | 10.0.0.12 |
#开启yum缓存
keepcache=1
#安装docker-ce
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
systemctl enable docker
systemctl start docker
#验证
[root@docker01 yum.repos.d]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:25:41 2019
OS/Arch: linux/amd64
Experimental: false
#docker01
mkdir docker_rpm
find /var/cache/yum/x86_64/7/ -type f -name "*.rpm"
find /var/cache/yum/x86_64/7/ -type f -name "*.rpm"|xargs mv -t docker_rpm
ls docker_rpm
tar zcf docker_rpm.tar.gz docker_rpm
scp docker_rpm.tar.gz 10.0.0.12:/root
#docker02
tar xf docker_rpm.tar.gz
cd docker_rpm/
ls
yum localinstall *.rpm -y
2. docker镜像常用指令(image)
docker镜像:把系统文件打成压缩包
find /root/ -type f -name “*.tar.gz” | xargs -i docker load -i {}
或者for n in ls *.tar.gz
; do docker image load -i $n ; done
docker search 搜索镜像, 优先选官方
docker pull 拉取镜像(下载镜像)
docker push 推送镜像(上传镜像)
docker load 导入镜像
docker save 导出镜像
docker images 查看镜像列表
docker rmi 删除镜像
docker tag 给镜像打标签
docker inspect 查看镜像属性
docker image prune 清理无效镜像文件
docker system prune 清理所有无效镜像容器文件
docker build 自动构建镜像
docker history 查看镜像构建历史
例子: docker load -i docker_nginx.tar.gz 导入
例子:docker save centos:7 -o docker_centos7.tar.gz 导出
3. docker容器的常用命令(container)
docker run 创建并启动容器
docker create 创建容器
docker start 启动容器
docker stop 停止容器
docker kill 强制停止容器
docker restart 重启容器
docker ps 查看容器列表
docker rm 删除容器
docker exec 进入正在运行的容器(分配一个新终端)
docker attach 进入正在运行的容器(使用相同终端),偷偷离开ctrl+p,ctrl+q
docker commit 将容器提交为镜像
docker cp 在容器和宿主机之间相互拷贝
docker stats 监控容器
docker logs 查看容器初始命令的输出(用来排查)
docker top 查看容器内部启动进程
docker rename 容器重命名
docker rm -f `docker ps -a -q` 批量删除所有容器
docker exec 进入正在运行的容器(分配一个新终端)
例子: docker exec -it 容器id/容器名字 /bin/bash(/bin/sh)
-d 后台运行
-p 端口映射
-it 进入容器
--name 指定一个名字
docker ps -a -l 最后一个容器
--no-trunc 示完整命令
nginx -g' daemon off;' 把nginx运行起来,并且夯住(为什么启动nginx容器不用添加初始命令)
docker run(命令) 参数1参数2参数3(没有顺序) 最后一个参数(必须是镜像名称:版本)
4. docker端口映射**
docker run
-p 宿主机端口:容器端口
-p 宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口)
-p 宿主机ip1::容器端口 随机端口映射
-p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射
-p 80:80 -p 3306:3306
-p 1111-1119:1111-1119 端口范围映射
-P 自动随机端口映射
sysctl net.ipv4.ip_forward=0 临时调整内核参数
#添加ip地址
ifconfig eth0:1 10.0.0.10/24
ifconfig eth0:2 10.0.0.9/24
5. docker数据卷**
docker run(挂载的形式,可以在宿主机修改)
-v 宿主机绝对目录:容器目录(目录对目录;文件对文件)
-v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据
-v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据
--volumes-from 跟某一个容器挂载所有相同的卷
-v 挂载目录的时候,只能用绝对路径,不能使用相对路径
6. 手动制作docker镜像**
1)dockerfile单服务例子—基于centos7系统的nginx镜像
1:启动一个纯净的centos:7容器,在容器中安装nginx
[root@docker01 ~]# docker run --name didi -it -p 80:80 centos:7
[root@a9e7fb6d2d88 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo
[root@a9e7fb6d2d88 /]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker01 ~]# docker cp /etc/yum.repos.d/nginx.repo didi:/etc/yum.repos.d/nginx.repo
[root@a9e7fb6d2d88 /]# yum install nginx -y
[root@581199ef270b ~]# nginx
2:把安装好服务的容器,提交为镜像
[root@docker01 ~]# docker container commit didi centos7_nginx:1.6
3:测试镜像的功能(修改初始命令)
[root@docker01 ~]# docker run -d -p 81:80 centos7_nginx:1.6 nginx -g 'daemon off;'
2)dockerfile多服务例子1—基于centos7系统的kod网盘的镜像
1:启动一个纯净的centos:7容器,在容器中安装服务(基于上一个做好的nginx镜像即可)
[root@docker01 ~]# docker run -p 80:80 -it --name kod_dd centos7_nginx:1.6
[root@a9e7fb6d2d88 /]# yum install php-fpm php-gd php-mbstring -y
2:修改配置准备站点目录
[root@a9e7fb6d2d88 /]# vi /etc/php-fpm.d/www.conf
39 user = nginx
41 group = nginx
[root@a9e7fb6d2d88 /]# vi /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
root /html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name;
include fastcgi_params;
}
}
[root@a9e7fb6d2d88 /]# mkdir /html
[root@a9e7fb6d2d88 /]# cd /html/
[root@docker01 ~]# docker cp /opt/dockfile/kod/kodexplorer4.40.zip kod_dd:/html/kodexplorer4.40.zip
[root@a9e7fb6d2d88 html]# yum install -y unzip
[root@a9e7fb6d2d88 html]# unzip kodexplorer4.40.zip
[root@a9e7fb6d2d88 html]# chown -R nginx:nginx /html/
[root@a9e7fb6d2d88 html]# vi /init.sh
#/bin/bash
php-fpm -D
nginx -g 'daemon off;'
[root@a9e7fb6d2d88 html]# nginx
[root@a9e7fb6d2d88 html]# php-fpm -D
3:把安装好服务的容器,提交为镜像
[root@docker01 ~]# docker container commit kod_dd centos7_kod:v1
4:测试镜像的功能(修改初始命令)
[root@docker01 ~]# docker run -d -it -p 81:80 centos7_kod:v1 /bin/bash /init.sh
访问网站10.0.0.11:81
3)dockerfile多服务例子3—基于centos6系统的httpd+sshd双服务镜像
1:启动一个纯净的centos:7容器,在容器中安装服务
[root@docker01 ~]# docker run --name sshd_httpd -it -p 80:80 -p 1022:22 centos:6.9
[root@efcc408f4049 /]# yum install -y httpd openssh-server
[root@efcc408f4049 /]# vi /init.sh
#/bin/bash
/etc/init.d/sshd start;
/usr/sbin/httpd -D FOREGROUN
[root@efcc408f4049 /]# /etc/init.d/sshd start;/usr/sbin/httpd -D FOREGROUND
2:把安装好服务的容器,提交为镜像
[root@docker01 ~]# docker container commit dd centos6.9_sshd_httpd:v3
3:测试镜像的功能(修改初始命令)
[root@docker01 ~]# docker run -d -p 81:80 centos6.9_httpd_sshd:v1 /bin/bash /init.sh
[root@docker01 ~]# docker run -d -p 1023:22 centos6.9_httpd_sshd:v1 /bin/bash /init.sh
网页访问10.0.0.11:81
7. 自动制作docker镜像**
1)dockerfile常用指令
FROM 基础镜像
RUN 制作镜像过程中需要的执行命令(安装服务) 不能出现交互式命令
CMD 容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD 把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY 把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR 指定容器的默认工作目录
EXPOSE 镜像要暴露的端口
VOLUME 持久化卷
ENV 环境变量(ssh的密码,数据库的密码)
LABEL 镜像的属性标签
MAINTAINER 管理者标识
2)根据dockerfile自动构建镜像思路
a:手动制作docker镜像,记录历史命令
b:根据历史命令编写dockerfile文件
c:docker build构建docker镜像
d:测试镜像的功能
3)dockerfile单服务例子
1.创建目录
[root@docker01 opt]# mkdir /opt/dockfile/centos_nginx -p
[root@docker01 centos_nginx]# cd /opt/dockfile/centos_nginx
2.编写文件
[root@docker01 centos_nginx]# vim dockerfile
FROM centos:6.9
RUN yum install epel-release -y
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]
3.构建镜像
[root@docker01 centos_nginx]# docker image build -t centos6.9:v1 .
4.测试
[root@docker01 centos_nginx]# docker run -d -p 90:80 centos6.9_nginx:v1
#注意:centos6yum源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
4)dockerfile多服务例子1
1.创建目录
[root@docker01 opt]# mkdir /opt/dockfile/httpd_sshd -p
[root@docker01 httpd_sshd]# cd /opt/dockfile/httpd_sshd
2.编写文件
[root@docker01 httpd_sshd]# vim dockerfile
FROM centos:6.9
RUN yum install httpd openssh-server -y
RUN echo '123456'|passwd --stdin root
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
EXPOSE 80 1022
[root@docker01 httpd_sshd]# cat init.sh
#/bin/bash
/etc/init.d/sshd start;
/usr/sbin/httpd -D FOREGROUND
3.构建镜像
[root@docker01 httpd_sshd]# docker image build -t httpd_sshd:v1 .
4.测试
[root@docker01 httpd_sshd]# docker run -d -p 81:80 -p 1023:22 httpd_sshd:v1
5)dockerfile多服务例子2
1.创建目录
[root@docker01 opt]# mkdir /opt/dockfile/kod -p
[root@docker01 kod]# cd /opt/dockfile/kod
2.编写文件
[root@docker01 kod]# vim dockerfile
FROM centos:6.9
ADD nginx.repo /etc/yum.repos.d/nginx.repo
RUN yum install -y nginx && \
yum install php-fpm php-gd php-mbstring -y && \
yum clean all
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
RUN mkdir /html
WORKDIR /html
ADD kod.tar.gz /html
RUN chown -R nginx:nginx .
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
EXPOSE 80 81
[root@docker01 dockfile]# ll kod/
total 13136
-rw-r--r-- 1 root root 391 Feb 21 20:40 default.conf
-rw-r--r-- 1 root root 376 Feb 24 16:19 dockerfile
-rw-r--r-- 1 root root 45 Feb 21 20:33 init.sh
-rw-r--r-- 1 root root 13422511 Feb 24 16:10 kod.tar.gz
-rw-r--r-- 1 root root 192 Feb 21 20:39 nginx.repo
-rw-r--r-- 1 root root 10016 Feb 21 20:37 www.conf
3.构建镜像
[root@docker01 kod]# docker image build -t kod:v1 .
4.测试
[root@docker01 kod]# docker run -d -p 82:80 kod:v1
8. docker镜像的分层(复用,节省空间)
9. dockerfile的优化
a:使用体积小的linux镜像alpine
b:尽可能的清理无用的缓存文件(尽可能把多个run合并,用&&连接)
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件
# docker run -it -p 80:80 alpine:latest /bin/sh
/ # cat /etc/apk/repositories #yum源
/ # sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
/ # apk update
/ # apk add nginx
/ # nginx -v
/ # mkdir /run/nginx
/ # nginx
/ # apk add curl
/ # cat /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
root /html;
index index.html index.htm;
}
location = /404.html {
internal;
}
}
/ # nginx -t
/ # nginx -s stop
/ # nginx
/ # mkdir /html
/ # cd /html/
/html # echo 'oldboy' >index.html
/html # apk add php7-fpm
/html # apk add php7-curl
/html # php-fpm7 -m
####php模块,每一个模块就是一个插件,不建议上来就安装一堆模块
漏洞风险更大,消耗更多的资源。docker尽可能小,php模块用多少装多少
10. 容器间的互联
docker run --link 正在运行容器的名字(单方向)
[root@docker01 ~]# docker run -it --link didi alpine:latest
/ # cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 didi ef5708fb5fc3
172.17.0.3 d8df0b987b80
/ # ping didi
PING didi (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.178 ms
第一步:下载
[root@docker01 srv]# docker pull mysql:5.7
[root@docker01 srv]# docker pull zabbix-java-gateway:latest
[root@docker01 srv]# docker pull zabbix-server-mysql:latest
[root@docker01 srv]# docker pull zabbix-web-nginx-mysql:latest
第二步:导入
[root@docker02 srv]# for n in `ls *` ;do docker load -i $n ;done
第三步:启动容器
[root@docker01 srv]#
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
####登录数据库
[root@docker01 srv]# docker exec -it mysql-server /bin/bash
root@9b7201d205b2:/# mysql -uroot -proot_pwd
第四步:访问浏览器 10.0.0.11 Admin---zabbix
11. 单机版的容器编排
# yum install docker-compose -y (需要epel源)
# mkdir -p /opt/dock-compose/zabbix
# cat /opt/dock-compose/zabbix/dock-compose.yml
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
[root@docker01 zabbix]# docker-compose up
访问10.0.0.11
ctrl+c容器就死掉了
####注意
docker-compose版本v1 v2 v3, 每一一个版本语法,功能不一样
docker- compose中不需要link,↓docker- compose内部提供dns功能,通过service的名字来通信,双向通讯
有了docker-compose,可以很简单的启动多个容器
docker-compose up 创建并启动容器
docker-compose down 停止并删除容器
docker-compose start 启动一个或多个容器
docker-compose stop 停止一个或多个容器
docker-compose restart 重启一个或多个容器
docker-compose up -d 后台运行 启动服务
docker-compose down 停止服务
12. 私有仓库docker-registry
docker私有仓库:配置简单、功能简单、占用资源少
第一步:上传仓库镜像包并导入镜像
[root@docker01 ~]# docker load -i registry.tar.gz
第二步:启动私有仓库
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
第三步:上传一个镜像
a 打标签 docker tag alpine:3.9 10.0.0.11:5000/alpine:3.9
b 上传 docker image push 10.0.0.11:5000/alpine:3.9
注意:第一次上传镜像会报错
[root@docker01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com"
],
"insecure-registries": ["10.0.0.11:5000"]
}
第四步:重启docker服务
[root@docker01 ~]# systemctl restart docker
第五步:上传镜像
[root@docker01 ~]# docker image push 10.0.0.11:5000/oldboy/alpine:latest
[root@docker01 ~]# scp -r /etc/docker/daemon.json root@10.0.0.12:/etc/docker/daemon.json
注意镜像地址区分
nginx:1.15 官方仓库的官方镜像
nginx/nginx:1.15 官方仓库的用户镜像
daocloud.io/nginx/nginx:1.15 私有仓库的镜像
客户端下载镜像
[root@docker02 ~]# systemctl restart docker
[root@docker02 ~]# docker image pull 10.0.0.11:5000/oldboy/alpine:latest
docker官方仓库:友好的web界面,支持多用户,支持认证
上传一个镜像到官方仓库:
a: docker hub注册一个仓库
b: 登录docker login
# docker login
c: 打标签
# docker tag 10.0.0.11:5000/oldboy/alpine:latest 807529573/alpine:latest
d: 上传
# docker push 807529573/alpine:latest
13. 企业级私有仓库harbor(docker-compose)
harbor:企业级的私有仓库,(基于registry扩展了很多功能)需要2G内存
harbor是VMware中国团队开发10.0.0.12
1)配置环境
第一步:下载安装器
harbor-offline-installer-v1.8.0.tgz
第二步:解压
[root@docker02 opt]# tar xf harbor-offline-installer-v1.8.0.tgz
第三步:安装docker-compose并导入镜像
[root@docker02 opt]# cd harbor/
[root@docker02 harbor]# yum install -y docker-compose(需要eple源)
[root@docker02 harbor]# docker load -i harbor.v1.8.0.tar.gz
第四步:修改配置文件
[root@docker02 harbor]# cat harbor.yml
5 hostname: 10.0.0.12
27 harbor_admin_password: 123456
第五步:执行安装脚本
[root@docker02 harbor]# vim install.sh #镜像之前已经导入
152 # docker load -i ./harbor*.tar.gz
[root@docker02 harbor]# ./install.sh
第六步:浏览器访问10.0.0.12,登录admin(123456)
2)上传镜像文件
第一步:修改配置文件
[root@docker01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://1nj0zren.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com"
],
"insecure-registries": ["10.0.0.11:5000","10.0.0.12"]
}
[root@docker01 ~]# systemctl restart docker
第二步:登录harbor仓库
[root@docker01 ~]# docker login 10.0.0.12
第三步:打标签并上传镜像
[root@docker01 ~]# docker tag alpine:latest 10.0.0.12/library/alpine:latest
[root@docker01 ~]# docker push 10.0.0.12/library/alpine:latest
第四步:刷新网站页面查看
3)为harbor配置https证书
第一步:修改harbor.yml--http加上注释,https取消注释
[root@docker02 harbor]# cat -n harbor.yml
5 hostname: blog.oldqiang.com
7 # http related config
8 #http:
9 # port for http, default is 80. If https enabled, this port will redirect to https port
10 # port: 80
13 https:
14 port: 443
15 certificate: /your/certificate/path
16 private_key: /your/private/key/path
第二步:上传解压配置证书
[root@docker02 opt]# tar xf blog.oldqiang.com.zip
[root@docker02 harbor]# cat -n harbor.yml
13 https:
14 port: 443
15 certificate: /opt/Nginx/1_blog.oldqiang.com_bundle.crt
16 private_key: /opt/Nginx/2_blog.oldqiang.com.key
第三步:配置域名(每一台机器)
# cat /etc/hosts
10.0.0.12 blog.oldqiang.com
本地hosts解析
10.0.0.12 blog.oldqiang.com
第四步:#重新执行安装脚本
./install.sh
第五步:访问网站blog.oldqiang.com
4)测试
[root@docker02 harbor]# docker pull blog.oldqiang.com/library/alpine:latest
latest: Pulling from library/alpine
Digest: sha256:57334c50959f26ce1ee025d08f136c2292c128f84e7b229d1b0da5dac89e9866
Status: Downloaded newer image for blog.oldqiang.com/library/alpine:latest
blog.oldqiang.com/library/alpine:latest
5)将docker redistry镜像迁移到harbor
第一步:上传镜像在docker01上
docker tag xiaoniao:v1 10.0.0.11:5000/xiaoniao:v1
docker puh 10.0.0.11:5000/xiaoniao:v1
第二步:配置网页版harbor
14. docker基础网络
四种基础网络类型
bridge 默认类型,NAT模式(最常用)
host host类型,使用宿主机网络,网络性能最高,宿主机的主机名,宿主机的host解析文件
container 容器类型,使用其他容器共用网络,k8s中使用,容器的主机名,容器的host解析文件
none 没有网络,上不了外网功能受限制
注意:
host类型,容器不需要做端口映射
container类型,共用ip地址,节省ip地址,两个容器80,9000 127.0.0.1
举例:
docker run -d -it --network bridge/host/container:其他容器的id/none centos:6.9
创建自定义网络
[root@docker01 opt]# docker network create -d bridge --gateway 172.19.0.1 --subnet 172.19.0.0/16 oldboy
27269f83a482fbb95712bb8d6efc1d2ad6ff2f2cefcb8c25812f9980ef9140f4
[root@docker01 opt]# docker run -it --network oldboy alpine:latest
-d:网络类型
注意:ip地址范围
公网ip:
私网ip:10.0.0.0~10.255.255.255 和172.16.0.0~172.31.255.255
15. 跨宿主机容器间的通讯之macvlan
macvlan类似与虚拟机的桥接网络
1)跨宿主机通信(ping不通宿主机)
2)需要手动管理ip分配
3)不需要端口映射就能被外界访问
#创建网络并启动容器
[root@docker01 ~]# docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
da7fd7ea5736eae3c9d3768425e09d762f77d5d9a84aa8269b0df1e104e4181e
[root@docker01 ~]# docker run -it --network macvlan_1 --ip 10.0.0.99 alpine:latest
[root@docker02 ~]# docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
[root@docker02 ~]# docker run -it --network macvlan_1 --ip 10.0.0.98 10.0.0.11:5000/oldboy/alpine:latest
测试:
16. 跨宿主机容器间的通讯之overlay
1)跨宿主机通信(ping不通宿主机)
2)不需要手动管理ip分配,ip地址分配由数据库(consul)管理
3)overlay全局网络,在任意一个节点创建即可
4)需要端口映射就能被外界访问
第一步:部署docker并上传导入镜像文件
[root@docker03 ~]# docker load -i docker_progrium_consul.tar.gz
第二步:consul存储ip地址的分配
[root@docker03 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
第三步:docker01、02上添加
8 "insecure-registries": ["10.0.0.11:5000","10.0.0.12"],
9 "cluster-store": "consul://10.0.0.13:8500", #集群信息存储在consul上
10 "cluster-advertise": "10.0.0.11:2376" #节点自己的信息
[root@docker01 ~]#systemctl restart docker
访问10.0.0.13:8500
注意:overlay网络的宿主机的主机名不能相同
第四步:创建overlay网络(可以在任意节点创建)
[root@docker01 ~]# docker network create -d overlay --gateway 172.31.0.1 --subnet 172.31.0.0/16 ol1
第五步:启动容器测试
[root@docker01 ~]# docker run -it --network ol1 --name test01 alpine:latest
[root@docker02 ~]# docker tag 10.0.0.11:5000/oldboy/alpine:latest alpine:latest
[root@docker02 ~]# docker run -it --network ol1 --name test02 alpine:latest
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
17. docker容器的监控
docker容器的监控:
宿主机的资源:还剩下多少内存,磁盘空间,cpu负载
容器的资源:每一个容器使用的cpu,内存,磁盘
zabbix:监控,低级自动发现(命令行取值)
prometheus:只是对容器支持比较好,在其他很多地方,还不是很完善
docker容器的监控 | 宿主机的资源:还剩下多少内存,磁盘空间,cpu负载 |
---|---|
容器的资源:每一个容器使用的cpu,内存,磁盘 | |
zabbix | 监控,低级自动发现(命令行取值) |
prometheus | 只是对容器支持比较好,在其他很多地方,还不是很完善 |
功能 | 分析数据,存储数据(时间序列数据库) |
构成 | prometheus:主程序 alertmanager:报警 |
监控采集数据插件 | blackbox_exporter consul_exporter graphite_exporter haproxy_exporter memcached exporter mysqld_exporter node_exporter: 宿主机 |
第三方采集数据插件 | cadvisor 监控容器 nginx |
alertmanager:报警
第一步:上传导入(docker01,docker02)
docker_monitor_node.tar.gz
[root@docker01 ~]# docker load -i docker_monitor_node.tar.gz
第二步:客户端节点,启动node-exporter和启动cadvisor(docker01,docker02)
[root@docker01 ~]# docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
[root@docker01 ~]# 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
第三步:prometheus节点,安装prometheus和grafana(docker03)
[root@docker03 opt]# tar xf prometheus-2.12.0.linux-amd64.tar.gz
第四步:更改配置文件(docker03)
[root@docker03 opt]# cd prometheus-2.12.0.linux-amd64/
[root@docker03 prometheus-2.12.0.linux-amd64]# cat prometheus.yml
21 scrape_configs:
22 # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
23 - job_name: 'prometheus'
24 static_configs:
25 - targets: ['localhost:9090']
26 - job_name: 'node_exporter'
27 static_configs:
28 - targets: ['10.0.0.11:9100','10.0.0.12:9100']
29 - job_name: 'cadvisor'
30 static_configs:
31 - targets: ['10.0.0.11:8080','10.0.0.12:8080']
第五步:启动(docker03)
[root@docker03 prometheus-2.12.0.linux-amd64]# ./prometheus --config.file="prometheus.yml"
第六步:安装grafana
[root@docker03 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-6.6.2-1.x86_64.rpm
[root@docker03 ~]# yum localinstall grafana-6.6.2-1.x86_64.rpm -y
#启动grafana
[root@docker03 ~]# systemctl start grafana-server.service
[root@docker03 ~]# systemctl enable grafana-server.service
#访问grafana http://IP:3000,默认账号admin:admin
新建数据源--导入dashboard模板
第六步:安装grafana
[root@docker03 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-6.6.2-1.x86_64.rpm
[root@docker03 ~]# yum localinstall grafana-6.6.2-1.x86_64.rpm -y
#启动grafana
[root@docker03 ~]# systemctl start grafana-server.service
[root@docker03 ~]# systemctl enable grafana-server.service
#访问grafana http://IP:3000,默认账号admin:admin
新建数据源--导入dashboard模板
调光
https://grafana.com/grafana/dashboards