部署harbor
python --version
yum -y install python2-pip
# 查看版本信息
pip list
# 更新pip
pip install --upgrade pip
pip install --upgrade pip==20.3 -i https://mirrors.aliyun.com/pypi/simple
# 安装docker-compose
pip install docker-compose --ignore-installed requests -i https://mirrors.aliyun.com/pypi/simple
pip list
docker-compose 1.26.2
# 使用脚本安装docker
脚本为:
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 重启服务
sysctl --system
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 指定镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# 执行脚本
source docker.sh
# 查看docker 的版本号
docker --version 26.1.4
# 解压软件包
tar -zxvf harbor-offline-installer-v2.11.1.tgz
cd harbor/
# 修改配置文件
vim harbor.yml
hostname: 192.168.2.51
# 注释掉https的相关服务,服务类型和端口号等
# 配置docker镜像,启动docker服务,
scp root@192.168.2.50:/etc/docker/daemon.json /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
],
"hosts":[
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
],
"insecure-registries": [
"http://192.168.2.51" # 去掉之前的5000端口
}
}
#编辑docker.service文件
vim /usr/lib/systemd/system/docker.service
13 ExecStart=/usr/bin/dockerd
# 重载配置文件
systemctl daemon-reload
# 启动服务
systemctl restart docker.service
docker --version
Docker version 26.1.4, build 5650f9b
# 执行可执行文件
./prepare
# 确保5000和80端口未被占用,并关闭防火墙
netstat -lntpu|grep 5000
netstat -lntpu|grep 80
systemctl stop firewalld
./install.sh
# 是否处于启动状态
dokcer ps -a
# 浏览器访问测试(192.168.2.51)
curl localhost:5000/v2_catalog
# 上传镜像,看libary
docker pull centos
docker images
# 打标签,推送标签
docker tag centos:latest 192.168.2.51/library/hj:v0
docker push 192.168.2.51/library/hj:v0
docker login http://192.168.2.51
Usename:admin
Password: harbor12345
#查看所有容器
docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99c3f62458f4 goharbor/nginx-photon:v2.11.1 "nginx -g 'daemon of…" 32 minutes ago Up 3 seconds (health: starting) 0.0.0.0:80->8080/tcp, :::80->8080/tcp nginx
dd3ef1a8cdfc goharbor/harbor-jobservice:v2.11.1 "/harbor/entrypoint.…" 32 minutes ago Exited (128) 3 minutes ago harbor-jobservice
8999a3b7136d goharbor/harbor-core:v2.11.1 "/harbor/entrypoint.…" 32 minutes ago Exited (128) 2 minutes ago harbor-core
444ce3ab8f55 goharbor/harbor-portal:v2.11.1 "nginx -g 'daemon of…" 32 minutes ago Exited (128) 2 minutes ago harbor-portal
8a8cd273a779 goharbor/registry-photon:v2.11.1 "/home/harbor/entryp…" 32 minutes ago Exited (128) 2 minutes ago registry
dbf40ab53516 goharbor/redis-photon:v2.11.1 "redis-server /etc/r…" 32 minutes ago Up 2 minutes (healthy) redis
59f6ebcbaa18 goharbor/harbor-registryctl:v2.11.1 "/home/harbor/start.…" 32 minutes ago Exited (128) 2 minutes ago registryctl
a7b8abe38923 goharbor/harbor-db:v2.11.1 "/docker-entrypoint.…" 32 minutes ago Exited (128) 2 minutes ago harbor-db
9cc010ff2807 goharbor/harbor-log:v2.11.1 "/bin/sh -c /usr/loc…" 32 minutes ago Up 2 minutes (healthy) 127.0.0.1:1514->10514/tcp harbor-log
#开启关闭的容器
docker start harbor-jobservice harbor-core harbor-portal registry registryctl harbor-db
harbor-jobservice
harbor-core
harbor-portal
registry
registryctl
harbor-db
# 浏览器再次访问验证:发现存在我们创建的hj镜像
#使用复制的连接,添加同时共享的镜像
docker pull 192.168.1.24/library/ddcentos@sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
192.168.1.24/library/ddcentos@sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc: Pulling from library/ddcentos
Digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
Status: Downloaded newer image for 192.168.1.24/library/ddcentos@sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
192.168.1.24/library/ddcentos@sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
# 查看被共享的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd0 db3cae3b5002 2 days ago 280MB
192.168.1.32:5000/centos_nginx v0 1c2a0901c77a 3 days ago 368MB
centos nginx 1c2a0901c77a 3 days ago 368MB
centos httpd e9a1ee725b43 6 days ago 311MB
centos yum 82ca12d9b058 6 days ago 261MB
registry latest cfb4d9904335 11 months ago 25.4MB
centos latest 5d0da3dc9764 2 years ago 231MB
192.168.1.24/library/ddcentos <none> 5d0da3dc9764 2 years ago 231MB
Docker-compose的使用
定义
1、docker compose 是 docker 官⽅的开源项⽬,负责实现对 docker 容器集群的快速编排(容器,依赖,⽹络,挂载)。compose 是 docker 公司推出的一个工具软件,可以管理多个 docker 容器组成的应⽤。
2、核心概念:Docker-compose 将管理的容器分为三层:⼯程(project)、 服务(service)、容器(container)
工程:运行compose 的⽬录下所有的⽂件,包括 dockercompose.yml、extends
文件、环境变量文件等组成⼀个⼯程,若无特殊指定工程,工程名即为当前⽬录名。工程的默认配置文件为 docker-compose.yml,可通过环境变量 COMPOSE_FILE 或 -f 参数⾃定义配置⽂件,其定义了多个有依赖关系的服务及每个服务运行的容器。
服务:一个工程中包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖等。一个服务中可包括多个容器实例。
容器:被 docker-compose 管理或部署的容器集群,调⽤ docker 服务提供的 API 来对容器进行管理,只要操作的平台支持 docker API,即可在其上进⾏ compose 的容器编排。
YAML ⽂件格式
1)yaml 是⼀种标记语⾔很直观的数据序列化格式,可读性很⾼。类似于 xml 描述性语言,语法⽐xml简单的很多。
2)yaml 数据结构通过缩进进⾏表示,连续的项⽬通过减号来表示,键值对⽤冒号分隔,数组⽤中括号括起来,hash⽤花括号括起来。
3)yaml ⽂件的基本格式由⼀系列键值对构成。每个键值对都⽤冒号“: ”分隔
key: value
对于字符串值,可以使⽤单引号或者双信号将其括起来,这样可以避免出现特殊字符或空格等问题
name: 'Meng Mr'
age: "34"
如果值包含特殊字符(如冒号或短横线),则应该使⽤引号将其括起来
description: "This is a YAML file: good for configuation files."
YAML 注意事项
1. 不⽀持制表符 tab 键缩进,需要使⽤空格缩进。
2. 通常开头缩进 2 个空格。
3. 字符后缩进 1 个空格,如:冒号,逗号,横杠。
4. ⽤ # 表示注释。
5. 如果包含特殊字符⽤单引号引起来。
6. 布尔值(true、false、yes、no、on、off)必须使⽤“”引号括起
来,这样分析器会将它们解释为字符串。
7、列表和数组
在yaml中,可以使⽤“-”符号表示⼀个列表和数组
8、嵌套数据结构
yaml⽀持嵌套数据结构,可以⽤缩进来表示不同层级之间的关系, 可使⽤ # 号表示注释信息。
person:
name: 'Meng Mr' # 两个空格,name和age是person的⼀
级⼦节点
age: "34"
address: # address是person的⼆级⼦节点
street: '123 Main St' # address节点包含了
street、city、state和zip四个⼀级⼦节点
city: 'Anytown'
state: 'CA'
zip: '12345'
docker compose 命令选项
1.build:重新构建服务
2.ps:列出容器
3.up:启动所有的docker-compose服务
4.up -d:启动所有docker-compose服务并在后台运行
5.exec:进入容器实例内部
6.:指定一个服务器启动数量
7.top:显示容器进程
8.logs:查看容器输出日志
9.down:停止并删除容器、网络、卷、镜像
10.stop:停止服务
11.start:启动服务
12.restart:重启服务
13.config:检查配置
14.config -q:检查配置,有问题才有输出
15.--version:查看版本
文件内常用指令字段
1、version :指定了Docker compose编排⽂件的版本,Docker Compose ⽬前有三个版本,分别为 Version1、Version2和Version3。
Version1 是较早的版本,它将来会被弃⽤。
Version2 是⽬前的稳定版本,⽀持更多的指令。
Version3 在功能上与 Version2 类似,但进⾏了⼀些改进和扩展,例如增加对 Docker BuildKit 的⽀持,可以加速构建过程。
version:'3'
2、service:指定了在 docker compose 编排中要运⾏的服务,每个服务都有⼀
个名称,并指定要使⽤的镜像和容器的配置选项。
services:
mysql: #服务名
# 再往下可以对该服务进⾏定义,⽐如指定映射端⼝,指定使⽤的
镜像等,但要注意缩进格式。
3、image:指定要使⽤的 docker 镜像。
services:
mysql: # 服务名
image: mysql:5.5 # 指定mysql镜像,如果主机内不存在该镜像,会从登录的docker镜像仓库内拉取,⼀般都是从dockerhub上拉取。
4、build:允许在 docker compose 编排中指定 dockerfile 的位置。
services:
mysql: # 服务名
build: /docker/mysql # 这⾥为⽤户微服务⽂件夹,⾥⾯存放的是该服务代码jar包和Dockerfile⽂件。
5、environment:指定了要设置的环境变量。
services:
mysql: # 服务名
environment: # 下⾯是MySQL环境变量的例⼦
MYSQL_ROOT_PASSWORD: 000000 # 设置MySQL的root⽤户的密码
MYSQL_DATABASE: database # 指定要创建的数据库名称
MYSQL_USER: user # 指定要创建的MySQL⽤户名
MYSQL_PASSWORD: 123 # 指定要创建的MySQL⽤户的密码
6、volumes:挂载宿主机路径或命名卷
1)指定路径挂载
services:
mysql: # 服务名
volumes:
- ./mysql/data:/var/lib/mysq # 直接指定路径挂载
2)生成 volume 卷挂载
[root@doc ~]# docker volume create mysql # ⽣成名为
mysql的volume卷
[root@doc ~]# vim docker-compose.yml
services:
mysql: # 服务名
volumes:
- mysql:/var/lib/mysq # 指定volume卷挂载
3)共享⽬录挂载
[root@doc ~]# vim docker-compose.yml
version: '2' # 使⽤共享⽬录挂载只有‘2’版本⽀持
service:
mysql: # 服务名
volumes:
- /var/lib/mysql # 将这个⽬录作为共享⽬录
nginx:
volumes:
- /usr/local/nginx/html
php:
volumes_from: # 共享⽬录来⾃
- mysql # 挂载的共享⽬录,挂载后会在容器内⽣成与
被挂载的⽬录同名的路径
- nginx # 共享挂载可以是⼀个列表
7、port:指定了要宿主机映射到容器的端⼝,端⼝不能低于 60(宿主机端口:容器端口),如果选择的端⼝号低于 60,可能会与系统保留的知名端⼝冲突。
services:
mysql: # 服务名
ports:
- 3306:3306 # 宿主机端⼝:容器端⼝
8、expose:⽤于在 docker 容器内部暴露端⼝的选项
services:
mysql: # 服务名
expose:
- 3306
9、networks:加⼊⽹络,引⽤顶级 networks条⽬。
networks: # 与services同级
dev: # ⾃定义或已存在的⽹络设备名
driver: bridge # 设备类型:⽹桥
external: true # 外部存在:是
10、hostname:设定容器主机名
services:
mysql: # 服务名
hostname: mysql
11、command:指定容器启动时要运⾏的命令,覆盖构建时的默认命令
services:
mysql: #服务名
command: --character-set·server=utf8
##需要定义⼀个 YAML 格式的配置⽂件 docker-compose.yml,写好多个容器间的调⽤关系。
使用 compose 的步骤
1)使⽤ Dockerfile 定义各个微服务应⽤并构建出对应的镜像⽂件Dockerfile的使⽤,以便可以在任何地⽅复制。
2)使⽤ docker-compose.yml 定义⼀个完整的业务单元,安排好整体应⽤中的各个容器服务。
3)最后,执⾏ docker-compose up 命令来启动并运⾏整个应⽤程序,完成⼀键部署。
docker-compose 实例
1、下载pip
[root@localhost ~]#yum -y install python2-pip
2、升级pip到最新版本
[root@localhost ~]#pip install --upgrade pip
3、指定版本号
[root@localhost ~]#pip install --upgrade pip==20.3 -i Simple Inde
4、使用pip安装docker-compose
[root@localhost ~]#pip install docker-compose -i Simple Index rz waiting to receive.
5、安装docker
[root@localhost ~]#lsanaconda-ks.cfg docker.sh
[root@localhost ~]#source docker.sh
[root@localhost ~]#scp root@192.168.2.51:/etc/docker/daemon.json /etc/docker/
# 编辑daemon.json 文件
[root@localhost ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
],
"hosts":[
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
],
"insecure-registries": [
"http://192.168.2.51"
]
}
[root@localhost ~]#vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd
# 加载并重启
[root@localhost ~]#systemctl daemon-reload
[root@localhost ~]#systemctl start docker
# 创建测试目录test,该目录是⼀个:(project)⼯程
[root@localhost ~]#mkdir test
[root@localhost ~]#cd test/
[root@localhost test]#cat docker-compose.yml # 这里⽂件名称是固定不变的
version: "3" # 指定⽂件版本
services:
nginx: # 这是service名
container_name: nginx01 # 这是容器名
image: nginx:latest
ports:
- "8001:80" # 端⼝映射
volumes:
- /www/wwwroot/8001:/usr/share/nginx/html # 挂
载
hostname: nginx.test.com # 容器主机名
nginx-php: # 第⼆个service服务名称
container_name: nginx02 # 第⼆个容器的名称
image: nginx:latest
ports:
- "8002:80"
volumes:
- /www/wwwroot/8002:/usr/share/nginx/html
hostname: nginx-php.test.com
# 创建数据卷⽬录
[root@localhost ~]#mkdir html
[root@localhost ~]#echo "我是被编排的nginx" > ./html/index.html
tree
.
└── html
└── index.html
1 directory, 1 file
# 创建yml文件
vim docker-compose.yml
version: "3"
services:
nginx:
container_name: c1
image: "nginx:latest"
ports:
- "80:80"
volumes:
- /root/test/html/:/usr/share/nginx/html/
# 启动 compose 集群,要在 docker-compose.yml ⽂件所在的⽬录下才能通过
docker compose up -d # 启动⼯程后会根据指定的容器名称,⽣成对应的容器
[+] Running 3/3
✔ Network test_default Created 0.1s
✔ Container nginx02 Started 0.1s
✔ Container nginx01 Started 0.1s
# 访问测试
[root@localhost test]# curl 192.168.15.3:8001
8001
[root@localhost test]# curl 192.168.15.3:8002
80026
# 删除集群中的容器
rm 命令只能删除已经停⽌的容器
docker compose ps -a #
# 查看docker-compose的所有容器
NAME IMAGE COMMAND
SERVICE CREATED
STATUS PORTS
nginx01 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx 3 minutes
ago Up 3 minutes 0.0.0.0:8001->80/tcp,
:::8001->80/tcp
nginx02 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx-php 3 minutes
ago Up 3 minutes 0.0.0.0:8002->80/tcp,
:::8002->80/tcp
[root@localhost test]# docker compose stop nginx01
# 以容器名关闭compose失败
no such service: nginx01
[root@localhost test]# docker compose stop nginx
# 必须使⽤service关闭docker-compose
[+] Stopping 1/1
✔ Container nginx01 Stopped 强制删除
[root@localhost test]# docker compose rm #删除容
器,不需要指定容器名称
? Going to remove nginx01 Yes
[+] Removing 1/0
✔ Container nginx01 Removed
0.0s
[root@localhost test]# docker compose rm #再次删
除找不到容器,因为没有停⽌的容器
No stopped containers
[root@localhost test]# docker compose ps #查看运⾏
的容器,⽬前只有⼀个nginx02
NAME IMAGE COMMAND
SERVICE CREATED
STATUS PORTS
nginx02 nginx:latest "/docker-entrypoint.sh
nginx -g 'daemon off;'" nginx-php 6 minutes
ago Up 6 minutes 0.0.0.0:8002->80/tcp,
:::8002->80/tcp