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