Docker学习【3-4-5】
Docker 3
1.阿里云和docker官方registry实现镜像
2.私有仓库简介
3.Harbor简介及部署使用
4.Harbor私有仓库详解
5.Docker数据卷简介及使用
6.数据卷server使用简介
7.实现haproxy、ngi及tom的小型站点
Docker 4
1.基于alp和ub镜像构建nginx镜像
2.Docker网络-上
3.Docker网络-中
4.Docker网络-下
5.Docker资源限制-上
6.Docker资源限制-下
7.Docker Swarm简介
第5节预习-Docker 5
1.docker-compose简介及安装
2.docker-compose使用简介-上
3.docker-compose使用简介-下
4.docker-compose示例
Homework
1、搭建配置harbor私有仓库;

2、掌握docker网络;
容器之间通过容器名称或者自定义别名实现的互联,仅仅限于单机docker主机使用,不能夸主机,使用场景比较少
docker run -it -d --name magedu-tomcat-app1 harbor.magedu.com/m43/tomcat-m43:app1
docker run -it -d -p 80:80 --link magedu-tomcat-app1 harbor.magedu.com/m43/nginx-all-in-one:1.16.1-v2【link到其他容器中】
docker run -it -d -p 80:80 --link magedu-tomcat-app1-m43:magedu-tomcat-app1-m43 harbor.magedu.com/m43/nginx-all-in-one:1.16.1-v2【link容器取别名】
docker网络类型包括:bridge、none、host、container。
bridge桥接模式:-net=bridge
*是默认docker创建的网络模式

docker network inspect bridge
host模式:--net=host
*容器不会创建网络堆栈信息,而是直接使用宿主机的网络堆栈进行通信,优势是不需要docker0网桥进行报文转发所以性能比较强,通常用于对网络性能要求比较高的业务,比如mysql/kafka/redis/大数据等容器业务,缺点就是会在宿主机直接监听端口,可能出现端口冲突等问题。
none模式:-net=none
*在使用 none 模式后,Docker 容器不会进行任何网络配置,其没有网卡、没有IP 也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP 等,所以极少使用
container:-net=container
*使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网,新创建的容器不会创建自己的网卡也不会配置自己的 IP,而是和一个已经存在的被指定的容器东西 IP 和端口范围,因此这个容器的端口不能和被指定的端口冲突,除了网络之外的文件系统、进程信息等仍然保持相互隔离两个容器的进程可以通过 lo 网卡及容器 IP 进行通信
docker 跨主机互联通信:
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock --bip=10.10.0.1/24 【注意 此ip必须是非.0 否者会docker报错】
主机配置静态路由转发:
#route add -net 10.20.0.0/24 gw 192.168.7.102
# iptables -A FORWARD -S 192.168.0.0/21 ACCEPT
自定义docker网络
#docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.1 birkhoffxia


实现两个网段通信: 注销网桥iptables 路由规则 然后重新导入
iptables-sava > iptables.sh
iptables-restore < iptables.sh

3、安装docker-compose并利用它组装一个多容器的服务:如haproxy+nginx+tomcat
详见:https://www.cnblogs.com/birkhoffxia/articles/17143649.html
===知识点===
【公私有仓库区别】
*private:私有仓库,无论上传镜像还是下载镜像,都需要提前登录之后才能上传或者下载
*public:公有仓库,如果要上传需要登录成功后才能上传,如果仅仅是下载镜像就不需要登录即可下载(在dockerd的service文件添加--insecure-registry 172.31.6.102)
【阿里云 注册 上传下载镜像】
1. 登录阿里云Docker Registry
$ docker login --username=夏恺晟 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/birkhoff/nginx:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=夏恺晟 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/birkhoff/nginx:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/birkhoff/nginx:[镜像版本号]
阿里云 刷新一下镜像版本:

【Docker Hub 进行上传下载镜像】
Docker Hub:https://hub.docker.com/ 注册账户 登陆



