Docker_学习笔记

标签: 容器

目录

01 什么是云计算?

云计算是一种按量付费的模式,它的底层主要通过虚拟化来实现。


云计算的服务类型?
云服务只是一个统称,可以分成三大类。

云服务三大类
上图转自:(http://www.ruanyifeng.com/blogimg/asset/2017/bg2017072301.jpg)


  • IaaS:基础设施服务,Infrastructure-as-a-service。(kvm openstack)
  • PaaS:平台服务,Platform-as-a-service。(docker k8s)
  • SaaS:软件服务,Software-as-a-service。(运维+开发)

云服务
上图转自(http://www.mobanhu.com/upload_files/qrcode/256810111314151619202223242.jpg)


02 什么是容器?

容器是在隔离的环境中运行的一个进程,如果进程停止,容器终止,这个隔离的环境,拥有自己的系统文件,ip地址,主机名,进程管理。
容器还是一个软件的打包技术。


程序:软件,代码
进程:正在运行的程序
协程:线程


03 容器和虚拟机的区别(优势)

虚拟机的开机启动流程(特点):

  • 1:按下电源开关,bios自检
  • 2:选择启动项,选择启动设备
  • 3:加载引导程序 mbr (grub) gpt(UEFI) grub启动菜单 操作系统类型 内核路径
  • 4:加载linux内核(初始化硬件)
  • 5:启动系统的第一个进程/sbin/init ,初始化系统
  • 6:应用程序

容器(特点):共用宿主机内核,一开始就启动第一个进程



上图转自(https://images2018.cnblogs.com/blog/1337265/201805/1337265-20180511172324561-1553907087.png)


容器相对于虚拟化的优势:启动快,损耗少,性能高,轻量级
容器相对于虚拟机的劣势:如果宿主机是linux,容器必须linux系统


虚拟机:10台宿主机 可跑100台虚拟机
容器:5台宿主机 可跑100个容器


04 容器的发展历史

  • a: chroot 切换根目录

  • b:lxc (linux container)
    采用的技术:namespace用于“资源隔离”,cgroup用于“资源限制”(本来限制进程使用的硬件资源)
    类似传统的虚拟机。第一个进程 /sbin/init,先初始化系统,再运行服务nginx

  • c:docker容器
    采用的技术:namespace用于“资源隔离”,cgroup用于“资源限制”
    更轻量,第一个进程直接启动服务:如nginx


05 Docker的五大概念

镜像,容器,仓库,存储,网络


06 Docker的发展史

docker版本:

  • 初版:docker engine。第一版1.0,最终版1.13
  • 社区版:docker-ce。第一版:17.03(2017年3月)
  • 企业版:docker-ee

07 docker的安装

系统版本:CentOS Linux release 7.6.1810 (Core)
Docker版本:19.03.5


虚拟机:
10.0.0.100 docker01-h-100
10.0.0.101 docker02-h-101


第一步:安装aliyun镜像源
docker01-h-100与docker02-h-101

curl -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
yum makecache

第二步:安装docker-ce
docker01-h-100与docker02-h-101

# step 1: 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2

# Step 2: 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# Step 3: 更新并安装Docker-CE
yum makecache fast
yum -y install docker-ce

# Step 4: 开启 Docker 服务并设定开机自启动
systemctl enable docker
systemctl start docker

第三步:验证
docker01-h-100与docker02-h-101

$ 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

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:24:18 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

08 体验docker容器

docker软件架构为cs架构,client和server


方法1:
将镜像直接上传nginx
docker01-h-100与docker02-h-101

mkdir /root/docker_image/
cd /root/docker_image/
# 将 docker_nginx.tar.gz 上传至 /root/docker_image/

docker load -i docker_nginx.tar.gz 
docker run -d -p 80:80 nginx

方法2:
在线直接启动nginx镜像
docker01-h-100与docker02-h-101

docker run -d -p 80:80 nginx

验证1:
通过curl查看版本

$ curl -I 10.0.0.100
HTTP/1.1 200 OK
Server: nginx/1.17.5
Date: Tue, 26 Nov 2019 14:39:10 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 22 Oct 2019 14:30:00 GMT
Connection: keep-alive
ETag: "5daf1268-264"
Accept-Ranges: bytes

验证2:
直接浏览器访问http://10.0.0.100


09 镜像的管理命令

  • docker search 搜索镜像(优先选官方镜像,其次选择start数量多的)
$ docker search alpine
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
alpine                                 A minimal Docker image based on Alpine Linux…   5864                [OK]                
mhart/alpine-node                      Minimal Node.js built on Alpine Linux           445                                     
anapsix/alpine-java                    Oracle Java 8 (and 7) with GLIBC 2.28 over A…   430                                     [OK]
frolvlad/alpine-glibc                  Alpine Docker image with glibc (~12MB)          220                                     [OK]
gliderlabs/alpine                      Image based on Alpine Linux will help you wi…   180                    
  • docker image pull 镜像名称:版本 下载指定的镜像
    缩写:docker pull
$ docker image pull alpine
Using default tag: latest
latest: Pulling from library/alpine
89d9c30c1d48: Pull complete 
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

$ docker image pull alpine:3.8
3.8: Pulling from library/alpine
c87736221ed0: Pull complete 
Digest: sha256:04696b491e0cc3c58a75bace8941c14c924b9f313b03ce5029ebbc040ed9dcd9
Status: Downloaded newer image for alpine:3.8
docker.io/library/alpine:3.8
  • docker image push 上传镜像
    缩写:docker push

  • docker image ls
    说明:查看镜像列表
    缩写:docker images

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              540a289bab6c        5 weeks ago         126MB
alpine              latest              965ea09ff2eb        5 weeks ago         5.55MB
alpine              3.8                 dac705114996        8 months ago        4.41MB
  • docker image save 镜像名称:版本 -o 镜像压缩包的路径
    说明:镜像的导出
    缩写:docker save
$ docker image save alpine:3.8 -o /root/docker_image/docker_alpine3.8.tar.gz
  • docker image load -i 镜像压缩包的路径
    说明:镜像的导入
    缩写:docker load
$ docker image load -i /root/docker_image/docker_alpine3.8.tar.gz
d9ff549177a9: Loading layer [==================================================>]  4.671MB/4.671MB
Loaded image: alpine:3.8
  • docker image rm nginx:latest
    说明:删除镜像
    缩写:docker rmi
$ docker image rm alpine:3.8
Untagged: alpine:3.8
Untagged: [email protected]:04696b491e0cc3c58a75bace8941c14c924b9f313b03ce5029ebbc040ed9dcd9
Deleted: sha256:dac7051149965716b0acdcab16380b5f4ab6f2a1565c86ed5f651e954d1e615c
Deleted: sha256:d9ff549177a94a413c425ffe14ae1cc0aa254bc9c7df781add08e7d2fba25d27
  • docker image tag ID号 rock:v1
    说明:给镜像打标签
    缩写:docker tag
$ docker image import docker_alpine3.8.tar.gz 
sha256:4b1b7fc88220e19f650a76bb0d39ab1fe9bae89c4c14c07dfe2736bf169a2ffb
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              4b1b7fc88220        9 seconds ago       4.67MB
nginx               latest              540a289bab6c        5 weeks ago         126MB
alpine              latest              965ea09ff2eb        5 weeks ago         5.55MB
alpine              3.8                 dac705114996        8 months ago        4.41MB
$ docker image tag 4b1b7fc88220 rock:v1
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rock                v1                  4b1b7fc88220        48 seconds ago      4.67MB
nginx               latest              540a289bab6c        5 weeks ago         126MB
alpine              latest              965ea09ff2eb        5 weeks ago         5.55MB
alpine              3.8                 dac705114996        8 months ago        4.41MB

10 容器的管理命令

  • docker container run -d nginx:latest
    说明:创建并启动一个容器
    备注:该命令相当于docker container create + docker container start
docker run 参数:
-d   后台运行
-p   端口映射
-it  分配一个交互式的终端(it:interactive tty)
-v   将宿主机目录挂载到容器中
# 后台运行
$ docker container run -d nginx:latest
a5e3030fd9a21985630c86906571cf5d6e1d444b9966764dbcc8b2deaedc179e

# 端口映射
$ docker container run -d -p 88:80 nginx:latest
fe1bdd08cb5a7a67fa65c0ed3fcb75d51ee415f363fb7c17b8b894b31409aa65

$ docker container run -d -p 89:80 -p 9000:9000 nginx:latest
6468773ed77feabb218d6ccfcca5dda5b6b594333d4c65640eb2865b2000c98a

# 分配一个交互式的终端
[[email protected] docker_image]# docker run -it centos:6.9 
[[email protected] /]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[[email protected] /]# exit
exit

# 将宿主机目录挂载到容器中
$ docker run -d -p 90:80 -v /root/project/xiaoniao:/usr/share/nginx/html nginx:latest 
82a6d786da946dfebcef67c60ef777fa59dc617570436871653c8680874405bd
# 浏览器:http://10.0.0.100:90
[[email protected] project]# docker exec -it 82a6d786da94 /bin/bash
[email protected]:/# ls -l /usr/share/nginx/html/
total 232
-rw-r--r-- 1 root root 15329 Aug  2  2014 2000.png
-rw-r--r-- 1 root root 51562 Aug  2  2014 21.js
-rw-r--r-- 1 root root   254 Aug  2  2014 icon.png
drwxr-xr-x 2 root root   102 Aug  8  2014 img
-rw-r--r-- 1 root root  3049 Dec  1 07:54 index.html
-rw-r--r-- 1 root root 63008 Aug  2  2014 sound1.mp3
-rw-r--r-- 1 root root 91014 Nov 16 10:41 xiaoniaofeifei.zip
  • docker container start ID号或name
    说明:启动容器

  • docker container stop ID号或name
    说明:停止容器

  • docker container kill
    说明:强制停止容器(慎用

  • docker container ls -a
    说明:查看所有容器

# 查看正在处于运行状态的容器
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
6468773ed77f        nginx:latest        "nginx -g 'daemon of…"   25 minutes ago      Up 25 minutes       0.0.0.0:9000->9000/tcp, 0.0.0.0:89->80/tcp   nervous_bose
fe1bdd08cb5a        nginx:latest        "nginx -g 'daemon of…"   29 minutes ago      Up 29 minutes       0.0.0.0:88->80/tcp                           musing_lamport
a5e3030fd9a2        nginx:latest        "nginx -g 'daemon of…"   37 minutes ago      Up 37 minutes       80/tcp                                       clever_elbakyan

# 查看所有的容器
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                        NAMES
5fffa151eb6d        centos:6.9          "/bin/bash"              17 minutes ago      Exited (0) 8 minutes ago                                                zen_bhabha
6468773ed77f        nginx:latest        "nginx -g 'daemon of…"   26 minutes ago      Up 26 minutes              0.0.0.0:9000->9000/tcp, 0.0.0.0:89->80/tcp   nervous_bose
fe1bdd08cb5a        nginx:latest        "nginx -g 'daemon of…"   30 minutes ago      Up 30 minutes              0.0.0.0:88->80/tcp                           musing_lamport
a5e3030fd9a2        nginx:latest        "nginx -g 'daemon of…"   38 minutes ago      Up 38 minutes              80/tcp                                       clever_elbakyan
6a54429657be        nginx               "nginx -g 'daemon of…"   3 days ago          Exited (0) 3 days ago                                                   boring_swanson
0dc1b90f0966        nginx               "nginx -g 'daemon of…"   3 days ago          Exited (0) 3 days ago                                                   gifted_spence

# 查看最后一个创建的容器(-l last)
[[email protected] docker_image]# docker container ls -a -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
6468773ed77f        nginx:latest        "nginx -g 'daemon of…"   57 minutes ago      Up 57 minutes       0.0.0.0:9000->9000/tcp, 0.0.0.0:89->80/tcp   nervous_bose
  • docker container rm ID号
    说明:默认删除非启动状态的容器(可以删除多个容器)
[[email protected] docker_image]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                        NAMES
5fffa151eb6d        centos:6.9          "/bin/bash"              30 minutes ago      Exited (0) 21 minutes ago                                                zen_bhabha
6468773ed77f        nginx:latest        "nginx -g 'daemon of…"   39 minutes ago      Up 39 minutes               0.0.0.0:9000->9000/tcp, 0.0.0.0:89->80/tcp   nervous_bose
fe1bdd08cb5a        nginx:latest        "nginx -g 'daemon of…"   42 minutes ago      Up 42 minutes               0.0.0.0:88->80/tcp                           musing_lamport
a5e3030fd9a2        nginx:latest        "nginx -g 'daemon of…"   51 minutes ago      Up 51 minutes               80/tcp                                       clever_elbakyan
6a54429657be        nginx               "nginx -g 'daemon of…"   3 days ago          Exited (0) 3 days ago                                                    boring_swanson
0dc1b90f0966        nginx               "nginx -g 'daemon of…"   3 days ago          Exited (0) 3 days ago                                                    gifted_spence
[[email protected] docker_image]# docker container rm 0dc1b90f0966
0dc1b90f0966
[[email protected] docker_image]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                        NAMES
5fffa151eb6d        centos:6.9          "/bin/bash"              30 minutes ago      Exited (0) 21 minutes ago                                                zen_bhabha
6468773ed77f        nginx:latest        "nginx -g 'daemon of…"   39 minutes ago      Up 39 minutes               0.0.0.0:9000->9000/tcp, 0.0.0.0:89->80/tcp   nervous_bose
fe1bdd08cb5a        nginx:latest        "nginx -g 'daemon of…"   43 minutes ago      Up 43 minutes               0.0.0.0:88->80/tcp                           musing_lamport
a5e3030fd9a2        nginx:latest        "nginx -g 'daemon of…"   51 minutes ago      Up 51 minutes               80/tcp                                       clever_elbakyan
6a54429657be        nginx               "nginx -g 'daemon of…"   3 days ago          Exited (0) 3 days ago                                                    boring_swanson
  • docker container exec -it 1e966bd48fb3 /bin/bash
    说明:进入正在运行的容器(分配一个新的终端)
# 格式
docker exec -it 容器的id/名字 /bin/bash(/bin/sh)
[[email protected] docker_image]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
6468773ed77f        nginx:latest        "nginx -g 'daemon of…"   48 minutes ago      Up 48 minutes       0.0.0.0:9000->9000/tcp, 0.0.0.0:89->80/tcp   nervous_bose
fe1bdd08cb5a        nginx:latest        "nginx -g 'daemon of…"   51 minutes ago      Up 51 minutes       0.0.0.0:88->80/tcp                           musing_lamport
a5e3030fd9a2        nginx:latest        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    80/tcp                                       clever_elbakyan
[[email protected] docker_image]# docker container exec -it 6468773ed77f /bin/bash
[email protected]:/# exit
exit
  • docker container attach 7d9f9f980cba
    说明:使用相同的终端
[[email protected] xiaoniao]# docker container ls -l -a 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
9942e0cc9735        centos:6.9          "/bin/bash"         31 minutes ago      Exited (0) About a minute ago                       recursing_satoshi

[[email protected] ~]# docker container start 9942e0cc9735
9942e0cc9735
[[email protected] ~]# docker attach 9942e0cc9735
[[email protected] /]# history 

  • docker container cp xiaoniao 5a1ccc8b81c5:/usr/share/nginx/html
    说明:将宿主机的文件上传至容器中(此法不推荐)
# 创建一个nginx容器
$ docker run -d -p 80:80 nginx:latest
07758b5ae91587c5293c388e7d5ca8d6b8ff1da5ef95a1e2d75923572a2f91cd

# 宿主机将小鸟项目解包并上传至容器中
$ mkdir -p /root/project/xiaoniao
$ cd /root/project/xiaoniao
$ unzip xiaoniaofeifei.zip
$ cd /root/project/
$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
07758b5ae915        nginx:latest        "nginx -g 'daemon of…"   10 minutes ago      Up 10 minutes       0.0.0.0:80->80/tcp   hungry_merkle
$ docker container cp xiaoniao 07758b5ae915:/usr/share/nginx/html

# 使用浏览器打开:http://10.0.0.100/xiaoniao/

# 进入容器中查看对应目录
$ docker exec -it 07758b5ae915 /bin/bash
[email protected]:/# ls /usr/share/nginx/html/
50x.html  index.html  xiaoniao
[email protected]:/# ls /usr/share/nginx/html/xiaoniao/
2000.png  21.js  icon.png  img	index.html  sound1.mp3	xiaoniaofeifei.zip

注意:

  • 遇到的容器问题:为什么有的容器,起不来?
    如果想容器一直处于运行状态,需要让容器夯住(前台运行),并且提供服务。
# 例子
$ docker container run -d -it centos:6.9
  • 不是所有的镜像都是基于centos系统

11 手动制作docker镜像

11.1 单服务

a:启动一个基础的容器,在容器中安装服务

[[email protected] ~]# docker run -it -p 80:80 centos:6.9
[[email protected] /]# $ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[[email protected] /]# $ curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[[email protected] /]# $ yum install nginx -y
[[email protected] /]# $ cd /usr/share/nginx/html/
[[email protected] /]# $ rm -fr *

[[email protected] xiaoniao]# docker container cp xiaoniaofeifei.zip 9942e0cc9735:/usr/share/nginx/html/

[[email protected] /]# yum install unzip -y
[[email protected] /]# unzip xiaoniaofeifei.zip
[[email protected] /]# nginx

# 浏览器访问:http://10.0.0.100

# 最后退出
[[email protected] /]# exit

b:将装好服务的容器提交为镜像

[[email protected] ~]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
9942e0cc9735        centos:6.9          "/bin/bash"         48 minutes ago      Exited (0) About a minute ago                       recursing_satoshi


[[email protected] ~]# docker container commit 9942e0cc9735 xiaoniao:v1
sha256:7cb0e8bd861736b9029e86bbe2c19cb71245be2e842134d64018c0d632d9699c

[[email protected] ~]# docker image ls
REPOSITORY                                       TAG                 IMAGE ID            CREATED             SIZE
xiaoniao                                         v1                  7cb0e8bd8617        10 seconds ago      446MB

c:测试

[[email protected] ~]# docker run -d -p 8080:80 xiaoniao:v1 nginx -g 'daemon off;'

11.2 双服务

安装可道云
a:启动一个基础的容器,在容器中安装服务

[[email protected] ~]# docker run -it -p 80:80 centos:6.9
[[email protected] /]# $ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[[email protected] /]# $ curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[[email protected] /]# $ yum install nginx -y
[[email protected] /]# $ cd /usr/share/nginx/html/
[[email protected] /]# $ rm -fr *

[[email protected] kedaoyun]# docker container cp kodexplorer4.40.zip 00724e41ca12:/usr/share/nginx/html/

[[email protected] html]# yum install unzip -y
[[email protected] html]# unzip kodexplorer4.40.zip

[[email protected] html]# yum install php-fpm php-mbstring php-gd -y
[[email protected] html]# vi /etc/php-fpm.d/www.conf

修改/etc/php-fpm.d/www.conf

第39行:user = nginx
第41行:group = nginx
[[email protected] html]# service php-fpm start
[[email protected] html]# vi /etc/nginx/conf.d/default.conf

编辑/etc/nginx/conf.d/default.conf文件

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;
    index        index.php index.html;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
        include        fastcgi_params;
    }

    location / {
    }
[[email protected] html]# chown -R nginx:nginx .
[[email protected] html]# nginx

# 浏览器访问:http://10.0.0.100

[[email protected] html]# vi /init.sh

容器内创建并编辑/init.sh文件

#!/bin/bash
service php-fpm start
nginx -g 'daemon off;'
[[email protected] html]# chmod +x /init.sh
[[email protected] html]# exit

b:将装好服务的容器提交为镜像

[[email protected] ~]# docker commit 00724e41ca12 kod:v1
sha256:3908396abb7d66611e011f13b347a163dc41673027812413d0a460d4377e660d

c:测试

[[email protected] ~]# docker run -d -p 8080:80 kod:v1 /init.sh
45d9e4147f19ad45b1ab19263d3268f8bf02beb4aabe6681218fa273fbf12063

12 自动制作docker镜像

  • a:手动制作一次镜像,记录历史命令
  • b:根据历史命令,编写dockerfile
  • c:docker build 构建
  • d:测试

12.1 dockerfile基础指令

FROM  基础镜像
RUN   安装服务所需要的命令(不能有交互式的命令)
CMD   镜像的初始命令(容器运行时的初始命令)  可以被替换
["nginx","-g","daemon off;"]
nginx  -g  'daemon off;'

ADD   将当面目录下的文件拷贝镜像的指定目录(自动解压tar包)
WORKDIR 相当于cd,切换工作目录
EXPOSE  你需要暴露容器的端口(做端口映射)
ENV    环境变量
COPY  将当面目录下的文件拷贝镜像的指定目录(不解压tar包)
ENTRYPOINT 镜像的初始命令(容器运行时的初始命令) 不能被替换

12.2 dockerfile中的ADD指令

$ cd /opt/dockerfile/xiaoniao
# 将xiaoniaofeifei.zip放到此处并解压
$ ls
2000.png  21.js  dockerfile  icon.png  img  index.html  sound1.mp3

$ vim dockerfile

编辑dockerfile文件

FROM centos:6.9

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
RUN yum install nginx -y
ADD . /usr/share/nginx/html

CMD ["nginx","-g","daemon off;"]

开始构建

$ docker build -t xiaoniao:v2 .

测试

[[email protected] xiaoniao]# docker run -d -p 80:80 xiaoniao:v2
662b69f974717f5dee549dd909d1c2eb963f035334e1b1fd0dac7947ce6e3ade
[[email protected] xiaoniao]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
662b69f97471        xiaoniao:v2         "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        0.0.0.0:80->80/tcp   sad_haibt
[[email protected] xiaoniao]# docker ps -a -l --no-trunc
CONTAINER ID                                                       IMAGE               COMMAND                    CREATED             STATUS              PORTS                NAMES
662b69f974717f5dee549dd909d1c2eb963f035334e1b1fd0dac7947ce6e3ade   xiaoniao:v2         "nginx -g 'daemon off;'"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp   sad_haibt

# 浏览器访问:http://10.0.0.100

12.3 dockerfile中的WORKDIR指令

$ cd /opt/dockerfile/xiaoniao
$ vim dockerfile

编辑dockerfile文件

FROM centos:6.9

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
RUN yum install nginx -y
RUN yum install unzip -y
WORKDIR /usr/share/nginx/html
RUN rm -fr *
RUN curl -o xiaoniao.zip http://10.0.0.200/xiaoniaofeifei.zip
RUN unzip xiaoniao.zip

CMD ["nginx","-g","daemon off;"]

开始构建

$ docker build -t xiaoniao:v3 .

测试

[[email protected] xiaoniao]# docker run -d -p 81:80 xiaoniao:v3
[[email protected] xiaoniao]# docker exec -it a620020cc0d5 /bin/bash
[[email protected] html]# pwd
/usr/share/nginx/html

# 浏览器访问:http://10.0.0.100:81

12.4 dockerfile中的EXPOSE指令

$ cd /opt/dockerfile/xiaoniao
$ vim dockerfile

编辑dockerfile文件

FROM centos:6.9

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
RUN yum install nginx -y
RUN yum install unzip -y
WORKDIR /usr/share/nginx/html
RUN rm -fr *
RUN curl -o xiaoniao.zip http://10.0.0.200/xiaoniaofeifei.zip
RUN unzip xiaoniao.zip
EXPOSE 80

CMD ["nginx","-g","daemon off;"]

开始构建

$ docker build -t xiaoniao:v4 .

测试

[[email protected] xiaoniao]# docker run -d -P xiaoniao:v4
[[email protected] xiaoniao]# docker container ls -a -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
926cc84e873b        xiaoniao:v4         "nginx -g 'daemon of…"   21 seconds ago      Up 20 seconds       0.0.0.0:32768->80/tcp   nostalgic_engelbart

# 浏览器访问:http://10.0.0.100:32768

12.5 dockerfile中的ENV指令

$ cd /opt/dockerfile/vsftp
$ vim dockerfile

编辑dockerfile文件

FROM centos:6.9

ENV version=2.2.2
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum install vsftpd-$version -y

开始构建

$ docker build -t vsftpd:v1 .

测试

[[email protected] vsftp]# docker run -it vsftpd:v1 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=bb3ebff344a2
TERM=xterm
version=2.2.2
HOME=/root

12.6 dockerfile中的ENTRYPOINT指令

$ cd /opt/dockerfile/xiaoniao
$ vim dockerfile

编辑dockerfile文件

FROM centos:6.9

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
RUN yum install nginx -y
RUN yum install unzip -y
WORKDIR /usr/share/nginx/html
RUN rm -fr *
RUN curl -o xiaoniao.zip http://10.0.0.200/xiaoniaofeifei.zip
RUN unzip xiaoniao.zip
EXPOSE 80

ENTRYPOINT ["nginx","-g","daemon off;"]

开始构建

$ docker build -t xiaoniao:v5 .

测试

[[email protected] xiaoniao]# docker run -d xiaoniao:v5 lalala
9de30c3ec4b63782a07d21fb3526a26fb5180c99f4f0e0a5ef6fb52112e55651
[[email protected] xiaoniao]# docker container ls -a -l --no-trunc
CONTAINER ID                                                       IMAGE               COMMAND                           CREATED             STATUS                     PORTS               NAMES
9de30c3ec4b63782a07d21fb3526a26fb5180c99f4f0e0a5ef6fb52112e55651   xiaoniao:v5         "nginx -g 'daemon off;' lalala"   2 minutes ago       Exited (1) 2 minutes ago                       hardcore_johnson

12.7 单服务

宿主机:

cd /opt/
mkdir dockerfile
cd dockerfile
mkdir centos-nginx
cd centos-nginx/
vim dockerfile

创建并编辑dockerfile文件

FROM centos:6.9

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
RUN yum install nginx -y

CMD ["nginx","-g","daemon off;"]

开始构建

[[email protected] centos-nginx]# docker image build -t centos_nginx:v1 /opt/dockerfile/centos-nginx/
或
[[email protected] centos-nginx]# docker image build -t centos_nginx:v1 .

# 构建时采用加速方式(实验室环境)
docker image build --network=host -t centos_nginx:v1 .
或
docker image build --network=host -t centos_nginx:v1 /opt/dockerfile/centos-nginx/
# --network=host 采用宿主的hosts文件  "192.168.13.120  mirrors.aliyun.com" >>/etc/hosts

开始测试

[[email protected] centos-nginx]# docker run -d -p 80:80 centos_nginx:v1
[[email protected] centos-nginx]# docker ps -a -l --no-trunc
CONTAINER ID                                                       IMAGE               COMMAND                    CREATED             STATUS              PORTS                NAMES
e48b41b095768a9f4c1b5a39f5a63a87350ebc990d2e03383faa8bfc6393386b   centos_nginx:v1     "nginx -g 'daemon off;'"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp   crazy_kepler

# 浏览器访问:http://10.0.0.100

12.8 双服务

宿主机:

cd /opt/dockerfile/kod

# 先从之前手动创建的镜像中拷取文件出来
[[email protected] kod]# docker run -it kod:v1 /bin/bash
[[email protected] /]# ls /init.sh 
/init.sh
[[email protected] /]# ls /etc/php-fpm.d/www.conf
/etc/php-fpm.d/www.conf
[[email protected] /]# ls /etc/nginx/conf.d/default.conf
/etc/nginx/conf.d/default.conf
[[email protected] /]# exit
exit
[[email protected] kod]# docker cp dd5b8dfaa6e3:/init.sh .
[[email protected] kod]# docker cp dd5b8dfaa6e3:/etc/php-fpm.d/www.conf .
[[email protected] kod]# docker cp dd5b8dfaa6e3:/etc/nginx/conf.d/default.conf .
[[email protected] kod]# ls
default.conf  init.sh  www.conf

vim dockerfile

创建并编辑dockerfile文件

FROM centos:6.9

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
RUN yum install nginx -y

RUN yum install unzip php-fpm php-mbstring php-gd -y

WORKDIR /usr/share/nginx/html/
RUN rm -fr *
RUN curl -o kodexplorer4.40.zip http://10.0.0.200/kodexplorer4.40.zip

RUN unzip kodexplorer4.40.zip
RUN chown -R nginx:nginx .

COPY www.conf /etc/php-fpm.d/www.conf
COPY default.conf /etc/nginx/conf.d/default.conf
COPY init.sh /init.sh
EXPOSE 80
ENTRYPOINT ["/init.sh"]

开始构建

[[email protected] centos-nginx]# docker build -t kod:v2 .

开始测试

[[email protected] kod]# docker run -d -P kod:v2 lalala
a4ade3c4ac30100cf3ef2ca08470f7f62da816aa7efd1db90b0b4dad1a3948bc

[[email protected] kod]# docker ps -a -l --no-trunc
CONTAINER ID                                                       IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
a4ade3c4ac30100cf3ef2ca08470f7f62da816aa7efd1db90b0b4dad1a3948bc   kod:v2              "/init.sh lalala"   13 seconds ago      Up 13 seconds       0.0.0.0:32770->80/tcp   practical_elion

# 浏览器访问:http://10.0.0.100:32770

12.9 优化镜像容量

将12.6的dockerfile文件优化

$ cd /opt/dockerfile/xiaoniao
$ vim dockerfile

编辑dockerfile文件

FROM centos:6.9

RUN 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 unzip -y && yum clean all
WORKDIR /usr/share/nginx/html
RUN rm -fr * && \
 curl -o xiaoniao.zip http://10.0.0.200/xiaoniaofeifei.zip && \
 unzip xiaoniao.zip && rm -fr xiaoniao.zip
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]

开始构建

$ docker build -t xiaoniao:v6 .

测试

[[email protected] xiaoniao]# docker run -d -P xiaoniao:v6
45e161b5c86a178572c3e5c472fa3070c527beeb415d7294f1a3c3f6bfaae4ae
[[email protected] xiaoniao]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                   NAMES
45e161b5c86a        xiaoniao:v6         "nginx -g 'daemon of…"   5 seconds ago        Up 4 seconds                0.0.0.0:32768->80/tcp   sweet_gould

# 浏览器访问:http://10.0.0.100:32770

比较v6与v7的大小

[[email protected] xiaoniao]# docker image ls xiaoniao
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xiaoniao            v6                  b26b82db7a31        17 seconds ago      355MB
xiaoniao            v5                  5531060931b0        47 hours ago        560MB
xiaoniao            v4                  527144eb17b2        2 days ago          560MB
xiaoniao            v3                  85c46d22e61e        2 days ago          560MB
xiaoniao            v2                  4c7f36954fe7        2 days ago          446MB
xiaoniao            v1                  7cb0e8bd8617        5 days ago          446MB

13 docker容器间的互联

  • docker run --link 名字:别名 # 此法为单方向互联

示例:

[[email protected] ~]# docker run -d -it --name rock alpine:3.8
e683e3227dfc62ca1c9e3ebe926a60d3e0e7d136140654fa5886d660466ff573

[[email protected] ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e683e3227dfc        alpine:3.8          "/bin/sh"           3 seconds ago       Up 2 seconds                            rock

[[email protected] ~]# docker run -it --link rock:db alpine:3.8
/ # ping db
PING db (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.120 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.181 ms
^C
--- db ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.120/0.150/0.181 ms
/ # ping rock
PING rock (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.227 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.067 ms
^C
--- rock ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.067/0.147/0.227 ms
/ # 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.3	db e683e3227dfc rock
172.17.0.4	0538e941f87d

zabbix例子:

主机101:

# 导入镜像
[[email protected] zabbix]# pwd
/root/docker_image/zabbix
[[email protected] zabbix]# ls
docker-mysql-5.7.tar.gz  zabbix-java-gateway.tar.gz  zabbix-server-mysql.tar.gz  zabbix-web-nginx-mysql.tar.gz
[[email protected] zabbix]# for n in `ls *.tar.gz`;do docker load -i $n;done

[[email protected] zabbix]# docker image ls -a
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
nginx                           latest              540a289bab6c        6 weeks ago         126MB
alpine                          3.8                 dac705114996        9 months ago        4.41MB
zabbix/zabbix-server-mysql      latest              e36e7fa7e11a        3 years ago         106MB
zabbix/zabbix-web-nginx-mysql   latest              386dc9afc1c4        3 years ago         174MB
zabbix/zabbix-java-gateway      latest              4257519fd740        3 years ago         148MB
mysql                           5.7                 b7dc06006192        3 years ago         386MB

# 启动命令
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

[[email protected] zabbix]# docker container ls -a
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                               NAMES
8d091e8c2900        zabbix/zabbix-web-nginx-mysql:latest   "/bin/bash /run_zabb…"   11 seconds ago      Up 11 seconds       0.0.0.0:80->80/tcp, 443/tcp         zabbix-web-nginx-mysql
8b72d9df775f        zabbix/zabbix-server-mysql:latest      "/bin/bash /run_zabb…"   14 seconds ago      Up 13 seconds       162/udp, 0.0.0.0:10051->10051/tcp   zabbix-server-mysql
585d52c39586        zabbix/zabbix-java-gateway:latest      "/bin/bash /run_zabb…"   14 seconds ago      Up 14 seconds       10052/tcp                           zabbix-java-gateway
c721fcdac608        mysql:5.7                              "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       3306/tcp                            mysql-server

# 浏览器访问:http://10.0.0.101
# 管理员初始密码:Admin / zabbix

主机100:

# 安装zabbix客户端
[[email protected] rpm]# pwd
/root/rpm
[[email protected] rpm]# ls
zabbix-agent-3.2.0-1.el7.x86_64.rpm
[[email protected] rpm]# rpm -ivh zabbix-agent-3.2.0-1.el7.x86_64.rpm
warning: zabbix-agent-3.2.0-1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zabbix-agent-3.2.0-1.el7         ################################# [100%]

[[email protected] rpm]# vim /etc/zabbix/zabbix_agentd.conf

编辑zabbix_agentd.conf

第95行:Server=10.0.0.101

启动服务

[[email protected] rpm]# systemctl start zabbix-agent.service

主机101:

zabbix管理设置界面:http://10.0.0.101
配置 - 主机 - 创建主机

主机:
    主机名称:10.0.0.100
    群组:Linux servers
    agent代理程序的接口:IP地址10.0.0.100
模板:
    链接指示器:Template OS Linux

# 等不及的话重启服务
[[email protected] zabbix]# docker restart zabbix-server-mysql

监测中点最新数据就能看到数据

14 docker的私有仓库

14.1 不带认证

100宿主机(服务端):

# 先导入私有仓库镜像
[[email protected] dockerfile]# pwd
/opt/dockerfile
[[email protected] dockerfile]# docker load -i registry.tar.gz

# 直接启动
[[email protected] dockerfile]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry
cafb85d5bb902b768c490261983aaf4eecd313dbeee159285ff0959daa5aabfd

# --restart=always    宿主机重启后,该docker应用也跟着自动启动

101宿主机(客户端)

[[email protected] ~]# vim /etc/docker/daemon.json

编辑/etc/docker/daemon.json(无论上传下载都要有)

{
  "insecure-registries": ["10.0.0.100:5000"],
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
# registry-mirrors为镜像加速

重启docker服务

[[email protected] ~]# systemctl restart docker

先打标签再推送

[[email protected] ~]# docker tag alpine:3.8 10.0.0.100:5000/alpine:3.8
[[email protected] ~]# docker push 10.0.0.100:5000/alpine
The push refers to repository [10.0.0.100:5000/alpine]
d9ff549177a9: Pushed 
3.8: digest: sha256:899a03e9816e5283edba63d71ea528cd83576b28a7586cf617ce78af5526f209 size: 528
[[email protected] ~]#

100宿主机

# 查看刚才推送的镜像与版本
[[email protected] dockerfile]# ls /opt/myregistry/docker/registry/v2/repositories/
alpine
[[email protected] dockerfile]# ls /opt/myregistry/docker/registry/v2/repositories/alpine/_manifests/tags/
3.8

101宿主机(客户端)

# 从私有仓库下载镜像
[[email protected] ~]# docker pull 10.0.0.100:5000/alpine:3.8
3.8: Pulling from alpine
Digest: sha256:899a03e9816e5283edba63d71ea528cd83576b28a7586cf617ce78af5526f209
Status: Image is up to date for 10.0.0.100:5000/alpine:3.8
10.0.0.100:5000/alpine:3.8

浏览器查看:

http://10.0.0.100:5000/v2/_catalog

国内的镜像广场:
时速云

# 下载公共外网的镜像
[[email protected] ~]# docker pull index.tenxcloud.com/system_containers/fluentd-elk:v3.2.0
[[email protected] ~]# docker pull daocloud.io/huangzhichong/alpine-cn:latest
latest: Pulling from huangzhichong/alpine-cn
0a8490d0dfd3: Pull complete 
8881e0c6b9b8: Pull complete 
Digest: sha256:57c79fbd51aac09ea307ba6ddbbb4cc60f49e015d261193bacff95f9fa39d88c
Status: Downloaded newer image for daocloud.io/huangzhichong/alpine-cn:latest
daocloud.io/huangzhichong/alpine-cn:latest

14.2 带认证

强哥的博客:docker私有仓库registry的使用

100宿主机(服务端):

[[email protected] dockerfile]# yum install httpd-tools -y
[[email protected] dockerfile]# mkdir /opt/registry-var/auth/ -p
[[email protected] dockerfile]# htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd
[[email protected] ~]# docker run -d -p 5001:5000 --restart=always --name registry_auth -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
391d185fbde8a7f008a366fd50046aabb8d5471db7eca83101e5f43649868f30
[[email protected] ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
391d185fbde8        registry            "/entrypoint.sh /etc…"   47 seconds ago      Up 46 seconds              0.0.0.0:5001->5000/tcp   registry_auth

101宿主机(客户端)

[[email protected] ~]# vim /etc/docker/daemon.json

编辑/etc/docker/daemon.json(无论上传下载都要有)

{
  "insecure-registries": ["10.0.0.100:5001"],
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
# registry-mirrors为镜像加速

重启docker服务

[[email protected] ~]# systemctl restart docker
# 登陆再上传
[[email protected] ~]# docker login 10.0.0.100:5001
Username: oldboy
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

[[email protected] .docker]# docker tag alpine:3.8 10.0.0.100:5001/alpine:3.8
[[email protected] .docker]# docker push 10.0.0.100:5001/alpine
The push refers to repository [10.0.0.100:5001/alpine]
d9ff549177a9: Layer already exists 
3.8: digest: sha256:899a03e9816e5283edba63d71ea528cd83576b28a7586cf617ce78af5526f209 size: 528

退出

[[email protected] .docker]# docker logout 10.0.0.100:5001
Removing login credentials for 10.0.0.100:5001

删除认证文件
[[email protected] .docker]# rm -fr  /root/.docker/config.json

14.3 删除镜像(未做实验)

删除镜像
1)进入docker registry的容器中

docker exec -it registry /bin/sh
  1. 删除repo
rm -fr /var/lib/registry/docker/registry/v2/repositories/nginx
  1. 清楚掉blob
registry garbage-collect /etc/docker/registry/config.yml

14.4 Harbor 安装和使用

Harbor 1.8.0 仓库的安装和使用


15 docker容器编排(单机版docker-compose)

作用:一次性启动多个容器

配置文件:
docker-compose.yml(用于决定启动哪些容器)

版本参考:https://docs.docker.com/compose/compose-file/

相关命令:

docker-compose up -d(创建并启动)

docker-compose restart 单个服务名字
docker-compose restart(重启所有)

docker-compose stop(停止所有)
docker-compose stop 单个服务名字

docker-compose start (启动所有)
docker-compose start 单个服务名字

docker-compose down(停止并删除)

安装docker-compose(需要epel源)

[[email protected] ~]# yum install docker-compose -y
[[email protected] zabbix]# pwd
/opt/docker-compose/zabbix
[[email protected] zabbix]# vim docker-compose.yaml

编辑yaml文件

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

   zabbix-java-gateway:
     image: zabbix/zabbix-java-gateway:latest
     restart: always

   zabbix-server:
     depends_on:
       - mysql-server
     image: zabbix/zabbix-server-mysql:latest
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd
       ZBX_JAVAGATEWAY: zabbix-java-gateway
     ports:
       - "10051:10051"

   zabbix-web-nginx-mysql:
     depends_on:
       - zabbix-server
     image: zabbix/zabbix-web-nginx-mysql:latest
     ports:
       - "80:80"
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd

启动docker-compose

[[email protected] zabbix]# docker-compose up -d

查看状态

[[email protected] zabbix]# docker container ls -a
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                               NAMES
5e274626a917        zabbix/zabbix-web-nginx-mysql:latest   "/bin/bash /run_zabb…"   21 seconds ago      Up 20 seconds       0.0.0.0:80->80/tcp, 443/tcp         zabbix_zabbix-web-nginx-mysql_1
774cdef1c413        zabbix/zabbix-server-mysql:latest      "/bin/bash /run_zabb…"   22 seconds ago      Up 20 seconds       162/udp, 0.0.0.0:10051->10051/tcp   zabbix_zabbix-server_1
2089f645a34f        mysql:5.7                              "docker-entrypoint.s…"   23 seconds ago      Up 22 seconds       3306/tcp                            zabbix_mysql-server_1
9717d59f0d70        zabbix/zabbix-java-gateway:latest      "/bin/bash /run_zabb…"   23 seconds ago      Up 22 seconds       10052/tcp                           zabbix_zabbix-java-gateway_1
# 浏览器访问:http://10.0.0.101
# 管理员初始密码:Admin / zabbix

模拟异常:

# 先删除
[[email protected] zabbix]# docker rm -f zabbix_zabbix-server_1
zabbix_zabbix-server_1

[[email protected] zabbix]# docker container ls -a
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                         NAMES
5e274626a917        zabbix/zabbix-web-nginx-mysql:latest   "/bin/bash /run_zabb…"   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 443/tcp   zabbix_zabbix-web-nginx-mysql_1
2089f645a34f        mysql:5.7                              "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes        3306/tcp                      zabbix_mysql-server_1
9717d59f0d70        zabbix/zabbix-java-gateway:latest      "/bin/bash /run_zabb…"   7 minutes ago       Up 7 minutes        10052/tcp                     zabbix_zabbix-java-gateway_1

# 扩展
[[email protected] zabbix]# docker-compose scale zabbix-server=1
WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
Creating zabbix_zabbix-server_1 ... done

[[email protected] zabbix]# docker container ls -a
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                               NAMES
5696cf6464b4        zabbix/zabbix-server-mysql:latest      "/bin/bash /run_zabb…"   2 seconds ago       Up 1 second         162/udp, 0.0.0.0:10051->10051/tcp   zabbix_zabbix-server_1
5e274626a917        zabbix/zabbix-web-nginx-mysql:latest   "/bin/bash /run_zabb…"   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp, 443/tcp         zabbix_zabbix-web-nginx-mysql_1
2089f645a34f        mysql:5.7                              "docker-entrypoint.s…"   8 minutes ago       Up 7 minutes        3306/tcp                            zabbix_mysql-server_1
9717d59f0d70        zabbix/zabbix-java-gateway:latest      "/bin/bash /run_zabb…"   8 minutes ago       Up 7 minutes        10052/tcp                           zabbix_zabbix-java-gateway_1

附加例子(未做实验):
wordpress
https://docs.docker.com/compose/wordpress/


16 docker网络

16.1 默认网络

  • host:使用宿主机的网络,性能最高 端口不能冲突
  • none:不使用网络
  • container:与其他容器共用网络,端口不能冲突。主要为k8s中使用
  • bridge:nat转换 172.17.0.0/16 默认

创建范例:

# host类型 #
[[email protected] ~]# docker run -it --network=host alpine:3.9
/ # hostname 
docker01-h-100
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:60:6E:5A:7B  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0


# none类型 #
[[email protected] ~]# docker run -it --network=none alpine:3.9
/ # hostname 
b2102b8dfc24
/ # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


# container类型 #
# 先在none类型的容器中偷偷离开(按键ctrl + p --> ctrl +q)
/ # [[email protected] ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
b2102b8dfc24        alpine:3.9          "/bin/sh"                4 minutes ago       Up 4 minutes                                        quizzical_austin
[[email protected] ~]# docker run -it --network container:b2102b8dfc24 alpine:3.9
/ # hostname 
b2102b8dfc24
/ # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

查看容器自身拥有的网络种类

[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
2f57a0bb3dbe        bridge              bridge              local
70ee693800de        host                host                local
4972003e7886        none                null                local
963d985f5825        zabbix_default      bridge              local

查看容器的网络类型

[[email protected] ~]# docker container ls -a
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                               NAMES
5696cf6464b4        zabbix/zabbix-server-mysql:latest      "/bin/bash /run_zabb…"   8 hours ago         Up 13 minutes       162/udp, 0.0.0.0:10051->10051/tcp   zabbix_zabbix-server_1
5e274626a917        zabbix/zabbix-web-nginx-mysql:latest   "/bin/bash /run_zabb…"   8 hours ago         Up 13 minutes       0.0.0.0:80->80/tcp, 443/tcp         zabbix_zabbix-web-nginx-mysql_1
2089f645a34f        mysql:5.7                              "docker-entrypoint.s…"   8 hours ago         Up 13 minutes       3306/tcp                            zabbix_mysql-server_1
9717d59f0d70        zabbix/zabbix-java-gateway:latest      "/bin/bash /run_zabb…"   8 hours ago         Up 13 minutes       10052/tcp                           zabbix_zabbix-java-gateway_1
[[email protected] ~]# docker container inspect 5696cf6464b4

16.2 自建网络

范例:
第一步:自建一个名字为 rock 的 bridge 类型网络
第二步:根据自建网络创建一个容器

# 网络
[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
06dd2d885ed6        bridge              bridge              local
48c7831e04c6        host                host                local
dd692489f056        none                null                local

[[email protected] ~]# docker network create --subnet 172.18.0.0/16 --gateway=172.18.0.1 -d bridge rock
e76e59153b529c5f9aca607f78f97452247911619bd47380a791509085395d42

[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
06dd2d885ed6        bridge              bridge              local
48c7831e04c6        host                host                local
dd692489f056        none                null                local
e76e59153b52        rock                bridge              local

[[email protected] ~]# ifconfig
br-e76e59153b52: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:c1ff:fe96:8452  prefixlen 64  scopeid 0x20<link>
        ether 02:42:c1:96:84:52  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


# 容器
[[email protected] ~]# docker run -it --network rock alpine:3.9 
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:00:02  
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1172 (1.1 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # ping www.baidu.com
PING www.baidu.com (180.101.49.12): 56 data bytes
64 bytes from 180.101.49.12: seq=0 ttl=127 time=13.613 ms
64 bytes from 180.101.49.12: seq=1 ttl=127 time=12.563 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 12.563/13.088/13.613 ms

16.3 跨宿主机网络容器之间的通信overlay类型

要点:

  • 宿主机 主机名不能相同
  • consul:kv类型的存储数据库(key:value)

103宿主机(consul服务端)

# 安装consul容器,它用来存储ip地址的分配
[[email protected] docker_image]# pwd
/root/docker_image
[[email protected] docker_image]# docker load -i docker_progrium_consul.tar.gz
[[email protected] docker_image]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
progrium/consul     latest              09ea64205e55        4 years ago         69.4 MB

[[email protected] docker_image]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
920687010b146669f931e7f3cabaff59bee0b32bab72e11c7d0907a7d8145461

[[email protected] docker_image]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                                                            NAMES
920687010b14        progrium/consul     "/bin/start -serve..."   About a minute ago   Up About a minute   53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp   consul

# 浏览器访问:http://10.0.0.102:8500

100宿主机

[[email protected] ~]# vim /etc/docker/daemon.json

编辑/etc/docker/daemon.json

{
  # 下述两行为私有仓库相关
  "insecure-registries": ["10.0.0.100:5000"],
  "registry-mirrors": ["https://registry.docker-cn.com"],
  # 下述三行为容器间通讯
  "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
  "cluster-store": "consul://10.0.0.102:8500",
  "cluster-advertise": "10.0.0.100:2376"
}
[[email protected] ~]# vim /usr/lib/systemd/system/docker.service

编辑/usr/lib/systemd/system/docker.service

第十四行:ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock

重启服务

[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker

# 浏览器访问:http://10.0.0.102:8500,key/Value中的node节点

101宿主机

[[email protected] ~]# vim /etc/docker/daemon.json

编辑/etc/docker/daemon.json

{
  "insecure-registries": ["10.0.0.100:5000"],
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
  "cluster-store": "consul://10.0.0.102:8500",
  "cluster-advertise": "10.0.0.101:2376"
}
[[email protected] ~]# vim /usr/lib/systemd/system/docker.service

编辑/usr/lib/systemd/system/docker.service

第十四行:ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock

重启服务

[[email protected] ~]# systemctl daemon-reload
[[email protected] ~]# systemctl restart docker

创建overlay网络
100宿主机

[[email protected] ~]# docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254 ol1
b34d929dbdbdc85b68ba4b1b304aeb068b0155326f5b7c738e6cebb2990f95a9
[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
40d98ade0a84        bridge              bridge              local
48c7831e04c6        host                host                local
dd692489f056        none                null                local
b34d929dbdbd        ol1                 overlay             global
e76e59153b52        rock                bridge              local

101宿主机(无需创建)

[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d9816afa2ce8        bridge              bridge              local
70ee693800de        host                host                local
4972003e7886        none                null                local
b34d929dbdbd        ol1                 overlay             global
963d985f5825        zabbix_default      bridge              local

# 查看100的容器是否有registry
[[email protected] ~]# docker -H 10.0.0.100:2376 ps -a|grep "registry"
cafb85d5bb90        registry            "/entrypoint.sh /etc…"   39 hours ago        Up 21 minutes               0.0.0.0:5000->5000/tcp   registry

# 查看自己的容器是否有registry
[[email protected] ~]# docker ps -a|grep "registry"

启动容器测试
100容器

[[email protected] ~]# docker run -it --network ol1 --name rock01 10.0.0.100:5000/alpine:3.8 /bin/sh

101容器

[[email protected] ~]# docker run -it --network ol1 --name rock02 10.0.0.100:5000/alpine:3.8 /bin/sh

# 直接ping rock01
/ # ping rock01
PING rock01 (172.16.2.1): 56 data bytes
64 bytes from 172.16.2.1: seq=0 ttl=64 time=0.451 ms
64 bytes from 172.16.2.1: seq=1 ttl=64 time=0.471 ms
64 bytes from 172.16.2.1: seq=2 ttl=64 time=0.438 ms
^C
--- rock01 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.438/0.453/0.471 ms
/ # 

/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:10:02:02  
          inet addr:172.16.2.2  Bcast:172.16.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:728 (728.0 B)  TX bytes:728 (728.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:13:00:02  
          inet addr:172.19.0.2  Bcast:172.19.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1136 (1.1 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:230 (230.0 B)  TX bytes:230 (230.0 B)

/ # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.19.0.1      0.0.0.0         UG    0      0        0 eth1
172.16.2.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth1

注意:每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网

100容器
创建容器能通过对外访问

[[email protected] ~]# docker run -d --network ol1 --name kod -p 90:80 kod:v2
d28449a26cc3cce33d982085fb8a7f199e94ec582fefe833b322e5e642f38b73

17 Docker监控

node-expoter(监控linux宿主机)与cadvisor(监控容器)安装在100与101
prometheus与grafana安装在102

100与101宿主机

# 导入node-exporter与cadisor
[[email protected] docker_image]# docker load -i docker_monitor_node.tar.gz
975e03895fb7: Loading layer [==================================================>]  4.688MB/4.688MB
f9fe8137e4e3: Loading layer [==================================================>]  2.765MB/2.765MB
78f40987f0cd: Loading layer [==================================================>]  16.88MB/16.88MB
Loaded image: quay.io/prometheus/node-exporter:latest
cd7100a72410: Loading layer [==================================================>]  4.403MB/4.403MB
9ea477e6d99e: Loading layer [==================================================>]  33.09MB/33.09MB
66b3c2e84199: Loading layer [==================================================>]  32.88MB/32.88MB
Loaded image: google/cadvisor:latest

# 启动node-exporter
[[email protected] docker_image]# docker run -d -p 9100:9100 -v "/:/host:ro,rslave" --name=node_exporter quay.io/prometheus/node-exporter --path.rootfs /host
89744ae8ca95ff8a5922fe8bf76d5f986a80bc689c0daf24d2aa933a6e7907c9

# 启动cadvisor
[[email protected] docker_image]# 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
1d49ed343d74bfc3ac9bbc8090c9e41319a6cd856a6b7690342b57ed4ff066e2

102宿主机(安装prometheus)

[[email protected] ~]# cd /opt/
[[email protected] opt]# ls
prometheus-2.12.0.linux-amd64.tar.gz
[[email protected] opt]# tar xf prometheus-2.12.0.linux-amd64.tar.gz
[[email protected] opt]# cd prometheus-2.12.0.linux-amd64/
[[email protected] prometheus-2.12.0.linux-amd64]# vim prometheus.yml

编辑prometheus.yml

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['10.0.0.100:8080','10.0.0.101:8080']
  - job_name: 'node'
    static_configs:
    - targets: ['10.0.0.100:9100','10.0.0.101:9100']

启动prometheus

[[email protected] prometheus-2.12.0.linux-amd64]# nohup ./prometheus --config.file="prometheus.yml" >> /dev/null 2>&1 &

# 浏览器访问:http://10.0.0.102:9090
查看status下的target

102宿主机(安装grafana)

[[email protected] package]# yum localinstall grafana-6.3.3-1.x86_64.rpm -y
[[email protected] package]# systemctl start grafana-server.service
[[email protected] package]# systemctl enable grafana-server.service

[[email protected] package]# ss -tnlp
State       Recv-Q Send-Q                                 Local Address:Port                                                Peer Address:Port              
LISTEN      0      128                                                *:22                                                             *:*                   users:(("sshd",pid=6999,fd=3))
LISTEN      0      128                                               :::8500                                                          :::*                   users:(("docker-proxy-cu",pid=7433,fd=4))
LISTEN      0      128                                               :::22                                                            :::*                   users:(("sshd",pid=6999,fd=4))
LISTEN      0      128                                               :::3000                                                          :::*                   users:(("grafana-server",pid=7858,fd=6))
LISTEN      0      128                                               :::9090                                                          :::*                   users:(("prometheus",pid=7705,fd=7))

# 浏览器访问:http://10.0.0.102:3000/login
账号 / 密码:admin / admin

Configuration - DataSource中新建一个数据源选择prometheus - IP:10.0.0.102:9090
create - import - 选择导入文件grafana_docker_dashboard.json - option内的Prometheus中选择Prometheus

grafana出图模板

grafana主要配置工作:

  • 插件:zabbix插件
  • 数据源:prometheus
  • 模板:出图dashboard
版权声明:本文为rockisbean原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rockisbean/article/details/103547798

智能推荐

Thread.join()方法的使用

如果一个线程A执行了thread.join()语句,代表当前线程A等待thread线程终止后才从thread.join()方法返回 并且这个方法具有超时特性,可以添加参数设置 输出结果: jdk中Thread.join()方法的源码(进行了部门调整)   每个线程终止的条件是前驱线程的终止,每个线程等待前驱线程终止后,才从join()方法返回,  当线程终止时,会调用自身的no...

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

猜你喜欢

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...

力扣困难难度 第4题 寻找两个正序数组的中位数

先看一眼题 我的思路: 设置下标i,j分别用于遍历两个数组,初始值均为0,直到找到两个数组中从小到大的第第length/2个数为止结束循环,length为两个数组长度之和。 ·每次比较nums[i]nums[j],如果前者小则i++,否则j++ ·循环结束时,如果count已经达到length/2,则说明已经找到了中位数,[注意:此时有可能正好其中一个数组遍历完了!所以...

[国家集训队]小Z的袜子(莫队)

[国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这NN只袜子从1到NN编号,然后从编号LL到RR(LL 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同...

服务器配置(五) 服务器使用tomcat配置https全过程

一.了解服务器配置https协议 HTTPS,是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 配置HTTPS就需要证书,证书通过权威的CA机构付费获得的证书才能被互联网承认,我们将其放在服务器上面,配置好后,就可以进行https通信了。 通过https访问的网站,在地址前可以看到安全两个字,点击可以查...