Docker容器化从小白到入门

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
image.png

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          修改镜像的标签
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容