【docker registry 上传下载容器】
#docker pull registry:2.6.2
#mkdir /docker/auth -p
#cd /docker
#docker run --entrypoint htpasswd registry:2.6.2 -Bbn birkhoff 123456 > auth/htpasswd
发生报错:docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"write /proc/self/attr/keycreate: permission denied\"": unknown.
ERRO[0000] error waiting for container: context canceled
解决办法:关闭selinux
1.暂时关闭:setenforce 0
2.永久关闭:vi /etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled,然后保存退出。
检验方法:输入getenforce 0,返回Permissive即为关闭
#cat /docker/auth/htpasswd
#docker run -d -p 5000:5000 --restart=always --name registry1 -v /docker/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:2.6.2
#ss -tnl 确认都都端口是否开启

# 登陆会报错需要添加 本地镜像仓库

~# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.19.139:5000
#systemctl daemon-reload
#systemctl restart docker
#docker info
或者在/etc/docker/daemon.json 中添加
"insecure-registry":"192.168.19.139:5000"【有待验证】
#systemctl daemon-reload
#systemctl restart docker
#docker info


docker tag local-image:tagname new-repo:tagname EG:docker tag nginx:latest 192.168.19.139:5000/birkhoff/nginx:v3
docker push new-repo:tagname EG:docker push 192.168.19.139:5000/birkhoff/nginx:v3
验证下载镜像先删除 镜像再次下载

【Harbor部署】
#1.域名解析[有域名就解析 没有不做]
#2.先部署docker,解压harbor离线包
tar xvf harbor-offline-installer-v2.3.2.tgz
#3.进入harbor,修改harbor.yml
hostname可选修改:修改为IP 或者 域名 。测试的话IP会好点 域名会有点问题
注销https代码块
可选修改密码:如果修改可能会有问题 需要开库解决
可选修改数据盘
#4.配置docker service的本地信任仓库
[root@jgharbor harbor]# cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.40.148"]
}
或者 /lib/systems/system/docker.service添加 二选一
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.19.178
重启docker
#5.启动脚本 安装Harbor,需要检查docker version 和 docker-compose version
/install.sh
#6.域名访问 windows加 hosts加解析
192.168.40.148 harbor.xks.com
#7.创建仓库
#8.推送
docker pull birkhoffxia/nginx:latest
docker tag birkhoffxia/nginx:latest 192.168.40.148/birkhoffxia/nginx:latest
docker push 192.168.40.148/birkhoffxia/nginx:latest
==============================================================
#如果修改了密码 可能导致登录harbor时报错 如果账户密码不对
##重置后为自己配置文件里设置的默认密码##
1,进入[harbor-db]容器内部
docker exec -it harbor-db /bin/bash
2,进入postgresql命令行
psql -h postgresql -d postgres -U postgres
#这要输入默认密码:root123 。
3,切换到harbor所在的数据库
\c registry
4,查看harbor_user表
select * from harbor_user;
5,重置admin密码
update harbor_user set salt='', password='' where username='admin';
重新启动Harbor私有镜像仓库后,密码就会自动重置为之前安装时配置文件中的密码 默认为:Harbor12345
\q
exit
6,重新启动Harbor私有镜像仓库
# docker-compose start
#./prepare
# docker-compose stop
查看Harbor设置的密码
docker exec -it harbor-core bash
printenv |grep PASSWORD
# docker login时报错 如下解决办法:
docker-compose down -v
docker-compose up -d
让项目重新部署

6.要提前Harbor 界面 创建目的项目

7.上传镜像

8.删除拉取

** ./install_sh --with-trivy 安装时可以指定 表示 安装监控扫描 如果忘记可以后续添加
./prepare --with-trivy
【Harbor 高可用网络拓扑】

【docker 数据卷】
#在当前环境下,即使把提供卷的容器 Server 删除,已经运行的容器 Client 依然可以使用挂载的卷,因为容器是通过挂载访问数据的,但是无法创建新的卷容器客户端,但是再把卷容器 Server 创建后即可正常创建卷容器 Client,此方式可以用于线上共享数据目录等环境,因为即使数据卷容器被删除了,其他已经运行的容器依然可以挂载使用
#数据卷容器可以作为共享的方式为其他容器提供文件共享,类似于 NFS 共享可以在生产中启动一个实例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各容器之间的数据一致性。

