Docker容器介绍

1.1 docker是什么

Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。

namespace命名空间

Mount Namespace - 用于隔离文件系统的挂载点
UTS Namespace - 用于隔离 HostName 和 DomianName
IPC Namespace - 用于隔离进程间通信
PID Namespace - 用于隔离进程 

cgroups资源限制

控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。

控制组技术最早是由 Google 的程序员在 2006 年提出,Linux 内核自 2.6.24 开始支持。

控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。

1.2 容器与虚拟机对比

Docker容器 Cloud 第1张

Docker容器 Cloud 第2张

1.3 docker的三个重要概念

Image(镜像):
那么镜像到底是什么呢?Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
Container(容器)
容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
Repository(仓库)
镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过 : 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 Latest 作为默认标签。

Docker容器 Cloud 第3张

1.4 docker的组成部分

docker是传统的CS架构分为docker client和docker server
Docker 客户端是 Docker 用户与 Docker 交互的主要方式。当您使用 Docker 命令行运行命令时,Docker 客户端将这些命令发送给服务器端,服务端将执行这些命令。
Docker 命令使用 Docker API 。Docker 客户端可以与多个服务端进行通信。

Docker容器 Cloud 第4张

组件:镜像,容器,仓库,网路,存储

镜像:把系统文件打包

虚拟化的几种架构图

Docker容器 Cloud 第5张

Docker安装部署

2.1 国内源安装docker-ce

这里我们使用清华源:
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
操作步骤:

yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
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缓存
yum makecache fast
yum install docker-ce -y
docker version
systemctl start docker 

上传安装包,
yum localinstall '*.rpm'

2.2 国内远镜像加速配置

官网地址
https://www.daocloud.io/mirror
加速命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
需要重启docker
阿里镜像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
加速命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

2.3 快速安装

思路:
1.开启yum缓存
2.全新环境安装docker
3.将缓存的包全部打包出来
4.安装的时候使用rpm -ivh *.rpm方式安装

2.4 运行第一个容器

运行一个Hello world

docker run alpine /bin/echo "Hello world"

Docker镜像和容器管理

3.1 镜像相关命令

3.1.1 搜索镜像

选择镜像建议:
1.优先选择官方的
2.选择星星多的

docker search centos

#搜索镜像所有的版本号.jq是一个json格式化工具
yum install jq
curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq

3.1.2 获取镜像(没有指定版本,默认最新)

docker pull centos
docker pull busybox
docker pull busybox:1.29

3.1.3 查看镜像

docker images

3.1.4 删除镜像(首先删除容器,再删除镜像)

docker rmi centos:7
docker images|awk 'NR>1{print "docker rmi "$3}'|bash
docker rmi $(docker images|awk 'NR>1{print $3}')
docker rmi $(docker images -q)

3.1.5 导出镜像

docker save -o centos.tar centos:latest

3.1.6 导入镜像

docker load  < centos.tar

3.2 容器相关命令

3.2.1 启动容器

docker run -d -p 80:80 nginx 
#启动一个容器并保持不退出 并自定义命名
docker run --name mydocker -t -i centos /bin/bash
#启动一个容器并保持不退出
docker run -it -d centos:7 /bin/bash 
#启动并进入容器,启动一个终端,pid为1
docker run -it  centos:7 /bin/bash 
#启动一个已经停止的容器
docker start  容器ID
-d放后台
-p端口映射
#system管理启动
docker run -d -it --privileged nginx-1 /usr/sbin/init

3.2.2 停止容器

docker stop 容器的ID
#批量停止所有运行的容器
docker stop $(docker ps -q)

3.2.3 查看容器

#查看当前正在运行的容器
docker ps 
#查看正在运行以及停止运行的容器
docker ps -a 

docker ps -q
docker ps -aq

#查看容器的详细信息
docker inspect 容器ID

3.2.4 进入容器

docker exec会分配一个新的终端tty
#进入已经运行的容器
docker exec -it 容器ID  /bin/bash 
#启动并进入容器,启动一个终端,pid为1
docker run -it  centos:7 /bin/bash 

docker attach会使用同一个终端
docker attach 容器ID

3.2.5 删除容器

删除单个容器

docker rm 容器ID

批量删除容器

docker rm $(docker ps -aq)

