Bootstrap

docker

1.容器介绍

容器是轻量级虚拟化技术,用于快速构建业务环境,便于业务迁移,避免兼容性问题

1.1区别

与传统的虚拟化技术相比:容器创建速度快(秒级)、无虚拟硬件、共享物理机内核、IO速度快

1.2容器三要素

容器、镜像、仓库
在这里插入图片描述

1.3容器核心技术

  • namespace 命名空间

实现资源(文件、目录、用户、端口、进程)隔离

  • cgroup

实现容器的资源限制

1.4容器管理软件

docker:docker-ce、docker-ee
podman
containerd

2.安装docker

配置yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

配置国内镜像仓库(阿里云每人独立)

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://rywdmoco.mirror.aliyuncs.com"]
}

2.1镜像基础操作

查看镜像

docker images

搜索镜像

docker search 关键字

下载镜像

docker pull 镜像名称:标记

导入镜像

docker load -i centos:7

导出镜像

docker save -o centos.tar centos:7

3.容器基础操作

创建容器

docker run -tid centos:7 /bin/bash 
-t  提供操作终端
-d  后台运行
/bin/bash   容器的运行依赖于一个持续的进程

查看镜像的详细信息

docker image inspect 镜像名

查看容器

docker ps -a

查看容器详细信息

docker inspect 容器名称

查看日志

docker logs 容器名

连接登录容器

docker exec -ti 容器名称 bash
bash   或执行其他命令

删除容器

docker rm -f 容器名

启动/停止/重启容器

docker {start|stop|restart} 容器ID/名称 

杀死容器

docker kill 容器名称

导出\导入容器

docker export -o app.tar app  //导出容器
docker import app.tar         //导入容器

指定容器名称、主机名

docker run -tid --name=test1 --hostname=test1 centos:7

设置容器开机自启动

docker run -tid --name=test2 --hostname=test2 --restart=always centos:7

发布容器服务

docker run --tid --name=test3 --hostname=test3 -p 80:80 nginx:1.18
-P  随机发布端口

传递环境变量: -e 变量名称=值

 docker run -tid --name=test4 --hostname=test4 -e  MYSQL_ROOT_PASSWORD=redhat mysql:5.7

持久化存储

docker run -tid --name=test5 --hostname=test5 -v /opt/test5:/test5 centos:7

定义容器的通信别名 --link=容器名称:别名

docker run -tid --name=test6 --hostname=test6 --link=test:test6 centos:7

容器的资源限制 cpu/内存

docker run -tid --name=test7 --cpus=2 --memory=800M centos:7

docker inspect test8 | grep -i memory
查看容器资源限制

4.docker的网络管理

4.1docker网络工作模式

4.1.1bridge(桥接)

实际就是NAT模式
SNAT:网关、路由转发、SNAT规则
DNAT:-p, -P;注意端口冲突

4.1.2host(仅主机)

容器会和物理机共享同一个网络命名空间

docker run -tid --name=test9 --net=host centos:7

4.1.3container

新建的容器会与一个已有的容器(bridge模式)共享同一个网络命名空间
减少通信时的网络消耗

4.1.4none

容器没有自己的网络命名空间

4.2flannel

解决跨物理机容器间通信的问题:
1、改变容器的IP分配方式
2、特殊线路连接容器网络
在这里插入图片描述

4.2.1flannel网络部署

192.168.140.10 docker/flannel/etcd
192.168.140.11 docker/flannel

安装配置etcd

[root@martin-host ~]# yum install -y etcd

[root@martin-host ~]# vim /etc/etcd/etcd.conf 
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

[root@martin-host ~]# systemctl enable --now etcd
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
[root@martin-host ~]# 
[root@martin-host ~]# netstat -tunlp | grep etcd
tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      20101/etcd          
tcp6       0      0 :::2379                 :::*                    LISTEN      20101/etcd    

[root@martin-host ~]# etcdctl set file01/name martin
martin
[root@martin-host ~]# etcdctl get file01/name
martin

安装flannel

[root@martin-host ~]# yum install -y flannel 

[root@martin-host ~]# vim /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://192.168.140.10:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"

在etcd数据库中写入flannel网络信息

[root@martin-host ~]# etcdctl mk /atomic.io/network/config '{"Network":"10.88.0.0/16"}'
{"Network":"10.88.0.0/16"}

启动flannel

[root@martin-host ~]# systemctl enable --now flanneld.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
Created symlink from /etc/systemd/system/docker.service.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
[root@martin-host ~]#