【alpine 镜像】
FROM alpine:3.13 【选择3.17 make时报错选择3.13版本】
maintainer xiakaisheng "807722920@qq.com"
COPY repositories /etc/apk/repositories 【使用清华源进行添加仓库 https://mirrors.tuna.tsinghua.edu.cn/help/alpine/】
RUN apk update && apk add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget openssl openssl-dev libevent libevent-dev iproute2【更新仓库 安装需要的包 openssl-dev而不是openssl-devel】
ADD nginx-1.16.1.tar.gz /opt/ 【wget源码包 EG:wget http://nginx.org/download/nginx-1.16.1.tar.gz】
RUN cd /opt/nginx-1.16.1 && ./configure --prefix=/etc/nginx && make && make install
RUN addgroup -g 2019 -S nginx && adduser -s /sbin/nologin -S -D -u2019 -G nginx nginx
RUN chown nginx.nginx /etc/nginx/ -R
COPY nginx.conf /etc/nginx/conf/nginx.conf【使用docker cp复制出nginx的配置文件 进行修改】
COPY index.html /etc/nginx/html
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
报错如下:3.13 3.17都会报错



*:很奇怪 切换了3.13版本还是编译Dockerfile报错 make ,但是手动一步步在alpine:3.13镜像中可以顺利进行 编译 并且上传到harbor中
#docker commit -a "807722920@qq.com" -m "birhoff alpine" f7ea05495364 192.168.19.178/birkhoffxia/apline313-nginx-madeincontariner:v2