Docker网络管理

4.1 随机映射端口

docker run -P :80 -d nginx:latest

4.2 指定映射端口

-p 宿主机端口:容器端口

docker run -p 8080:80 -d nginx:latest

-p 80:80 -p 443:443
-p 宿主机IP:宿主机端口:容器端口

如果想多个容器使用8080端口,可以通过添加多个IP地址实现

ifconfig eth0:1 10.0.1.13 up
docker run -d -p 10.0.1.11:8080:80 nginx:latest
docker run -d -p 10.0.1.13:8080:80 nginx:latest

进入容器里修改站点目录,然后访问测试

docker exec -it bdb2a4e7e24d /bin/bash
echo "web01" > /usr/share/nginx/html/index.html
docker exec -it 31c1de138dda /bin/bash
echo "web02" > /usr/share/nginx/html/index.html

访问测试:

[root@docker01 ~]# curl 10.0.1.11:8080
web02
[root@docker01 ~]# curl 10.0.1.13:8080
web01

Docker容器 Cloud 第6张

Docker数据卷管理

5.1 持久化数据卷

-v 宿主机目录:容器内目录
下面我们来创建一个html5小游戏

5.1.1 创建游戏代码目录

mkdir /data/xiaoniao -p
cd /data/
unzip xiaoniaofeifei.zip  -d xiaoniao /

5.1.2 创建容器并映射数据卷

docker run -d  -p 80:80 -v /data/xiaoniao:/usr/share/nginx/html nginx:latest
docker ps

5.1.3 访问游戏页面

10.0.1.11

5.2 持久化数据卷容器

--volumes-from (跟某一个已经存在的容器挂载相同的卷)

查看当前容器有哪些卷

docker volume ls

下面我们利用容器卷创建一个小游戏

5.2.1 创建一个容器卷

docker run -d  -p 8080:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest
docker volume ls

5.2.2 查看卷的目录

docker volume inspect xiaoniao

5.2.3 复制代码目录到容器卷目录

