一、Namespace和cgroup介紹
1.1 Namespace
????Namespace是linux系統(tǒng)的底層概念,在內(nèi)核層實現(xiàn),用于提供容器獨立的運行空間;分為MNT Namespace、IPC Namespace、UTS Namespace、PID Namespace、Net Namespace、User Namespace。
MNT Namespace:提供磁盤掛載點和文件系統(tǒng)的隔離能力;每個容器都要有獨立的根文件系統(tǒng),有獨立的用戶空間,以實現(xiàn)在容器里面啟動服務(wù)并且使用容器的運行環(huán)境,即一個宿主機是Ubuntu的服務(wù)器,可以在里邊啟動一個centos運行環(huán)境的容器并且在容器里面啟動一個Nginx服務(wù),此Nginx運行時使用的運行環(huán)境就是centos系統(tǒng)目錄的運行環(huán)境,但是在容器里面不能訪問宿主機的資源,宿主機是使用了chroot技術(shù)把容器鎖定到一個指定的運行目錄里面并作為容器的根運行環(huán)境。
IPC Namespace:提供進程間通信的隔離能力;允許容器內(nèi)的不同進程的訪問。
UTS Namespace:提供主機名隔離能力;用于系統(tǒng)標識,其中包含hostname和域名domainname,它使得一個容器擁有屬于自己hostname標識,這個主機名標識獨立于宿主機系統(tǒng)和其上的其他容器。
PID Namespace:提供進程隔離能力;多個容器的進程如PID編號,容器內(nèi)的主進程生成與回收子進程等。
Net Namespace:提供網(wǎng)絡(luò)隔離能力;docker使用network啟動一個vethX接口,這樣你的容器將擁有它自己的橋接ip地址,通常是docker0,而docker0實質(zhì)就是Linux的虛擬網(wǎng)橋,網(wǎng)橋是在OSI七層模型的數(shù)據(jù)鏈路層的網(wǎng)絡(luò)設(shè)備,通過mac地址對網(wǎng)絡(luò)進行劃分,并且在不通網(wǎng)絡(luò)直接傳遞數(shù)據(jù)。
User Namespace:提供用戶隔離能力;允許在各個宿主機的各個容器空間內(nèi)創(chuàng)建相同的用戶以及相同的用戶UID和GID,會把用戶的操作范圍限制在每個容器內(nèi),不同容器文件系統(tǒng)相互獨立。
1.2 cgroup
????cgroup的主要作用就是限制一個進程能夠使用的資源上限,包括CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)帶寬等等,還能夠?qū)M程優(yōu)先級設(shè)置,以及將進程掛起和恢復(fù)等操作。
blkio: 塊設(shè)備IO限制
CPU: 使用調(diào)度程序為cgroup任務(wù)提供cpu的訪問
cpuacct:產(chǎn)生cgroup任務(wù)的cpu資源報告。
cpuset:如果是多核心的cpu,這個子系統(tǒng)會為cgroup任務(wù)分配單獨的cpu和內(nèi)存。
devices:允許或拒絕cgroup任務(wù)對設(shè)備的訪問。
freezer:暫停和恢復(fù)cgroup任務(wù)。
memory:設(shè)置每個cgroup的內(nèi)存限制以及產(chǎn)生內(nèi)存資源報告。
net_cls:標記每個網(wǎng)絡(luò)包以供cgroup方便使用。
ns:命名空間子系統(tǒng)。
perf_event:增加了對每個cgroup的監(jiān)測跟蹤的能力,可以監(jiān)測屬于某個特定cgroup的所有線程以及運行在特定CPU上的線程。
二、docker的安裝
環(huán)境準備
- 主機系統(tǒng):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壓縮包并設(shè)置為開機自啟動
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常用命令介紹
- 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 # 創(chuàng)建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 # 創(chuàng)建一個新容器不運行
- docker exec
docker exec -i -t CONTAINER bash # 在運行中的容器執(zhí)行命令
- 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 # 列出最近創(chuàng)建的容器(包括所有狀態(tài))
docker ps -l # 列出最近創(chuàng)建的一個容器
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] # 為源鏡像創(chuàng)建新的標簽
- docker top
docker top CONTAINER # 列出容器中運行的進程信息
- docker version
docker version # 列出docker版本信息
四、部署單機Harbor
環(huán)境準備
- 主機系統(tǒng):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,設(shè)置一個admin用戶的密碼
- 修改第47行 data_volume,修改harbor的數(shù)據(jù)目錄
- 修改第120行 location,修改harbor的日志目錄
啟動harbor
bash install.sh
docker-compose ps

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的容器狀態(tài)都成為running (healthy)再登陸,不然可能會登陸失敗

五、部署基于負載均衡的Harbor高可用
環(huán)境準備
- 主機系統(tǒng):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 創(chuàng)建項目并添加復(fù)制策略
????兩個harbor添加方式一樣
-
點擊項目,新建項目,項目類型選擇公開,點擊確定
create project.jpg -
點擊系統(tǒng)管理,倉庫管理,新建目標,驗證遠程證書去掉勾選,輸入目標URL和用戶名密碼后,點擊測試連接,顯示測試連接成功,點擊確定
create registry.jpg -
點擊系統(tǒng)管理,復(fù)制管理,新建規(guī)則,復(fù)制模式選擇默認的Push-based,觸發(fā)模式選擇事件驅(qū)動,勾選刪除本地資源時同時也刪除遠程的資源,點擊確定
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

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

- 停掉一個harbor拉取鏡像測試
docker-compose stop
docker-compose ps
docker pull HARBOR_VIP:PORT/PROJECT/alpine:latest

- 停掉兩個harbor拉取鏡像測試
docker-compose stop
docker-compose ps
docker pull HARBOR_VIP:PORT/PROJECT/alpine:latest

-
起一個harbor拉取鏡像測試
start one pull image.jpg
????搭建完成,完結(jié)撒花????。?!