【Docker资源限制】
-m or --memory 2g #内存硬限制,容器只能使用给定内存大小,不能超出此值 最小4M 小于4M启动会报错
--oom-score-adj -1000 #不推荐此参数,宿主机kernel对进城使用的内存进行评分,评分最高的将被宿主机内核kill掉(越低越不容易被kill),可以指定一个容器的评分为较低的负数。
-m 512m --memory-swap 612m #实际的交换分区612-512=100 #前提需要宿主机要有交换分区 必须搭配-m
--memory-reservation 384m #软限制
--oom-kill-disable:eg:docker run -it --rm -m 512 --name msyql
--memory-swap : =-1 可以是宿主机swap的2倍,前提是宿主机开启swap分区
[内存测试]
#docker pull lorel/docker-stress-ng
#docker run -it --rm lorel/docker-stress-ng --vm 2
#docker run -it --rm -m 256m lorel/docker-stress-ng --vm 2 --vm-bytes 256M
#docker stats 查看
#宿主机 cgroup 验证:
# cat /sys/fs/cgroup/memory/docker/客器ID/memory.limit_in_bytes268435456
#宿主机基于 cgroup 对容器进行内存资源的大小限制注: 通过 echo 命今可以改内存限制的值,但是可以在原基础之上增大内存限制
缩小内存限制会报错 write error: Device or resource busy
[CPU]
1000毫核
1.5=150% #累计150%,50+30+20+10+40
docker run -it --name c1 --cpu-quota="150000" --cpu-period="100000" lorel/docker-stress-ng --vm 2
#资源限制的重点
-m or --memory 2g #硬限制内存
--cpus 1.5 #CPU最大核心数
【Docker swarm 类似于 K8S】
文章:https://blog.csdn.net/Olivier0611/article/details/123447725
【Docker compose】
1.network_mode: 不写默认使用docker-compose生成的网络,写了bridge模式 使用宿主机的docker0地址段
version: '3.6'
services:
nginx-service:
image: 192.168.19.178 /birkhoffxia/nginx : dc
network_mode: bridge
container_name: nginx-web1
expose:
- 80
- 443
ports:
- "9080:80"
- "9443:443"
tomcat-service-app1:
image: 192.168.19.178 /birkhoffxia/tomcat-xks :app1
#network_mode: bridge
container_name: tomcat-app1
expose:
- 8080
- 8443
ports:
- "8080:8080"
- "8443:8443"
tomcat-service-app2:
image: 192.168.19.178 /birkhoffxia/tomcat-xks :app2
#network_mode: bridge
container_name: tomcat-app2
expose:
- 8080
- 8443
ports:
- "8081:8080"
- "8444:8443"
docker-compose up -d :启动 生成 项目名_default 网络 eg:birkhoffxia_dockercompose_default
[root@jgharbor birkhoffxia_dockercompose] # docker network ls NETWORK ID NAME DRIVER SCOPE 78c58a6fa297 bridge bridge local ca46f04d9bd3 harbor_harbor bridge local ac22381185a1 host host local 038b41168ba0 none null local [root@jgharbor birkhoffxia_dockercompose] # docker-compose up -d Creating network "birkhoffxia_dockercompose_default" with the default driver Creating tomcat-app2 ... done Creating tomcat-app1 ... done Creating nginx-web1 ... done [root@jgharbor birkhoffxia_dockercompose] # docker network ls NETWORK ID NAME DRIVER SCOPE cc0e41a2258b birkhoffxia_dockercompose_default bridge local 78c58a6fa297 bridge bridge local ca46f04d9bd3 harbor_harbor bridge local ac22381185a1 host host local 038b41168ba0 none null local
此时 tomcat-app1/2 使用生成的网络。nginx使用宿主机的网路
2.networks : 自定义网络 生成两个网卡
version: '3.6'
services:
nginx-service:
image: 192.168.19.178 /birkhoffxia/nginx : dc
#network_mode: bridge #网络1,使用docker安装后的默认网桥
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有两块网卡
- front
- backend
container_name: nginx-web1
expose:
- 80
- 443
ports:
- "9080:80"
- "9443:443"
tomcat-service-app1:
image: 192.168.19.178 /birkhoffxia/tomcat-xks :app1
#network_mode: bridge
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有两块网卡
- front
- backend
container_name: tomcat-app1
expose:
- 8080
- 8443
ports:
- "8080:8080"
- "8443:8443"
tomcat-service-app2:
image: 192.168.19.178 /birkhoffxia/tomcat-xks :app2
#network_mode: bridge
networks: #网络2,使用自定义的网络,如果网络不存在则会自动创建该网络并分配子网,并且容器会有两块网卡
- front
- backend
container_name: tomcat-app2
expose:
- 8080
- 8443
ports:
- "8081:8080"
- "8444:8443"
networks:
front: #自定义前端服务网络
driver: bridge
backend: #自定义后端服务的网络
driver: bridge
default: #使用已经存在的docker0默认172.17.0.1/16的网络
external:
name: bridge
[root@jgharbor birkhoffxia_dockercompose] # docker-compose up -d Creating network "birkhoffxia_dockercompose_front" with driver "bridge" Creating network "birkhoffxia_dockercompose_backend" with driver "bridge" Creating tomcat-app2 ... done Creating tomcat-app1 ... done Creating nginx-web1 ... done [root@jgharbor birkhoffxia_dockercompose] # docker network ls NETWORK ID NAME DRIVER SCOPE d7a8276758c5 birkhoffxia_dockercompose_backend bridge local cc0e41a2258b birkhoffxia_dockercompose_default bridge local a5dfbf94ea86 birkhoffxia_dockercompose_front bridge local 78c58a6fa297 bridge bridge local ca46f04d9bd3 harbor_harbor bridge local ac22381185a1 host host local 038b41168ba0 none null local
此时有2张网卡
[root@jgharbor birkhoffxia_dockercompose]# docker exec -it 68638fe902d6 bash [root@68638fe902d6 /]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.22.0.2 netmask 255.255.0.0 broadcast 172.22.255.255 ether 02:42:ac:16:00:02 txqueuelen 0 (Ethernet) RX packets 12 bytes 1012 (1012.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 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.21.0.3 netmask 255.255.0.0 broadcast 172.21.255.255 ether 02:42:ac:15:00:03 txqueuelen 0 (Ethernet) RX packets 11 bytes 926 (926.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 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) 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
实战遇到的问题:
启动容器报错:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"write /proc/self/attr/keycreate: permission denied\"": unknown.
解决办法:没有关闭selinux 进行关闭解决报错。

浙公网安备 33010602011771号