\cp -a /data/xiaoniao/* /var/lib/docker/volumes/xiaoniao/_data/

5.2.4 使用容器卷创建新容器

docker run -d  -p 8090:80 --volume xiaoniao:/usr/share/nginx/html nginx:latest

5.3 项目实战-访问不同端口展示不同页面

前提:基于自定义镜像c7_nginx:v1

基于Centos7创建自定义nginx镜像

1.拉取一个基础镜像
docker run --name myc7 -it centos:7 /bin/bash 

2.安装nginx
cat > /etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
yum install nginx 

3.基于自定义的容器生成新的镜像
docker commit myc7 c7_nginx:v1

4.查看是否生成新镜像
docker images 

5.基于自定义的nginx镜像创建新的容器并指定映射端口
docker run --name mynginx -itd -p 80:80 c7_nginx:v1 nginx -g "daemon off;"

6.查看容器是否运行并在windows访问测试
docker ps 
10.0.0.51

7.进入容器查看进程
docker exec -it mynginx /bin/bash 
ps aux 
nginx -s stop 

8.重启启动容器测试是否可以访问
docker start mynginx
10.0.0.51

有报错,可以换国内源安装
docker cp /etc/yum.repos.d/CentOS-Base.repo  b1965575341b:/etc/yum.repos.d/
docker cp /etc/yum.repos.d/CentOS-epel.repo  b1965575341b:/etc/yum.repos.d/

项目要求:

一个容器实现:
访问8080端口跳转到xiaoniao
访问8090跳转到game
数据目录,配置文件,日志文件都以映射挂载的方式实现

1.创建数据目录
mkdir /code 
cd /code 

2.编写Nginx配置文件
cat >game.conf<<EOF 
server {
    listen       8080;
    server_name  localhost;
    location / {
        root   /opt/xiaoniao/;
        index  index.html index.htm;
    }
}

server {
    listen       8090;
    server_name  localhost;
    location / {
        root   /opt/game/;
        index  index.html index.htm;
    }
}
EOF

3.上传代码目录并解压
tar zxf xiaoniao.tar.gz
tar zxf game.tar.gz

4.关键容器并挂载
docker run -d \
    -p 8080:8080 \
    -p 8090:8090 \
    -v /code/game/:/opt/game/ \
    -v /code/xiaoniao/:/opt/xiaoniao/ \
    -v /code/game.conf:/etc/nginx/conf.d/game.conf \
    -v /var/log/nginx/:/var/log/nginx/ \
    c7_nginx:v1 \
    nginx -g "daemon off;"

5.访问测试
10.0.0.51:8080
10.0.0.52:8090

Docker镜像手动构建

6.1 手动制作游戏镜像(没测试)

下面我们基于centos容器制作一个新镜像,并安装nginx服务

docker run -it centos:7 /bin/bash
yum install wget install openssh-clients -y
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
cat >/etc/yum.repos.d/nginx.repo<<EOF  
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
yum makecache fast
yum install nginx -y
scp -r 10.0.1.51:/data/* /opt/
mv /opt/game.conf /etc/nginx/conf.d/
docker ps
docker commit 容器ID game:v1
docker images
docker save game:v1 > game-v1.tar
docker load < game-v1.tar
docker run -p 8080:8080 -p 8090:8090 -d game:v1 nginx -g 'daemon off;'

6.2 手动制作云盘镜像

制作成容器:

docker run -it -d -p 80:80 centos:7 /bin/bash
docker exec -it ed90a5662ac4 /bin/bash

容器内正常安装

0.初始化
使用阿里源
groupadd www -g 1000
useradd www -u 1000 -g 1000 -M -s /sbin/nologin
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo


1.安装依赖环境 nginx+php
cat>/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF

yum makecache fast
yum install nginx php-fpm php-mbstring php-gd unzip -y


2.配置Nginx和php
rm -rf /etc/nginx/conf.d/default.conf
sed -i '/^user/c user www;' /etc/nginx/nginx.conf
sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf     
cat >/etc/nginx/conf.d/kod.conf<<EOF
server {
    server_name localhost;
    listen 80;
    root /code;
    index index.php index.html;

    location ~ \.php\$ {
        root /code;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
        include fastcgi_params;
    }
}
EOF

3.配置代码
mkdir /code 
cd /code 
curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip
unzip kodexplorer4.40.zip
chown -R www:www /code 


4.启动脚本
cd /root
cat >init.sh<<EOF
#!/bin/bash
php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
nginx -g 'daemon off;'
EOF
chmod +x init.sh
5.测试
方法一:
#若前面没有映射端口,执行脚本用curl测试
sh init.sh
重开端口测试
[root@d0c987bcefa2 code]# curl -I 127.0.0.1
方法二:
登录web 10.0.0.51测试

6.宿主机操作
#生成镜像
docker commit ed90a5662ac4 my_kod:v1
#基于新生成的镜像.启动容器
docker run -p 80:80 -d my_kod:v1 /bin/bash /root/init.sh

Dockerfile自动构建Docker镜像

7.1 Dockerfile操作命令说明

Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建
  通过使用build命令,根据Dockerfiel的描述来构建镜像
  通过源代码路径的方式
  通过标准输入流的方式
Dockerfile指令:
  只支持Docker自己定义的一套指令,不支持自定义
  大小写不敏感,但是建议全部使用大写
  根据Dockerfile的内容顺序执行
FROM:
  FROM {base镜像}
  必须放在DOckerfile的第一行,表示从哪个baseimage开始构建
MAINTAINER:
  可选的,用来标识image作者的地方
RUN:
  每一个RUN指令都会是在一个新的container里面运行,并提交为一个image作为下一个RUN的base
  一个Dockerfile中可以包含多个RUN,按定义顺序执行
  RUN支持两种运行方式:
    RUN <cmd> 这个会当作/bin/sh -c “cmd” 运行
    RUN [“executable”,“arg1”,。。],Docker把他当作json的顺序来解析,因此必须使用双引号,而且executable需要是完整路径
  RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。如:cd /usr/local/src && wget xxxxxxx
CMD:
  CMD的作用是作为执行container时候的默认行为(容器默认的启动命令)
  当运行container的时候声明了command,则不再用image中的CMD默认所定义的命令
  一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用 
CMD定义的三种方式:
  CMD <cmd> 这个会当作/bin/sh -c "cmd"来执行
  CMD ["executable","arg1",....]
  CMD ["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数 
EXPOSE 声明端口
  格式为 EXPOSE <端口1> [<端口2>...]。
  EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
entrypoint:
  entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部
  每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效
  当定义了entrypoint以后,CMD只能够作为参数进行传递
entrypoint定义方式:
  entrypoint ["executable","arg1","arg2"],这种定义方式下,CMD可以通过json的方式来定义entrypoint的参数,可以通过在运行container的时候通过指定command的方式传递参数
  entrypoint <cmd>,当作/bin/bash -c "cmd"运行命令
ADD & COPY:
  当在源代码构建的方式下,可以通过ADD和COPY的方式,把host上的文件或者目录复制到image中
  ADD和COPY的源必须在context路径下
  当src为网络URL的情况下,ADD指令可以把它下载到dest的指定位置,这个在任何build的方式下都可以work
  ADD相对COPY还有一个多的功能,能够进行自动解压压缩包
ENV:
  ENV key value
  用来设置环境变量,后续的RUN可以使用它所创建的环境变量
  当创建基于该镜像的container的时候,会自动拥有设置的环境变量 
WORKDIR:
  用来指定当前工作目录(或者称为当前目录)
  当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准 
USER:
  指定UID或者username,来决定运行RUN指令的用户 
ONBUILD:
  ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令
  可以定义多个ONBUILD指令
  当下一个镜像B使用镜像A作为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的ONBUILD指令
  ONBUILD <DOCKERFILE 指令> <content>
VOLUME:
  用来创建一个在image之外的mount point,用来在多个container之间实现数据共享
  运行使用json array的方式定义多个volume
  VOLUME ["/var/data1","/var/data2"]
  或者plain text的情况下定义多个VOLUME指令

7.2 使用Dockerfile创建云盘

7.2.1 准备需要的文件

1.创建目录
mkdir /root/dockerfile_kod/{code,conf,repo} -p


2.拷贝文件到指定目录
docker cp afc35bc7f8a1:/root/init.sh /root/dockerfile_kod/conf/
#构建好的目录结构
[root@db01 ~]# tree  dockerfile_kod/
dockerfile_kod/
├── build.sh
├── code
│   └── kodexplorer4.40.zip
├── conf
│   ├── init.sh
│   ├── kod.conf
│   ├── nginx.conf
│   ├── php-fpm.conf
│   └── www.conf
├── dockerfile
└── repo
    ├── CentOS-Base.repo
    ├── epel.repo
    └── nginx.repo

7.2.2 编写dockerfile

[root@db01 dockerfile_kod]# cat dockerfile 
#0.基础镜像
FROM centos:7

#1.初始化操作
RUN groupadd www -g 1000
RUN useradd www -u 1000 -g 1000 -M -s /sbin/nologin
RUN rm -rf /etc/yum.repos.d/*
ADD repo/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
ADD repo/epel.repo /etc/yum.repos.d/epel.repo
ADD repo/nginx.repo /etc/yum.repos.d/nginx.repo

#2.安装依赖环境 nginx+php
RUN yum makecache fast
RUN yum install nginx php-fpm php-mbstring php-gd unzip -y
RUN yum clean all

#3.配置Nginx和php
RUN rm -rf /etc/nginx/conf.d/default.conf
ADD conf/nginx.conf /etc/nginx/nginx.conf
ADD conf/kod.conf /etc/nginx/conf.d/kod.conf
ADD conf/php-fpm.conf /etc/php-fpm.conf
ADD conf/www.conf /etc/php-fpm.d/www.conf

#4.配置代码
RUN mkdir /code 
WORKDIR /code 
ADD code/kodexplorer4.40.zip /code/kodexplorer4.40.zip
RUN unzip kodexplorer4.40.zip
RUN chown -R www:www /code 

#5.复制启动脚本
ADD conf/init.sh /root/init.sh 

#6.启动命令
CMD ["/bin/bash","/root/init.sh"]

7.2.3 构建新镜像

[root@docker01 ~/dockerfile/kod]# docker build --network=host -t centos_kod:v1 .
[root@docker01 ~/dockerfile/kod]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos_kod          v1                  87071ea7c86b        2 minutes ago       465MB

7.2.4 基于新镜像运行容器

[root@docker01 ~/dockerfile/kod]# docker run -d -p 80:80 centos_kod:v1
4d1007d7194d434248762e5aca76070206643f0f0f533f2112d0359b25fe7ba0

7.2.5编写构建,启动脚本

[root@db01 dockerfile_kod]# cat build.sh 
#!/bin/bash
docker stop $(docker ps -qa)
docker rm $(docker ps -qa)
docker build --network=host -t my_kod:v2 .
docker run -p 80:80 -d my_kod:v2 

Docker私有仓库

8.1 普通的docker registry

8.2 带认证的docker registry

8.3 企业级的docker-harbor

8.3.1 部署思路

第一步:安装docker和docker-compose
第二步:下载harbor-offline-installer-v1.9.0-rc1.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.yml配置文件 hostname = 10.0.0.11 harbor_admin_password = 123456
第五步:执行install.sh

8.3.2 安装私有仓库

1.下载软件包
cd /opt
wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-offline-

installer-v1.9.3.tgz
上传包
tar xf harbor-offline-installer-v1.9.0-rc1.tgz

2.修改配置
vim harbor.yml 
hostname: 10.0.0.51
harbor_admin_password: 123456

3.下载docker-compose,编排工具
yum install docker-compose -y 

4.安装harbor
停止80端口执行
./install.sh

查看编排状态
cd /opt/harbor
docker-compose ps

登录:web 10.0.0.51 创建linux项目

5.修改镜像名称(镜像的ID)
docker tag ae21150e3af8 10.0.0.51/linux/my_kod:v2
docker images

6.修改docker配置添加信任仓库
cat >/etc/docker/daemon.json<<EOF 
{
  "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"],
  "insecure-registries": ["http://10.0.0.51"] 
}
EOF

#重启docker
systemctl restart docker
docker-compose ps
docker-compose stop
docker-compose up -d

7.docker登录到harbor
docker login 10.0.0.51

8.上传镜像到私有仓库
docker push 10.0.0.51/linux/my_kod:v2

9.客户端使用仓库下载镜像
删除已有的:注意.先停容器,在删除容器,镜像 
docker pull 10.0.0.51/linux/my_kod:v2

Docker容器 Cloud 第7张

8.3.3 其他主机上下载镜像

[root@docker02 ~]# cat /etc/docker/daemon.json 
{
      "registry-mirrors": ["http://hub-mirror.c.163.com"],
      "insecure-registries": ["http://10.0.1.11"],
      "insecure-registries": ["https://10.0.1.11"] 
}
[root@docker02 ~]# docker pull 10.0.1.11/linux/centos_kod:v1

容器的基本架构图

Docker容器 Cloud 第8张

项目实战:制作kvm管理工具容器

前提:新起一个容器,容器内操作

1.初始化
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2.安装python依赖
yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor gcc python-devel
python -m pip install --upgrade --force pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install setuptools==33.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple


3.安装python的Django环境
cd /opt/
git clone git://github.com/retspen/webvirtmgr.git
cd webvirtmgr
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
[root@402aca4eaa81 webvirtmgr]# chmod +x manage.py 

./manage.py syncdb
./manage.py collectstatic

4.安装Nginx
cat>/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
yum makecache fast
yum install nginx -y
yum clean all 

5.配置Nginx和代码
mkdir /code
mv /opt/webvirtmgr /code/
chown -R nginx:nginx /code
rm -rf /etc/nginx/conf.d/default.conf
cat >/etc/nginx/conf.d/webvirtmgr.conf<<EOF
server {
    listen 80 default_server;

    server_name localhost;
    access_log /var/log/nginx/webvirtmgr_access_log; 

    location /static/ {
        root /code/webvirtmgr;        
        expires max;
    }
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-for \$proxy_add_x_forwarded_for;
        proxy_set_header Host \$host:\$server_port;
        proxy_set_header X-Forwarded-Proto \$scheme;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M; 
    }
}
EOF
nginx -t
nginx
ss -lntup


6.配置Supervisor
cat >/etc/supervisord.d/webvirtmgr.ini<<EOF
[program:webvirtmgr]
command=/usr/bin/python /code/webvirtmgr/manage.py run_gunicorn -c /code/webvirtmgr/conf/gunicorn.conf.py
directory=/code/webvirtmgr
autostart=true
autorestart=true
logfile=/var/log/supervisor/webvirtmgr.log
log_stderr=true
user=nginx

[program:webvirtmgr-console]
command=/usr/bin/python /code/webvirtmgr/console/webvirtmgr-console
directory=/code/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx

[program:nginx]
command=nginx -g 'daemon off;'
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/nginx.log
redirect_stderr=true
EOF
sed -i "s#nodaemon=false#nodaemon=true#g" /etc/supervisord.conf
supervisord -c /etc/supervisord.conf
supervisorctl status

7.创建用户
mkdir /var/cache/nginx/.ssh/ -p
chown -R nginx:nginx /var/cache/nginx/
su - nginx -s /bin/bash
ssh-keygen
touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
chmod 0600 ~/.ssh/config
ssh-copy-id root@10.0.0.12

8.提交新镜像
docker commit 402aca4eaa81 mykvm:v1

9.运行新容器,注意:其他端口有时会跳转,

docker run --name mykvm3 -p 80:80  -it -d  mykvm:v1 supervisord -c /etc/supervisord.conf

docker监控

Docker容器 Cloud 第9张

1.docker自带的监控命令
docker container ps    :查看正在运行的容器
docker container top  +容器的id :知道某个容器运行了哪些进程
docker container stats +容器的id :显示每个容器各种资源使用情况 

2.cAdvisor+ prometheus+ grafana组件介绍
组件介绍: 在不同页面之间跳转,并且只能监控一个host,这不免让人质疑他的实用性,但cAdvisor有一个亮点是可以将监控到的数据导出给第三方工具,有这些工具进一步加工处理。
所以我们可以把cAdvisor定位为一个监控数据收集器,收集和导出数据是他的强项,而非展示数据。
cAdvisor支持很多第三方工具,其中就包含prometheus

#prometheus
Prometheus是一个非常优秀的监控工具。提供了监控数据搜集,存储,处理,可视化和告警一系列完整的解决方案。包含组件
Node Exporter :负责收集host硬件和操作系统数据,以容器的形式运行在所有host上
cAdvisor      :负责收集容器数据,以容器的形式运行在所有host上

#grafana
grafana是一款支持多种数据源的图形展示工具

3.部署
#地址规划:
10.0.0.51   cAdvisor+ Node Exporter +prometheus+ grafana
10.0.0.52   cAdvisor+ Node Exporter

#docker01的配置文件:
mkdir prometheus
cd prometheus
#上传压缩包
docker load < 压缩包
cat >docker-compose.yml<<EOF
version: '3.2'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
    - 9090:9090
    command:
    - --config.file=/etc/prometheus/prometheus.yml
    volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    depends_on:
    - cadvisor

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    ports:
    - 9100:9100

  cadvisor:
    image: google/cadvisor:latest
    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
    - 3000:3000
EOF

#prometheus配置文件
cat >prometheus.yml <<EOF
scrape_configs:
- job_name: cadvisor
  scrape_interval: 5s
  static_configs:
  - targets:
    - 10.0.0.51:8080
    - 10.0.0.52:8080

- job_name: prometheus
  scrape_interval: 5s
  static_configs:
  - targets: 
    - 10.0.0.51:9090

- job_name: node_exporter
  scrape_interval: 5s
  static_configs:
  - targets: 
    - 10.0.0.51:9100
    - 10.0.0.52:9100
EOF

#docker02配置文件:
cat >docker-compose.yml<<EOF
version: '3.2'
services:
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    ports:
    - 9100:9100

  cadvisor:
    image: google/cadvisor:latest
    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
EOF

4.运行
ntpdate time1.aliyun.com
docker-compose up -d

5.检查
http://10.0.0.51:8080/metrics
http://10.0.0.51:9100/metrics
http://10.0.0.51:9090
http://10.0.0.51:3000

登录:10.0.0.51:3000

账号:admin 密码;admin

配置源地址
Docker容器 Cloud 第10张

下载

Docker容器 Cloud 第11张

Docker容器 Cloud 第12张

Docker容器 Cloud 第13张

Docker容器 Cloud 第14张

Docker容器 Cloud 第15张

Docker容器 Cloud 第16张

Docker容器 Cloud 第17张
Docker容器 Cloud 第18张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