[root@martin-host ~]# ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.88.54.0  netmask 255.255.0.0  destination 10.88.54.0
        inet6 fe80::64e:b3fe:833f:bbd3  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3  bytes 144 (144.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

配置flannel接管docker0

[root@martin-host ~]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_NETWORK_OPTIONS

[root@martin-host ~]# systemctl daemon-reload
[root@martin-host ~]# systemctl restart docker
[root@martin-host ~]# 
[root@martin-host ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1472
        inet 10.88.54.1  netmask 255.255.255.0  broadcast 10.88.54.255
        inet6 fe80::42:4bff:fed0:c4a  prefixlen 64  scopeid 0x20<link>
        ether 02:42:4b:d0:0c:4a  txqueuelen 0  (Ethernet)
        RX packets 23132  bytes 3492875 (3.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35113  bytes 38048558 (36.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


[root@martin-host ~]# ls /run/flannel/
docker  subnet.env
[root@martin-host ~]# cat /run/flannel/docker 
DOCKER_OPT_BIP="--bip=10.88.54.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS=" --bip=10.88.54.1/24 --ip-masq=true --mtu=1472"

另外一个物理主机参考上述flannel配置 

测试
修改iptables防火墙数据转发链的默认策略

[root@martin-host ~]# iptables -P FORWARD ACCEPT

[root@martin-host ~]# docker exec -ti test1 bash
[root@fc0cdb7e5dcd /]# 
[root@fc0cdb7e5dcd /]# ping 10.88.86.2
PING 10.88.86.2 (10.88.86.2) 56(84) bytes of data.
64 bytes from 10.88.86.2: icmp_seq=18 ttl=60 time=0.643 ms
64 bytes from 10.88.86.2: icmp_seq=19 ttl=60 time=1.04 ms

5.docker镜像

分层的文件系统
优势:节省空间、速度快、重用

只读
创建容器时,会在镜像上面添加一个可写层

镜像核心技术
COW copy on write 写时复制
Union fs 联合文件系统
overlay2
device mapper
在这里插入图片描述

7.dockerfile

FROM centos:7
// 镜像名称

RUN yum install -y net-tools
// 指定执行命令

CMD["httpd", "-D", "FOREGROUND"]
// 定义容器创建时,自动执行的命令
// 注意事项:
// 1、前台启动服务的指令
// 2、创建容器时,不要自己指定命令,会覆盖CMD
// 3、一个Dockerfile中只能有一条CMD指令

ENTRYPOINT ["httpd", "-D", "FOREGROUND"]
// 定义容器创建时,自动执行的命令
// 不会被覆盖

COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
// 复制文件
// 注意:只能复制本地文件

ADD file01 /tmp/file01
// 复制文件
// 注意:
// 支持本地文件、URL、压缩包会自动解压

EXPOSE 80 80
// 说明容器服务端口
// 注意:
// -P随机发布端口时,Dockerfile中必须有EXPOSE指令

VOLUME /opt
// 定义持久化存储的目录
// 创建容器时不使用-v明确指定目录,会自动生成匿名卷

ENV MYSQL_ROOT_PASSWORD redhat
// 定义环境变量

WORKDIR /opt
// 定义当前目录

USER root
// 指定容器运行的用户

构建镜像

docker build -t  dockerfile名 -f 指定路径

8.docker-compose

单机版的容器编排工具
作用: 批量管理容器的
安装docker-compose

[root@localhost ~]# mv docker-compose /usr/local/bin/
[root@localhost ~]# chmod a+x /usr/local/bin/docker-compose 

[root@localhost ~]# docker-compose version
docker-compose version 1.29.0, build 07737305
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

编写compose文件

[root@laobideng compose]# cat docker-compose.yaml 
version: '3'
services:
   test_nginx:
       image: nginx:1.18
   test_redis:
       image: redis

创建

docker-compose up -d 

删除

 docker-compose down

示例

cat docker-compose.yaml 
version: '3'                                                                  //指定docker-compose和docker对接的API版本
services:                                                                     //要创建的服务信息,容器
    tomcat_project_01:
        image: tomcat                                                         //指定镜像名称
        volumes:                                                              //指定要创建的数据卷信息, 持久化存储
           - /opt/tomcatCompose/project.war:/usr/local/tomcat/webapps/project.war
        expose:                                                               //说明容器中的服务端口
           - 8080
        deploy:
          resources:                                                          //资源限制
              limits:                                                         // 硬限制 
                   cpus: 2
                   memory: 2G
              reservations:                                                   // 软限制 
                   cpus: 1
                   memory: 1G
        healthcheck:                                                          //健康状态检查
            test: ["CMD", "curl", "-f", "http://localhost:8080"]
            interval: 10s
            timeout: 10s
            retries: 3
            start_period: 30s
    tomcat_project_02:
        image: tomcat
        volumes:
           - /opt/tomcatCompose/project.war:/usr/local/tomcat/webapps/project.war
        expose:
           - 8080
        deploy:
          resources:
              limits:
                   cpus: 2
                   memory: 2G
              reservations:
                   cpus: 1
                   memory: 1G
        healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:8080"]
            interval: 10s
            timeout: 10s
            retries: 3
            start_period: 30s
    tomcat_nginx:
         image: nginx:1.18
         expose:
            - 80
         ports:                                                                     //发布容器服务
            - 80:80
         links:                                                                     //定义容器通信别名
            - tomcat_project_01:tomcat_project_01
            - tomcat_project_02:tomcat_project_02
         volumes:
            - /opt/tomcatCompose/nginx.conf:/etc/nginx/conf.d/default.conf
         depends_on:                                                                //定义容器依赖关系
            - tomcat_project_01
            - tomcat_project_02
         deploy:
           resources:
              limits:
                   cpus: 2
                   memory: 2G
              reservations:
                   cpus: 1
                   memory: 1G

// 定义容器副本数
// deploy:              
//	replicas: 3

// 指定网络模式
// network_mode: "host"

// 定义环境变量
// environment:
//    key: value
//    key: value

// 指定容器自动运行的命令
// version: '3'
// services:
//   test:
//     image: centos:7
//     command:
//       - "sleep"
//       - "3600"

9.harbor镜像仓库

  • 公有仓库, DockerHub
  • 私有仓库, 企业级的应用

registry镜像,早期

harbor软件
vmware开源的
提供webUI
日志审计
权限分配
统一认证

安装harbor

[root@localhost ~]# mkdir /work
[root@localhost ~]# tar xf harbor-offline-installer-v2.2.2.tgz -C /work/
 
[root@localhost ~]# cp /work/harbor/harbor.yml.tmpl /work/harbor/harbor.yml 

生成证书、密钥(v3版本证书)

[root@localhost ~]# mkdir /opt/ssl
[root@localhost ~]# cd /opt/ssl
[root@localhost ssl]# openssl genrsa -out ca.key 4096
Generating RSA private key, 4096 bit long modulus
..........................................................................................++
.......................................................................................................++
e is 65537 (0x10001)
[root@localhost ssl]# 
[root@localhost ssl]# openssl req -x509 -new -nodes -sha512 -days 3650  -subj "/CN=harbor.linux.com"  -key ca.key  -out ca.crt
[root@localhost ssl]# ls
ca.crt  ca.key


[root@localhost ssl]# openssl genrsa -out server.key 4096
Generating RSA private key, 4096 bit long modulus
.........................................................................++
......................++
e is 65537 (0x10001)
[root@localhost ssl]# openssl req  -new -sha512  -subj "/CN=harbor.linux.com"  -key server.key  -out server.csr

[root@localhost ssl]# cat v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth 
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.linux.com

[root@localhost ssl]# openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
Signature ok
subject=/CN=harbor.linux.com
Getting CA Private Key
[root@localhost ssl]# 

编辑harbor配置文件

[root@localhost ~]# vim /work/harbor/harbor.yml 

hostname: harbor.linux.com

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /opt/ssl/server.crt
  private_key: /opt/ssl/server.key

[root@localhost harbor]# ./prepare 

[root@localhost harbor]# ./install.sh 

登录仓库

docker login harbor.linux.com

为镜像打标记

docker tag websocket-server:1.0 harbor.linux.com/miaosha/websocket-server:1.0

上传

docker push harbor.linux.com/miaosha/websocket-server:1.0 

退出

docker logout harbor.linux.com

9.1harbor的核心组件

在这里插入图片描述

core service
提供web UI、令牌token、与registry交互获取镜像的元数据信息在webUI上展示

registry
负责镜像的上传、下载

Log collector
采集日志

Job service
负责在多个harbor仓库间同步数据

Proxy
使用nginx对后端所有组件进行反向代理

Database
redis:存储前端用户产生的令牌
harbor-db:关系型数据库,存放harbor仓库上数据;默认是postgreSQL/pgSQL

;