Docker安装和Harbor高可用部署
一、Namespace和cgroup介绍
1.1 Namespace
Namespace是linux系统的底层概念,在内核层实现,用于提供容器独立的运行空间;分为MNT Namespace、IPC Namespace、UTS Namespace、PID Namespace、Net Namespace、User Namespace。
-
MNT Namespace:提供磁盘挂载点和文件系统的隔离能力;每个容器都要有独立的根文件系统,有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是Ubuntu的服务器,可以在里边启动一个centos运行环境的容器并且在容器里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里面不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面并作为容器的根运行环境。
-
IPC Namespace:提供进程间通信的隔离能力;允许容器内的不同进程的访问。
-
UTS Namespace:提供主机名隔离能力;用于系统标识,其中包含hostname和域名domainname,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。
-
PID Namespace:提供进程隔离能力;多个容器的进程如PID编号,容器內的主进程生成与回收子进程等。
-
Net Namespace:提供网络隔离能力;docker使用network启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,通常是docker0,而docker0实质就是Linux的虚拟网桥,网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不通网络直接传递数据。
-
User Namespace:提供用户隔离能力;允许在各个宿主机的各个容器空间内创建相同的用户以及相同的用户UID和GID,会把用户的操作范围限制在每个容器内,不同容器文件系统相互独立。
1.2 cgroup
cgroup的主要作用就是限制一个进程能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等,还能够对进程优先级设置,以及将进程挂起和恢复等操作。
-
blkio: 块设备IO限制
-
CPU: 使用调度程序为cgroup任务提供cpu的访问
-
cpuacct:产生cgroup任务的cpu资源报告。
-
cpuset:如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
-
devices:允许或拒绝cgroup任务对设备的访问。
-
freezer:暂停和恢复cgroup任务。
-
memory:设置每个cgroup的内存限制以及产生内存资源报告。
-
net_cls:标记每个网络包以供cgroup方便使用。
-
ns:命名空间子系统。
-
perf_event:增加了对每个cgroup的监测跟踪的能力,可以监测属于某个特定cgroup的所有线程以及运行在特定CPU上的线程。
二、docker的安装
环境准备
- 主机系统:Ubuntu 20.04
- docker二进制版本:docker-20.10.9.tgz
2.1 修改主机资源配置文件:
cat >> /etc/security/limits.conf <<EOF
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000
EOF
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
vm.max_map_count=262144
kernel.pid_max=4194303
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets=6000
net.netfilter.nf_conntrack_max=2097152
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF
2.2 解压docker压缩包并设置为开机自启动
tar xf docker-20.10.9.tgz # 需要先上传包
cp docker/* /usr/bin
cp containerd.service /lib/systemd/system/containerd.service
cp docker.service /lib/systemd/system/docker.service
cp docker.socket /lib/systemd/system/docker.socket
groupadd -r test
groupadd -r docker # 如果不添加docker组,docker起不来
useradd -r -m -g test test
usermod test -G docker
systemctl enable containerd.service && systemctl restart containerd.service
systemctl enable docker.service && systemctl restart docker.service
systemctl enable docker.socket && systemctl restart docker.socket
2.3 docker启动
docker.jpg三、Docker常用命令介绍
- docker image
docker image ls # 列出镜像,等同于docker images
docker image history IMAGE # 查看镜像历史信息
docker image inspect IMAGE # 查看镜像详细信息
docker image load -i *.tar.gz # 加载镜像,等同于docker load
docker image prune # 删除没有使用的镜像
docker image pull IMAGE # 拉取镜像,等同于docker pull
docker image rm IMAGE # 删除镜像,等同于docker rmi
docker image save IMAGE -o IMAGE.tar.gz # 保存镜像为tar包,等同于docker save
docker image tag IMAGE newIMAGE # 为镜像打标签
- docker system
docker system df # 查看docker使用磁盘信息
docker system events # 查看实时事件信息
docker system info # 查看docker信息,等同于docker info
docker system prune # 删除没有使用的镜像
- docker volume
docker volume create # 创建docker卷
docker volume inspect VOLUME # 查看docker卷详细信息
docker volume ls # 列出docker卷
docker volume prune # 删除没有使用的本地卷
docker volume rm VOLUME # 删除docker卷
- docker build
docker build -t IMAGE . # 指定tag打镜像
docker build -f PATH . # 指定Dockerfile文件的位置打镜像
- docker cp
docker cp CONTAINER:SRC_PATH DEST_PATH # 从容器拷贝文件到宿主机
docker cp SRC_PATH CONTAINER:DEST_PATH # 从宿主机拷贝文件到容器
- docker create
docker create IMAGE # 创建一个新容器不运行
- docker exec
docker exec -i -t CONTAINER bash # 在运行中的容器执行命令
- docker images
docker images -a # 列出镜像信息,等同于docker images
docker images -q # 只列出镜像id列
- docker info
docker info # 查看docker信息
- docker inspect
docker inspect CONTAINER # 查看容器详细信息
docker inspect -s CONTAINER # 比容器详细信息多文件大小信息
- docker kill
docker kill container # 杀掉正在运行的容器
- docker load
docker load -i *.tar.gz # 加载镜像
- docker login
docker login HARBOR_IP:PORT -uUSER -pPASSWORD # 指定harbor地址、用户、密码,登陆harbor
- docker logout
docker logout HARBOR_IP:PORT # 从镜像仓库中退出登陆
- docker logs
docker logs -f CONTAINER # 实时查看容器日志
docker logs -t CONTAINER # 列出容器日志时间戳
- docker ps
docker ps # 列出正在运行的容器
docker ps -a # 列出所有容器
docker ps -n N # 列出最近创建的容器(包括所有状态)
docker ps -l # 列出最近创建的一个容器
docker ps -q # 列出正在运行容器的容器id
docker ps -s # 多列出容器文件总大小
- docker pull
docker pull IMAGE # 拉取镜像
- docker push
docker push IMAGE # 推送镜像
- docker restart
docker restart CONTAINER # 重启容器
- docker rm
docker rm CONTAINER # 删除容器
docker rm -f # 强制删除容器
- docker rmi
docker rmi IMAGE # 删除镜像
- docker run
docker run -itd IMAGE # 后台运行容器
- docker save
docker save IMAGE -o IMAGE.tar.gz # 保存镜像并指定压缩包名字
- docker search
docker search IMAGE # 在Docker Hub中搜索镜像
- docker start
docker start CONTAINER # 启动停止的容器
- docker stats
docker stats # 列出正在运行容器的资源使用信息
docker stats -a # 列出所有容器的资源使用信息
- docker stop
docker stop CONTAINER # 停止运行中的容器
- docker tag
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] # 为源镜像创建新的标签
- docker top
docker top CONTAINER # 列出容器中运行的进程信息
- docker version
docker version # 列出docker版本信息
四、部署单机Harbor
环境准备
- 主机系统:Ubuntu 18.04
- docker二进制版本:docker-20.10.9.tgz
- harbor版本:harbor-offline-installer-v2.4.1.tgz
- docker-compose版本:v2.2.2
4.1 安装docker-compose
mv docker-compose-linux-x86_64 docker-compose # 需要先上传包
cp docker-compose /usr/bin/
chmod +x /usr/bin/docker-compose
4.2 安装harbor
tar xvf harbor-offline-installer-v2.4.1.tgz # 需要先上传包
chmod +x prepare install.sh common.sh
docker load < harbor.v2.4.1.tar.gz
cp harbor.yml.tmpl harbor.yml
修改harbor.yml文件
- 修改第五行 hostname 为主机ip或域名
- 注释第13行 https
- 注释第15行 port: 443
- 修改第34行 harbor_admin_password,设置一个admin用户的密码
- 修改第47行 data_volume,修改harbor的数据目录
- 修改第120行 location,修改harbor的日志目录
启动harbor
bash install.sh
docker-compose ps
docker-compose ps.jpg
4.3 修改harbor地址为可信任源
cat >> /etc/docker/daemon.json <<EOF
{
"insecure-registries": ["HARBOR_IP"]
}
EOF
systemctl restart docker
docker-compose up -d
docker login HOSTNAME -uadmin # 要等harbor的容器状态都成为running (healthy)再登陆,不然可能会登陆失败
docker login.jpg
五、部署基于负载均衡的Harbor高可用
环境准备
- 主机系统:Ubuntu 18.04 *2
- docker二进制版本:docker-20.10.9.tgz
- harbor版本:harbor-offline-installer-v2.4.1.tgz
- docker-compose版本:v2.2.2
- haproxy版本:haproxy-2.4.10.tar.gz
- lua版本:lua-5.4.3.tar.gz
5.1 创建项目并添加复制策略
两个harbor添加方式一样
-
点击项目,新建项目,项目类型选择公开,点击确定
create project.jpg -
点击系统管理,仓库管理,新建目标,验证远程证书去掉勾选,输入目标URL和用户名密码后,点击测试连接,显示测试连接成功,点击确定
create registry.jpg -
点击系统管理,复制管理,新建规则,复制模式选择默认的Push-based,触发模式选择事件驱动,勾选删除本地资源时同时也删除远程的资源,点击确定
add duplicate.jpg
5.2 部署haproxy
由于需要haproxy需要用到lua,所以要先下载lua并编译
apt install gcc make libreadline-dev libsystemd-dev zlib1g-dev libpcre3 libpcre3-dev libssl-dev
curl -R -O http://www.lua.org/ftp/lua-5.4.3.tar.gz
tar zxf lua-5.4.3.tar.gz
cd lua-5.4.3
make all test
tar xf haproxy-2.4.10.tar.gz # 需要先上传包
cd haproxy-2.4.10
make ARCH=x86_64 TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1 \
USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.4.3/src LUA_LIB=/usr/local/src/lua-5.4.3/src \
prefix=/usr/local/haproxy # 注意修改lua源码目录
make install PREFIX=/usr/local/haproxy
cp haproxy /usr/sbin/
cat >> /lib/systemd/system/haproxy.service <<EOF
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
EOF
useradd haproxy -s /sbin/nologin
mkdir -p /var/lib/haproxy/
cat >> /etc/haproxy/haproxy.cfg <<EOF
global
chroot /usr/local/haproxy
user haproxy
group haproxy
maxconn 5000
daemon
pidfile /var/lib/haproxy/haproxy.pid
stats socket /tmp/haproxy-fe.sock mode 666 level admin
defaults
log global
mode http
option httplog
option dontlognull
option httpclose
retries 3
maxconn 4000
timeout connect 5000
timeout client 50000
timeout server 50000
listen stats
mode http
bind *:8001
stats uri /
stats admin if TRUE
stats refresh 10s
listen harbor_ha
bind HARBOR_VIP:PORT
mode http
balance source
server harbor1 HARBOR1_IP:PORT check inter 2s fall 3 rise 5
server harbor2 HARBOR2_IP:PORT check inter 2s fall 3 rise 5
EOF
systemctl start haproxy
vim /etc/docker/daemon.json
{
"insecure-registries":["HARBOR_VIP:PORT"]
}
systemctl restart docker
docker-compose start
docker login HARBOR_VIP:PORT -uadmin
docker login.jpg
5.3 测试harbor的高可用
- 推送一个镜像
docker pull alpine:latest
docker tag alpine HARBOR_VIP:PORT/PROJECT/alpine:latest
docker push HARBOR_VIP:PORT/PROJECT/alpine:latest
- 拉取镜像测试
docker pull HARBOR_VIP:PORT/PROJECT/alpine:latest
pull image.jpg
- 停掉一个harbor拉取镜像测试
docker-compose stop
docker-compose ps
docker pull HARBOR_VIP:PORT/PROJECT/alpine:latest
pull image.jpg
- 停掉两个harbor拉取镜像测试
docker-compose stop
docker-compose ps
docker pull HARBOR_VIP:PORT/PROJECT/alpine:latest
stop two pull image.jpg
-
起一个harbor拉取镜像测试
start one pull image.jpg
搭建完成,完结撒花❀❀❀!!!