docker容器
1. 什么是容器?
容器就是在隔离的环境中运行的一个进程,如果进程停止,容器就会退出。隔离的环境拥有自己的系统文件,ip地址,主机名等
kvm虚拟机,linux,系统文件
程序:代码,命令 进程:正在运行的程序
2.容器和虚拟化的区别
linux容器技术,容器虚拟化和kvm虚拟化的区别
kvm虚拟化: 需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
1.linux开机启动流程:
bios开机硬件自检 basic input output system
根据bios设置的优先启动项boot 网卡 硬盘 u盘 光驱 读取grub(mbr)引导 2T UEFI(gpt分区) mbr硬盘分区信息,内核加载路径,加载内核
启动第一个进程/sbin/init systemd
系统初始化完成 运行服务(nginx,httpd,mysql) 。。。
2.容器启动流程: 共用宿主机内核: 第一个进程直接启动服务(nginx,httpd,mysql)
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行在linux系统上
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统
3.容器技术的发展过程
### 1):chroot技术,新建一个子系统(拥有自己完整的系统文件)
参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ chang root
实战1:使用chroot监狱限制SSH用户访问指定目录和使用指定命令(cp,ls) https://linux.cn/article-8313-1.html ldd /bin/ls
### 2):linux容器(lxc) linux container(namespaces 命名空间 隔离环境 及cgroups 进程资源限制)
cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io
kvm虚拟机:资源限制(1c 1G 20G)
需要使用epel源
yum install epel-release -y
编译epel源配置文件
vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch/debug
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/SRPMS
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
安装lxc
yum install lxc-* -y yum install libcgroup* -y yum install bridge-utils.x86_64 -y
桥接网卡
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
echo 'TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=virbr0' >/etc/sysconfig/network-scripts/ifcfg-eth0
[root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-virbr0
echo 'TYPE=Bridge
BOOTPROTO=static
NAME=virbr0
DEVICE=virbr0
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
DNS1=180.76.76.76' >/etc/sysconfig/network-scripts/ifcfg-virbr0
启动cgroup
systemctl start cgconfig.service
启动lxc
systemctl start lxc.service
创建lxc容器
方法1: lxc-create -t download -n centos6 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images -d centos -r 6 -a amd64 方法2: lxc-create -t centos -n test
为lxc容器设置root密码:
[root@controller ~]# chroot /var/lib/lxc/test/rootfs passwd Changing password for user root. New password: BAD PASSWORD: it is too simplistic/systematic BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully.
为容器指定ip和网关
vi /var/lib/lxc/centos7/config
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.0.111/24
lxc.network.ipv4.gateway = 10.0.0.254
启动容器
lxc-start -n centos7
### 3):docker容器
centos7.6 2G 10.0.0.11 docker01 host解析 centos7.6 2G 10.0.0.12 docker02 host解析
Docker是通过进程虚拟化技术(namespaces及cgroups cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。 namespace 资源隔离 cgroups 进程的资源限制 kvm 虚拟磁盘文件,资源隔离 kvm 资源限制,--cpus --memory
docker 初期把lxc二次开发,libcontainer
4.docker的安装
10.0.0.11:修改主机名和host解析
rm -fr /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
安装docker-ce
yum install docker-ce -y
5.docker的主要组成部分
docker是传统的CS架构分为docker client和docker server,和mysql一样
查看docker版本:
docker version
docker主要组件有:镜像、容器、仓库, 网络,存储
启动容器必须需要一个镜像,仓库存储镜像 容器--->镜像--->仓库
6.启动第一个容器
docker的主要目标是"Build,Ship and Run any App,Angwhere",构建,运输,处处运行 部署服务,环境问题
一次构建,处处运行
docker是一种软件的打包技术
docker初次体验: 安装Nginx步骤: 官网下载Nginx源码包wget
tar 创建Nginx用户
编译安装 ./config.... 修改配置文件, 启动
配置docker镜像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
docker run -d -p 80:80 nginx
run(创建并启动一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字
7.docker的镜像管理
搜索镜像 docker search 选镜像的建议:
1,优先考虑官方 2,stars数量多
官方镜像仓库地址:hub.docker.com
获取镜像
docker pull(push) 镜像加速器:阿里云加速器,daocloud加速器,中科大加速器,Docker 中国官方镜像加速:https://registry.docker-cn.com官方
pull docker pull centos:6.8(没有指定版本,默认会下载最新版)
私有仓库pull
docker pull daocloud.io/huangzhichong/alpine-cn:latest
查看镜像列表
docker images or docker image ls
删除镜像
docker rmi 例子:docker image rm centos:latest
导出镜像
docker save 例子:docker image save centos:latest -o docker-centos7.4.tar.gz
导入镜像
docker load 例子:docker image load -i docker-centos7.4.tar.gz
docker search php 在官方仓库中查询镜像
docker pull nginx 拉取镜像
docker image ls 查看所有镜像
docker images
docker image import docker_centos6.9.tar.gz 导入镜像但不带镜像名称和版本号
docker image load -i docker_alpine3.9.tar.gz 导入镜像
docker image save nginx:latest -o /tmp/docker_nginx.tar.gz 导出镜像
docker image rm busybox:latest 删除镜像
docker rmi
docker image history nginx 查看镜像历史
docker image tag a19653214294 centos:6.9 给镜像设定名称版本号
8.docker的容器管理
docker run -d -p 80:80 nginx:latest
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v 源地址(宿主机):目标地址(容器)
nginx docker镜像的名字
docker run -it --name centos6 centos:6.9 /bin/bash
-it 分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令
运行容器
docker run image_name
docker run 等同于 docker create + docker start
启动容器
docker start
停止容器
docker stop CONTAINER_ID
杀死容器
docker kill container_name
查看容器列表
docker ps(-a -l -q)
进入正在运行的容器(目的,调试,排错)
*** docker exec (会分配一个新的终端tty)
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker attach(使用同一个终端) 偷偷离开的快捷键ctrl+p,ctrl+q
docker attach [OPTIONS] CONTAINER
删除容器
docker rm
批量删除容器
docker rm -f `docker ps -a -q`
总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出状态!
业务在容器中运行:初始命令一定要夯住并且启动服务
例如:
nginx -g 'daemon off;'
/usr/sbin/zabbix_agentd -f -c /etc/zabbix/zabbix_agentd.conf
docker create centos:6.9 创建一个容器
docker start 4a0ab8445501 启动容器
docker stop 4a0ab8445501 停止一个容器
docker restart 20da4e87d10f 重启一个容器
docker ps:查看容器,默认查看正在运行的
-a:查看所有容器
-l:查看最新的容器
-q: 查看所有容器的id
docker run -d nginx:latest:创建运行一个容器相当于 create+start
-d:将程序放在后台执行
-p:指定映射端口
-v:指定将宿主机文件挂载到容器中的指定文件
docker rm b3d15ddb5f97 删除一个容器[id]
-f:强制删除
docker rm -f `docker ps -a -q` 批量删除
docker kill 20da4e87d10f 杀死一个容器
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh) 进入正在运行的容器
docker attach(使用同一个终端) 偷偷离开的快捷键ctrl+p,ctrl+q
docker exec -it heuristic_buck /bin/bash 开启一个新的会话窗口并进入一个容器
docker attach 20da4e87d10f 使用同一个会话窗口并进入容器
docker rename heuristic_buck yiliao 修改容器的名称
docker logs yiliao 查看容器的终端输出(日志)
docker cp 容器:宿主机
docker diff 比对容器修改的操作
docker export ID 导出容器
docker import ID 导入容器
9.docker容器的网络访问(端口映射)
docker默认使用nat网络,使用命令-p指定,docker会自动添加iptables规则实现端口映射
映射80端口到容器的80端口—81到81:
docker run -d -p 80:80 -p 81:81 nginx:latest多容器使用80端口
添加IP地址:
ifconfig eth0:0 10.0.0.12 up
ifconfig eth0:1 10.0.0.13 up
映射:
docker run -d -p 10.0.0.11:80:80 nginx:latest
docker run -d -p 10.0.0.12:80:80 nginx:latest
docker run -d -p 10.0.0.13:80:80 nginx:latest
- 随机端口映射
随机端口映射到容器的80
docker run -d -p ::80 nginx:latest
docker run -d -P nginx:latest
随机端口映射udp
docker run -d -p ::80/udp nginx:latest
10.docker的数据卷管理
nginx 站点 /usr/share/nginx/html
-v /opt/xiaoniao:/usr/share/nginx/html
持久化 数据卷(文件或目录)
-v 卷名:/data (第一次卷是空,会容器的数据复制到卷中,如果卷里面有数据,把卷数据的挂载到容器中)
-v src(宿主机的目录):dst(容器的目录)
数据卷容器 `--volumes-from`(跟某一个已经存在的容器挂载相同的卷)基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现小鸟。
-p 80:80 -p 81:81 -v xxx:xxx -v xxx:xxxx 基于nginx多端口的多站点。
1. 将本地文件或目录挂载到容器的文件或目录中:
docker run -d -p 80:80 -p 81:81 -v /code/default.conf:/etc/nginx/conf.d/default.conf -v /code:/usr/share/nginx/html nginx:latest
2. 创建卷:
docker run -d -p 80:80 -v test:/usr/share/nginx/html nginx:latest
docker volume ls 查看卷
11.手动将容器保存为镜像
docker run -d centos:6.9 tail -f /etc/hosts
2. 进入容器创建环境
docker exec -it 88711c979d1b /bin/bash
3. 创建完环境后,回到宿主机提交镜像
docker commit 88711c979d1b yiliao:v2
4. 导出镜像
docker save yiliao:v2 -o docker_yiliao_v2
=============================================================================================
#1.基于c6手动制作httpd服务的镜像
=============================================================================================
1):基于容器制作镜像
docker run -it centos:6.9
yum install httpd
yum install openssh-server
/etc/init.d/sshd start
vi /init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod +x /init.sh
2)将容器提交为镜像
docker commit 容器id或者容器的名字 新的镜像名字[:版本号可选]
docker commit oldboy centos6-ssh-httpd:v1
3)测试镜像功能是否可用
手动制作的镜像,传输时间长 镜像初始命令
=============================================================================================
#2.基于c6手动制作Nginx服务的镜像
=============================================================================================
1:启动一个基础容器,安装服务(部署项目)
docker run -it -p 80:80 centos:6.9
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
yum install unzip -y
cd /usr/share/nginx/html/
rm -fr *
curl -o yiliao.zip http://192.168.37.200/191127/everyxiaoqiang-yiliao-master.zip
unzip yiliao.zip
mv yiliao/* .
2:把安装好服务的容器,提交成镜像
docker commit 9f366f3988cd yiliao:v1
3:测试,刚才提交的镜像
docker run -d -p 81:80 yiliao:v1 nginx -g 'daemon off;'
==========================================================
#3.基于alpine手动制作Nginx+PHP服务的镜像
==========================================================
1:启动一个基础容器,安装服务(部署项目)
[root@docker01 ~]# docker run -it -p 80:80 alpine:latest
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
apk update
apk add nginx php7-intl php7-openssl php7-pdo_mysql php7-common php7-fpm php7-mysqlnd
php7-mbstring php7-opcache php7-session php7-gd php7-json php7 php7-iconv php7-curl php7-pecl-igbinary php7-pecl-memcached php7-pdo php7-mysqli
1.1启动服务
/ # nginx
/ # nginx: [emerg] open() "/run/nginx/nginx.pid" failed (2: No such file or directory)
^C
/ # mkdir /run/nginx
/ # nginx
/ # php-fpm7
1.2测试服务是否正常
alpine它虽小,处处有坑,nginx默认直接返回404,需要手动修改默认配置文件,location匹配index.html
2:把安装好服务的容器,提交成镜像
[root@docker01 ~]# docker commit dfe68e561586 alpine_lnp:v3.0
3.测试,刚才提交的镜像
docker run -d -p 80:80 alpine_lnp:v3.0 nginx -g 'daemon off;'
=============================================================================================
#4.基于c6制作一个kodexplorer网盘docker镜像。nginx + php-fpm(httpd + php)
=============================================================================================
1:启动一个基础容器,安装服务(部署项目)
docker run -it -p 80:80 centos:6.9
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx php-fpm php-gd php-mbstring unzip -y
[root@2c51e83b2c31 conf.d]# cat kdy.conf
server {
listen 80;
server_name kdy.cheng.com;
root /code;
location / {
index index.php index.html index.htm;
}
location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
上传可道云代码文件并解压至code目录--->前边需要提前创建code目录---->修改权限为nginx
编写服务启动脚本:
[root@2c51e83b2c31 ~]# cat /init.sh
#!/usr/bin/bash
service php-fpm start
nginx -g 'daemon off;'
2:把安装好服务的容器,提交成镜像
docker commit 9f366f3988cd kdy:v1
3:测试,刚才提交的镜像
docker run -d -p 81:80 kdy:v1 /bin/bash /init.sh
12.dockerfile自动构建docker镜像
类似ansible剧本,大小几kb 手动做镜像:大小几百M+
dockerfile 支持自定义容器的初始命令
docker images -a:显示所有镜像,包括失败的镜像
docker image prune:清除失败的镜像缓存
docker image prune -a:清除所有未被容器使用的镜像;极度危险!!!
dockerfile主要组成部分:
基础镜像信息 FROM centos:6.9
制作镜像操作指令 RUN yum install openssh-server -y
容器启动时执行初始命令 CMD ["/bin/bash"] dockerfile常用指令:
FROM 指定基础镜像
RUN 在执行的命令前加上即可
CMD 运行镜像时,默认执行的命令(容易被替换)
ADD 宿主机的文件添加到到容器中,tar包可自动解压 ///////////可自动解压tar包
MAINTAINER 指定维护者信息
LABEL 描述,标签
WORKDIR 指定工作目录,设定后,进入容器默认是在这个目录下
VOLUME 设置卷,使用卷可以将容器中的目录内容持久化,卷路径在/var/lib/docker/volumes/;写绝对路径可以挂载宿主机目录至容器目录
docker run --volume /opt/h5:/usr/share/nginx/html -d c6_nginx:v2.0
EXPOSE 可指定容器开放的端口,可启动容器时随机端口挂载到开放的端口
COPY 复制宿主机的文件到容器中
ENV 可设定环境变量(密码信息等),设定的变量可以在dockerfile中引用,而且会继承到容器中
ENTRYPOINT 容器启动执行的命令,无法被替换,写在启动命令位置的字符串会被当成命令的参数
=========================================================================
使用dockerfile自动构建镜像:
1.手动制作docker镜像,保留历史命令
2.根据历史命令编写dockerfile
3.构建docker镜像
4.测试docker镜像
==========================================================================
实战一:基于c6编写dockerfile构建Nginx服务
==========================================================================
[root@docker01 nginx]# cat dockerfile
FROM centos:6.9
RUN rm -rf /etc/yum.repos.d/* && \
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo && \
yum install nginx -y
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
docker build -t c6_nginx:v2.0 .
docker run -d -p 82:80 c6_nginx:v2.0
==========================================================================
实战二:基于alpine编写dockerfile构建Nginx服务
==========================================================================
FROM alpine:3.9
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
apk update && \
apk add nginx && \
mkdir -p /run/nginx/
CMD ["nginx","-g","daemon off;"]
==========================================================================
实战三:基于alpine编写dockerfile部署可道云项目
==========================================================================
FROM alpine:3.9
MAINTAINER YMC
LABEL maintainer="alpine nginx"
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
apk update && \
apk add nginx php7-intl php7-openssl php7-pdo_mysql php7-common php7-fpm php7-mysqlnd php7-mbstring php7-opcache php7-session php7-gd php7-json php7 php7-iconv php7-curl php7-pecl-igbinary php7-pecl-memcached php7-pdo php7-mysqli
WORKDIR /code
ADD www.conf /etc/php7/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf
ADD code /code
ADD init.sh /init.sh
EXPOSE 80/tcp
RUN mkdir -p /run/nginx
RUN chown -R nginx:nginx /code
ENTRYPOINT ["/bin/sh","/init.sh"]
实战四:自己制作一个alpine系统镜像[前提是前往清华源下载系统文件]
[root@docker01 alpine]# cat dockerfile
FROM scratch
ADD alpine.tar.gz /
CMD ["/bin/sh"]
实战五:基于c7安装sshd服务,指定端口可ssh连接
[root@docker01 c7]# cat dockerfile
FROM centos:7
ENV version 7.4p1
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum install initscripts openssh-server-$version -y && \
/usr/sbin/sshd-keygen
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
[root@docker01 c7]# cat init.sh
#!/usr/bin/bash
echo $1 |passwd --stdin root
/usr/sbin/sshd -D
[root@docker01 c7]# docker build -t c7_ssh:v1.0 .
[root@docker01 c7]# docker run -d -p 1024:22 c7_ssh:v1.0 /bin/bash /init.sh 1qaz2wsx
实战六:ENTRYPOINT应用:
[root@docker01 c7]# cat dockerfile
FROM centos:7
ENV version 7.4p1
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum install initscripts openssh-server-$version -y && \
/usr/sbin/sshd-keygen
ADD init.sh /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]
[root@docker01 c7]# docker build -t c7_ssh:v2.0 .
[root@docker01 c7]# docker run -d -p 1025:22 c7_ssh:v2.0 fsgssghs //传入的参数不会覆盖,反而成为命令的参数
ssh root@10.0.0.11 1025 //本地通过1025连接测试;密码fsgssghs
13.docker镜像的分层(kvm 链接克隆,写时复制的特性)
镜像分层的好处:复用,节省磁盘空间,相同的内容只需加载一份到内存。 修改dockerfile之后,再次构建速度快
dockerfile 优化:
1:尽可能选择体积小linux发行版,alpine
2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)
3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾
4:使用.dockerignore,减少不必要的文件ADD . /html
14.容器间的互联(–link 是单方向的!!!)
使用docker 10秒快速部署企业zabbix-server
for i in `ls *`; do docker load -i $i; done
docker run --name mysql-server -t \
-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
15.docker registry(私有仓库)
1.启动容器:
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
2.上传镜像到私有仓库:
a:给镜像打标签 docker tag centos6-sshd:v3 10.0.0.11:5000/centos6-sshd:v3
b:上传镜像 docker push 10.0.0.11:5000/centos6-sshd:v3
如果遇到报错: The push refers to repository [10.0.0.11:5000/centos6.9_ssh] Get https://10.0.0.11:5000/v2/: http: server gave HTTP response to HTTPS client
解决方法:
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
docker01===》启动registry容器---->
[root@docker01 opt]# rm -rf /opt/myregistry/ 清理缓存
docker02===》push镜像到docker01--->前提需要配置/etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
docker02清理缓存
systemctl stop docker
[root@docker02 docker]# rm -rf /var/lib/docker/*
systemctl restart docker
从内网pull镜像
[root@docker02 ~]# docker pull 10.0.0.11:5000/centos:6.9
16.docker-compose(单机版的容器编排工具)
安装:
yum install -y docker-compose(需要epel源)
===============================
1.wordpress 单机版docker-compose
===============================
cd wordpress/
vi docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- /data/db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- /data/web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
启动并放置后台
[root@docker01 wordpress]# docker-compose up -d
=======================================
2.docker-compose部署 Zabbix监控服务
=======================================
[root@docker01 zabbix]# cat docker-compose.yml
version: '3'
services:
mysql-server:
image: mysql:5.7
restart: always
command: --character-set-server=utf8 --collation-server=utf8_bin
environment:
MYSQL_ROOT_PASSWORD: root_pwd
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_pwd
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:latest
restart: always
zabbix-server:
depends_on:
- mysql-server
- zabbix-java-gateway
image: zabbix/zabbix-server-mysql:latest
ports:
- "10051:10051"
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
zabbix-web:
depends_on:
- mysql-server
- 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 up -d
17.重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always
方法二:"live-restore": true docker server配置文件/etc/docker/daemon.json参考 { "registry-mirrors": ["http://b7a9017d.m.daocloud.io"], "insecure-registries":["10.0.0.11:5000"], "live-restore": true }
18.Docker网络类型(插件形式)
None:不为容器配置任何网络功能,--net=none
Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)
Host:与宿主机共享Network Namespace,--network=host 性能最高
Bridge:Docker设计的NAT网络模型 默认类型.
1.查看运行的容器网络信息s
[root@docker01 ~]# docker inspect e70282f6414f
docker network ls 列出容器所有网络
--network=host
host 直接使用宿主机的网络【ip和主机名都一样】
docker run -it --network=none alpine:3.9 [没有网卡]
2.创建bridge网络
docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 oldcheng
3.基于oldcheng网络启动一个容器,测试是否能正常上网
19.Docker跨主机容器之间的通信macvlan
默认一个物理网卡,只有一个物理mac地址,虚拟多个mac地址
## 创建macvlan网络 【两个节点都执行】
docker network create --driver 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.66 alpine:3.9 #docker01执行
docker run -it --network macvlan_1 --ip=10.0.0.88 kedaoyun:v1 #docker02执行
## 设置eth0的网卡为混杂模式
ip link set eth0 promisc on
## 创建使用macvlan网络的容器
docker run -it --network macvlan_1 --ip=10.0.0.200 busybox
20.Dcoker跨主机容器通信之overlay
http://www.cnblogs.com/CloudMan6/p/7270551.html
1.docker03安装docker consul存储ip地址的分配
systemctl start docker
systemctl enable docker
[root@docker03 ~]# docker load -i docker_progrium_consul.tar.gz
2.设置容器的主机名
[root@docker03 ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
3.consul:kv类型的存储数据库(key:value)
docker01、02上:
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.11:2376"
}
systemctl restart docker
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"],
"cluster-store": "consul://10.0.0.13:8500",
"cluster-advertise": "10.0.0.12:2376"
}
systemctl restart docker
2)创建overlay网络[docker01 | docker02]
docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254 ol1
3.查看集群网络信息
docker network ls
4.启动容器测试
[root@docker01 ~]# docker run -it --network ol1 --name test1 busybox /bin/sh
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
5.登录 http://10.0.0.13:8500/ui/#/dc1/services 查看
结果:有两个nodes
21.docker企业级镜像仓库harbor
第一步:安装docker和docker-compose
第二步:下载harbor-offline-installer-v1.5.1.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.yml配置文件
[root@docker02 harbor]# vim harbor.yml
hostname = 10.0.0.12 //本机的ip
harbor_admin_password = 123456
第五步:执行install.sh
./install.sh
6.访问:http://10.0.0.12
用户名:admin
密码:123456
7.docker01推送镜像
[root@docker01 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.12"]
}
systemctl restart docker
打tag标签--->登录 docker login 10.0.0.12
[root@docker01 ~]# docker tag alpine:cheng 10.0.0.12/library/alpine:cheng
[root@docker01 ~]# docker push 10.0.0.12/library/alpine:cheng
8.harbor配置https:
hostname = yinwucheng.com
https:
port: 443
certificate: /opt/cert/2859604_www.yinwucheng.com.pem
private_key: /opt/cert/2859604_www.yinwucheng.com.key
9.需要重新安装
将脚本中的load注释--->执行脚本./install.sh
#docker load -i ./harbor*.tar.gz
windows 做域名解析 即可登录dashboard
pull的话需要在服务器做域名解析
10.登录dashboard
新建项目--->新建仓库--->选择提供者--->目标URL:http://10.0.0.11:5000-->测试连接
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
将docker-registry迁移至harbor
配置同步规则--->目的Namespace【项目的名称】--->同步---》
22.docker的监控
docker cadvisor监控 + prometheus + grafana
docker zabbix监控 低级自动发现 自动创建监控项
==========================================================================================
增加node节点[docker01 && docker02]
上传docker_monitor_node.tar.gz
#启动node-exporter
docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
#启动cadvisor
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
2.安装普罗米修斯并配置配置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']
3.启动普罗米修斯
[root@docker03 prometheus]# ./prometheus --config.file="prometheus.yml"
4.安装出图工具grafana并启动
[root@docker03 ~]# systemctl start grafana-server.service
[root@docker03 ~]# systemctl enable grafana-server.service
5.登录grafana配置数据源--->导入监控docker插件--->查看监控
==================================================================================
1.编写脚本
[root@docker02 scripts]# cat docker_discovery.sh
#!/bin/bash
port=($(/usr/bin/docker ps -a|grep -v "CONTAINER ID"|awk '{print $NF}'))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
[root@docker02 ~]# cat /etc/zabbix/zabbix_agentd.d/mac_status.conf
UserParameter=net.if.mac_status[*],ifconfig $1 |awk '/ether /{print $$2}'
UserParameter=docker.discovery[*],sh /scripts/docker_discovery.sh
docker01测试:出现问题
[root@docker01 zabbix]# zabbix_get -s 10.0.0.12 -k docker.discovery
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json?all=1: dial unix /var/run/docker.sock: connect: permission denied
解决问题:
[root@docker02 scripts]# chmod u+s /usr/bin/docker
或者:chmod 777 /var/run/docker.sock
登录zabbix-server 创建自动发现规则:docker.discovery
监控容器的存活状态:
[root@docker02 ~]# cat /etc/zabbix/zabbix_agentd.d/mac_status.conf
UserParameter=net.if.mac_status[*],ifconfig $1 |awk '/ether /{print $$2}'
UserParameter=docker.discovery[*],sh /scripts/docker_discovery.sh
UserParameter=docker_alive[*],/usr/bin/docker ps -a |grep $1|grep -c Up
systemctl restart zabbix-agent
基于刚才创建的自动发现规则--->创建监控项原型
名称和键值需要用变量docker_alive[{#CONTAINERNAME}]
过滤器操作:
管理--->一般---》正则表达式---》添加正则--->配置过滤器
23.docker命令总结
- container命令
attach 不分配新终端进入容器
create 创建一个新容器
export 导出容器为镜像文件,但镜像没有标签,使用import可导入
logs 查看容器的终端输出,可在容器秒死时查看原因
port 查看容器映射端口
restart 重启容器
start 启动容器
top 查看容器中的进程信息
wait 夯住直到容器停止,然后打印容器的退出代码
commit 提交容器为镜像
diff 查看容器与初始镜像的文件变化
inspect 查看容器的属性信息
ls 查看容器列表
prune 清除没有运行的容器
rm 删除容器
stats 查看容器占用资源的情况
unpause 接触容器暂停状态
cp 从宿主机和容器之间拷贝文件
exec 进入容器
kill 强制停止容器
pause 暂停容器
rename 修改容器的名称
run 创建并运行容器
stop 停止容器
update 更新修改容器的资源限制
- image命令
build dockerfile 构建镜像
history 查看镜像的历史记录
import 导入镜像,但没有标签
inspect 查看镜像的属性信息
load 导入镜像
ls 查看镜像列表
prune 清除失败的镜像缓存
pull 从官方仓库拉取镜像
push 推送镜像至官方仓库
rm 删除镜像
save 导出镜像为镜像文件
tag 修改镜像的标签