1 Docker相关介绍
LXC --Linux container托管在GitHub,基于go语言并遵从apache2.0协议
Docker repository : store images
Docker components:
Client : Docker client
Server :docker daemon 的主要成分,接收client请求,按路由规则实现路由转发
Docker image : container stoper
Docker container :docker image run as container
Docker 基本结构原理
空白层优先级大于下层,image采用共享底层技术
采用分层存储,最多能到128层,下载新的image,如果某一层和已有的相同,则跳过
2 Docker installation
Docker 的三种安装方式:
script 脚本安装
yum 源安装
rpm 包安装
script
[root@node1 docker]# yum update
[root@node1 docker]# curl -sSL https://get.docker.com/ | sh
[root@node1 docker]# systemctl start docker
[root@node1 docker]# systemctl enable docker
[root@node1 docker]# docker run hello-world
yum
cat >/etc/yum.repos.d/docker.repo <<-EOF
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg EOF
yum install docker
本次实验采用第三种安装方式:即 rpm包安装
- 先到官网下载docker rpm 包,下载版本:17.0.3
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
2. 首先检查selinux 和 firewalld是否已经禁止,如果防火墙打开,可能对后续实验造成影响,且不好找到原因。
#检查防火墙是否关闭
[root@node1 docker]# systemctl status firewalld
[root@node1 docker]# getselinux
#安装iptables
[root@node1 docker]# yum -y install iptables-services
[root@node1 docker]# systemctl start iptables
[root@node1 docker]# systemctl enable iptables
#清空防火墙规则
[root@node1 docker]# iptables -F
#保存默认规则
[root@node1 docker]# service iptables save
#更新系统内核
[root@node1 docker]# yum update
- 上传docker 安装包到docker 目录,安装并启动docker
[root@node1 /]# mkdir docker
[root@node1 docker]# yum -y install *
[root@node1 docker]# systemctl start docker
[root@node1 docker]# systemctl status docker
- 验证docker 是否安装启动成功
[root@node1 docker]# docker run hello-world # Hello-world是镜像名,不加版本号则获取最新版本
- Docker 加速配置
[root@node1 docker]# cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
[root@node1 docker]# chmod a+x /etc/systemd/system/docker.service
[root@node1 docker]# vim /etc/systemd/system/docker.service
在内容种增加ExecStart=/usr/bin/dockerd --registry-mirror=https://dh0xuqe2.mirror.aliyuncs.com
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target firewalld.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --registry-mirror=https://dh0xuqe2.mirror.aliyuncs.com
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
Aliyun镜像加速地址需要到aliyun官网进行申请,每个账号会得到唯一的id,也可以使用别人的,这个是免费申请使用,这是我申请的link:https://dh0xuqe2.mirror.aliyuncs.com, 检查是否配置成功
[root@node1 docker]# systemctl daemon-reload
[root@node1 docker]# systemctl restart docker
[root@node1 docker]# ps -ef |grep docker
出现mirror镜像地址,则表示加速配置成功。
2.1 Docker 应用实验:使用docker 安装运行wordpress
- 下载镜像
[root@node1 docker]# docker pull wordpress
[root@node1 docker]# docker pull mariadb
[root@node1 docker]# docker images //查看已经下载的镜像
- 运行镜像mariadb 和wordpress
#命令解释:运行镜像为mariadb, --name db 取名为db, MYSQL_ROOT_PASSWORD=example 设置密码为example,-d 放后台运行 mariadb:镜像名称
[root@node1 docker]# docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
720598be5d6b8a5b12659fa4ee2f1727feeee07887813149e0cefbbb88b13f08
#命令解释:运行镜像为wordpress, --name MyWordPress取名为MyWordPress, --link db:mysql连接到mariadb数据库,取别名为mysql,-p 8080:80 将本机8080端口映射到docker80端口 -d 放后台运行 wordpress:镜像名称
[root@node1 docker]# docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
e9dd98be8031653bedfe5e4957e65854ef66285feda7b529a793cdd9d79e530f
#查看运行情况
[root@node1 docker]# ps -ef |grep docker //查看运行情况
- 验证:浏览器访问
http://192.168.1.10:8080,按流程安装后,可以正常login wordpress blog
至此,docker 应用体验完成!看起来so easy, 比直接虚拟机安装方便。
3 Docker-compose
容器编排工具,允许用户在一个模板(yaml文件)中定义一组相关联的容器,会更具—link参数,对启动的优先级进行排序。
下载docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.17.1/docker-compose-uname -s
-uname -m
> /usr/local/bin/docker-compose
从国内的资源,下载较快
[root@node1 bin]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
[root@node1 bin]# docker-compose –version
docker-compose version 1.17.1, build 6d101fb
docker compose旨在通过将多服务的构建和依赖关系都编写在docker-compose.yml中,通过docker-compose命令,即可完成对整个服务集群的启动,关闭等操作。大部分的compose命令都需要到docker-compose.yml文件所在的目录下才能执行。
docker-compose up --命令聚合每个容器的输出,命令退出时,所有容器都将停止。
docker-compose up -d --在后台启动容器并使它们保持运行。
docker-compose logs -f --查看该容器的启动的日志打印(日志从头打印)。
docker logs -f container_id --查看某一容器的启动的日志打印(日志从头打印)。
docker logs -f --tail 数量词 container_id à查看某一容器的启动的日志打印(查看最后n条日志打印)。 例:docker logs -f --tail 50 44b
docker-compose stop --停止compose服务。
docker-compose restart --重启compose服务。
docker-compose kill --kill compose服务。
docker-compose ps --查看compose服务状态。
docker-compose rm --删除compose服务。
写一个简单的docker-compose.yml 文件
version: '2'
services:
db:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWOR=wordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
执行docker中的yml命令报错时 一定要看清楚,yml的严格的格式书写要求:要求每个冒号 和每个 - 符号后面必须有一个空格
[root@node1 docker]# docker-compose up -d
可能出现错误
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.db: 'MYSQL_ROOT_PASSWORD'
Unsupported config option for services.wordpress: 'WORDPRESS_DB_HOST'
services.db.environment contains an invalid type, it should be an object, or an array
services.wordpress.environment contains an invalid type, it should be an object, or an array
将原来的所有这样格式的内容 WORDPRESS_DB_PASSWORD: wordpress 改为此格式 - WORDPRESS_DB_PASSWORD=wordpress, 报错消失。
这样的错误也是格式不对导致
4 Docker基础概念及命令
Docker 的三个重要概念: 仓库 repository,镜像 image, 容器 container
Docker指令基本用法:
Docker +命令关键字 + 一系列参数
Docker info 守护进程的系统资源设置
Docker search //docker 仓库的查询
Docker pull // docker 仓库的下载
Docker images // docker 镜像的查询
这里看到的size不是镜像的实际大小,因为docker 分层共享,而这里展示的是完整镜像大小,实际值小于等于这里的显示值
Docker rmi // docker 镜像的删除
用法: docker rmi imageName:version 或 docker rmi imageID
Docker ps //查看当前运行的容器, 加 -a 可以查看所有容器,包括停止的容器
Docker rm // 删除停止的容器,加 -f 强制删除
Docker run // 容器的创建启动
可以一次删除所有容器,操作方法:
[root@node1 docker]# docker ps -a -q // 只显示容器的ID
[root@node1 docker]# docker rm -f $(docker ps -a -q)
容器管理
每个容器创建后,都会分配一个container id 作为唯一标识,后续对容器的启停,修改删除都可以通过这个ID来完成,
docker ps --no-trunc //查看,这个命令会展示container 完整的128 位ID
Docker start/stop container ID // 容器启动停止
Docker start/stop container alias name
docker inspect container alias name // 查看容器所有基本信息
docker logs container alias name // 查看容器log
docker stats container alias name // 查看容器占用的系统资源
docker stats //不加参数,显示所有容器系统资源占用情况
docker exec 容器名 容器内执行的命令 //容器执行命令
docker exec -it 容器名 /bin/bash //登入容器的bash,相当于进入交互模式
exit 推出交互模式
--restart=always //容器的自动启动, docker 重启后,容器自动运行
-h x.xx.xxx //设置容器的主机名
--dns xx.xx.xx.xx //设置容器使用的dns
--dns-search //dns 搜索设置
--add-host hostname:ip //注入hostname <> IP 解析
[root@node1 ~]# docker run --name MyWordPress2 --restart=always --add-host www.lidepic.com:192.168.1.10 --link db1:mysql -p 8081:80 -d wordpress
--rm //服务停止时自动删除
[root@node1 ~]# docker run --name MyWordPress3 --rm --link db1:mysql -p 8084:80 -d wordpress
容器MyWordPress3停止后将会被自动删除。
5 镜像仓库管理
5.1 docker 镜像管理
容器创建时要指定image,每个image有一个唯一的id,和container id 一样,默认128位,可以使用前16位缩写形式,也可以使用镜像名和版本号来组合唯一标识,省略版本号则使用latest
镜像分层:docker 的镜像通过联合文件系统ufs将各层文件系统叠加在一起
bootfs : 用于系统引导的文件系统,包括bootloader 和kernel,容器启动完成后会被卸载以节省内存资源
rootfs : 位于bootfs之上,表现为docker 容器的根文件系统
传统模式中,系统启动时,内核挂载bootfs会将器挂载为只读模式,完整性自检完成后将其挂载为读写模式
docker中,由内核挂载为只读模式,而通过ufs技术挂载一个可写层
已有的分层只能读,不能修改
上层镜像优先级大于底层镜像
5.2 DockerFile
1, 容器 > 镜像 : docker commit CID -t xxx.xx.xx
需要至少一个工作在前台的守护进程
#下载centos 镜像
[root@node1 docker]# systemctl start docker
[root@node1 docker]# docker pull centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:7
[root@node1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest a05fd91ad06a 10 days ago 550 MB
nginx latest f6d0b4767a6c 11 days ago 133 MB
mariadb latest 3a348a04a815 8 weeks ago 407 MB
centos 7 8652b9f0cb4c 2 months ago 204 MB
#启动centos 镜像
[root@node1 docker]# docker run --name test centos:7
#查看容器,由于无前台守护进程,启动即退出
[root@node1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1e9932535db centos:7 "/bin/bash" 33 seconds ago Exited (0) 33 seconds ago test
2, DockerFile
dockerfile 是一种被docker程序解释的脚本。dockerfile由一条条指令组成,每条指令对应linux下的一条命令。docker程序将这些指令翻译成真正的linux命令。
生成命令: docker build -t xxxx
最多不超过****128层
Sample : wordpress/php7.1/fpm-alpine/Dockerfile
FROM php:7.1-fpm-alpine
# docker-entrypoint.sh dependencies
RUN apk add --no-cache
# in theory, docker-entrypoint.sh is POSIX-compliant, but priority is a working, consistent image
bash
# BusyBox sed is not sufficient for some of our sed expressions
sed
# install the PHP extensions we need
RUN set -ex;
apk add --no-cache --virtual .build-deps
libjpeg-turbo-dev
libpng-dev
;
docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr;
docker-php-ext-install gd mysqli opcache;
runDeps="$(
scanelf --needed --nobanner --recursive
/usr/local/lib/php/extensions
| awk '{ gsub(/,/, "
so:", $2); print "so:" $2 }'
| sort -u
| xargs -r apk info --installed
| sort -u
)";
apk add --virtual .wordpress-phpexts-rundeps $runDeps;
apk del .build-deps
# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN {
echo 'opcache.memory_consumption=128';
echo 'opcache.interned_strings_buffer=8';
echo 'opcache.max_accelerated_files=4000';
echo 'opcache.revalidate_freq=2';
echo 'opcache.fast_shutdown=1';
echo 'opcache.enable_cli=1';
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
VOLUME /var/www/html
ENV WORDPRESS_VERSION 4.8.1
ENV WORDPRESS_SHA1 5376cf41403ae26d51ca55c32666ef68b10e35a4
RUN set -ex;
curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz";
echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -;
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
tar -xzf wordpress.tar.gz -C /usr/src/;
rm wordpress.tar.gz;
chown -R www-data:www-data /usr/src/wordpress
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm"]
简单的Dockerfile 内容
FROM hub.c.163.com/public/centos
ADD ./apache-tomcat-9.0.40.tar.gz /root
ADD ./jdk-8u271-linux-x64.tar.gz /root
ENV JAVA_HOME /root/jdk1.8.0_271
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080
ENTRYPOINT /root/apache-tomcat-9.0.40/bin/startup.sh && tailf /root/apache-tomcat-9.0.40/logs/catalina.outDockerfile
Dockerfile指令解释
FROM #基础镜像,一切从这里开始
MAINTAINER #镜像作者姓名、邮箱
RUN #镜像构建时需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包,添加内容
WORKDIR #镜像工作的目录
VOLUME #挂载卷的目录
EXPOST #暴露端口位置
CMD #指定这个容器启动时要运行的命令,只有最后一个命令会生效,可被替代
ENTRYPOINT #指定这个容器启动时要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 Dockerfile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建时设置环境变量
创建镜像并启动验证
#创建镜像
[root@node1 docker]# docker build -t tomcat:v1.0 .
Sending build context to Docker daemon 19.55 MB
Step 1/7 : FROM hub.c.163.com/public/centos
latest: Pulling from public/centos
96057de2d572: Pull complete
…
5881bc109689: Pull complete
Digest: sha256:75a27ccbfdef28456d98134cf04f2f41f76b435d9e62c678c6791af467d6b1b0
Status: Downloaded newer image for hub.c.163.com/public/centos:latest
---> 997f0ed97903
Step 2/7 : ADD ./apache-tomcat-9.0.40.tar.gz /root
---> e7ecdd273d8c
Removing intermediate container 748e6709f0d3
Step 3/7 : ADD ./jdk-8u271-linux-x64.tar.gz /root
---> 3e6e168f8156
Removing intermediate container d9dfff383328
Step 4/7 : ENV JAVA_HOME /root/jdk1.8.0_271
---> Running in 8d576461d014
---> 13c68e3592cc
Removing intermediate container 8d576461d014
Step 5/7 : ENV PATH $JAVA_HOME/bin:$PATH
---> Running in b83238baaae0
---> fb6bc66ca738
Removing intermediate container b83238baaae0
Step 6/7 : EXPOSE 8080
---> Running in 4e9aea213e43
---> 4d416cd48b49
Removing intermediate container 4e9aea213e43
Step 7/7 : ENTRYPOINT /root/apache-tomcat-9.0.40/bin/startup.sh && tailf /root/apache-tomcat-9.0.40/logs/catalina.out
---> Running in dab5f9371ca7
---> 45c8e9694a5f
Removing intermediate container dab5f9371ca7
Successfully built 45c8e9694a5f
#创建成功后启动镜像
[root@node1 docker]# docker run --name tomcat -p 8080:8080 -d tomcat:v1.0
f1fb101218a990584ca3208d796fc25453c04f3a5a8f294aa22ce5d2d0a38f0b
[root@node1 docker]# curl localhost:8080
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.40</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
.....省略部分输出
#进入容器查看目录结构
[root@node1 docker]# docker exec -it tomcat /bin/bash
[root@f1fb101218a9 /]# cd root
[root@f1fb101218a9 ~]# ls
apache-tomcat-9.0.40 jdk1.8.0_271
[root@f1fb101218a9 ~]#
5.3 Docker仓库构建
启动两台虚拟机,IP 分别为192.168.1.10 server, 192.168.1.10 client
#仓库服务器配置
#下载一个仓库,指定端口为5000
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
0a6724ff3fcd: Pull complete
....
9af6d68b484a: Pull complete
Digest: sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa
Status: Downloaded newer image for registry:latest
4f433c787d3ad16bb3131f0f6909273d4167fb267168587cc6f5e9e24187ea12
#增加端口配置,默认为443,这里改为5000,需要加声明,不然会被认为不安全
[root@node1 docker]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.10:5000"]
}
#重启docker 服务
[root@node1 docker]# systemctl restart docker
#仓库地址/username/imageName:tag0, 按此格式修改已有的image
[root@node1 docker]# docker tag tomcat:v1.0 192.168.1.10:5000/tomcat:v1.0
[root@node1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.10:5000/tomcat v1.0 45c8e9694a5f About an hour ago 813 MB
tomcat v1.0 45c8e9694a5f About an hour ago 813 MB
#仓库地址/username/imageName:tag0, 将镜像push到仓库
[root@node1 docker]# docker push 192.168.1.10:5000/tomcat:v1.0
The push refers to a repository [192.168.1.10:5000/tomcat]
9318ec22b1eb: Pushed
....
7bd4370c96a2: Pushed
v1.0: digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104 size: 2408
#查看上传结果
[root@node1 docker]# curl -XGET http://192.168.1.10:5000/v2/_catalog
{"repositories":["tomcat"]}
#客户机配置
# 安装docker, rpm包从node1节点copy而来
[root@node2 docker]# yum -y install docker-ce-*
#修改daemon.json文件,认为5000端口安全
[root@node2 docker]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.10:5000"]
}
[root@node2 docker]# systemctl restart docker
#查看是否可以连接到镜像仓库
[root@node2 docker]# curl -XGET http://192.168.1.10:5000/v2/_catalog
{"repositories":["tomcat"]}
#从仓库下载镜像
[root@node2 docker]# docker pull 192.168.1.10:5000/tomcat:v1.0
v1.0: Pulling from tomcat
aa655cdf203d: Pull complete
....
e5da50c0f5a4: Pull complete
Digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104
Status: Downloaded newer image for 192.168.1.10:5000/tomcat:v1.0
#查看镜像并运行镜像为容器
[root@node2 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.10:5000/tomcat v1.0 45c8e9694a5f About an hour ago 813 MB
[root@node2 docker]# docker run --name tomcat01 -p 80:8080 -d 192.168.1.10:5000/tomcat:v1.0
b21d3003c228b26d19076ca943b11a3f2c93f66748e9b2672284c6b41ac94574
测试:打开浏览器查看,是否可以访问tomcat
5.4 Harbor 企业级私有仓库搭建
- 底层安装需求:
--Python 2.7 及以上
--Docker引擎为1.10及以上
--Docker compose 1.6.0 或更高
系统还原到初始状态
#查看python版本
[root@node2 /]# python
Python 2.7.5 (default, Apr 2 2020, 13:16:51)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
#安装docker
[root@node1 docker]# ls
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm docker-compose
[root@node1 docker]# yum -y install docker-ce*
#配置docker-compose
[root@node1 docker]# mv docker-compose /usr/local/bin/
[root@node1 docker]# chmod +x /usr/local/bin/docker-compose
#查看docker 版本
[root@node1 docker]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.03.0-ce
....
#查看docker-compose 版本
[root@node1 docker]# docker-compose --version
docker-compose version 1.17.1, build 6d101fb
- 下载harbor 版本1.7.1,高版本可能和已安装的docker17.03.0 存在兼容问题
https://github.com/goharbor/harbor/releases/v1.7.1
#将下载包上传到linux虚拟机
[root@node1 docker]# rz -E
rz waiting to receive.
[root@node1 docker]# ls
apache-tomcat-9.0.40.tar.gz docker-compose.yml jdk-8u271-linux-x64.tar.gz
docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm Dockerfile
docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm harbor-offline-installer-v1.7.1.tgz
[root@node1 docker]# tar -zxf harbor-offline-installer-v1.7.1.tgz
[root@node1 docker]# mv harbor /usr/local/
[root@node1 harbor]# vi harbor.cfg
hostname = hub.lidepic.com
ui_url_protocol = https
#Maximum number of job workers in job service
max_job_workers = 3
#The path of cert and key files for nginx, they are applied only the protocol is set to https
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
#The path of secretkey storage
secretkey_path = /data
#Change the admin password from UI after launching Harbor.
harbor_admin_password = Harbor12345
#The password for the root user of Harbor DB. Change this before any production use.
db_password = root123
#其余选项使用默认, 保存退出,执行安装脚本
[root@node1 harbor]# ./install.sh
#注意保持环境干净,如果80端口被占用,将无法安装nginx
#安装后会自动运行容器,查看运行的容器
[root@node1 harbor]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8bc0333696d goharbor/nginx-photon:v1.7.1 "nginx -g 'daemon ..." 5 minutes ago Up 5 minutes (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp nginx
36d8cf19fbd9 goharbor/harbor-portal:v1.7.1 "nginx -g 'daemon ..." 5 minutes ago Up 5 minutes (healthy) 80/tcp harbor-portal
dbb5bfb97bd2 goharbor/harbor-jobservice:v1.7.1 "/harbor/start.sh" 5 minutes ago Up 5 minutes harbor-jobservice
6622db56f51b goharbor/harbor-core:v1.7.1 "/harbor/start.sh" 5 minutes ago Up 5 minutes (healthy) harbor-core
38afbed36085 goharbor/registry-photon:v2.6.2-v1.7.1 "/entrypoint.sh /e..." 5 minutes ago Up 5 minutes (healthy) 5000/tcp registry
6469aeb3b534 goharbor/harbor-registryctl:v1.7.1 "/harbor/start.sh" 5 minutes ago Up 5 minutes (healthy) registryctl
bfa55f92a7c2 goharbor/harbor-adminserver:v1.7.1 "/harbor/start.sh" 5 minutes ago Up 5 minutes (healthy) harbor-adminserver
06b05ca6ebc1 goharbor/redis-photon:v1.7.1 "docker-entrypoint..." 5 minutes ago Up 5 minutes 6379/tcp redis
3731bad1e01f goharbor/harbor-db:v1.7.1 "/entrypoint.sh po..." 5 minutes ago Up 5 minutes (healthy) 5432/tcp harbor-db
824bd2cfa040 goharbor/harbor-log:v1.7.1 "/bin/sh -c /usr/l..." 5 minutes ago Up 5 minutes (unhealthy) 127.0.0.1:1514->10514/tcp
修改windows下C:WindowsSystem32driversetc的hosts文件,解析hub.lidepic.com
192.168.1.10 hub.lidepic.com
同时在linux server 本机,也需要修改/etc/hosts 文件,增加一条记录,不然无法使用域名访问。
hub.lidepic.com 192.168.1.10
- 创建https证书并赋予目录权限
#生成证书,密码123456
[root@node1 docker]# openssl genrsa -des3 -out server.key 2048
#证书签名请求,国家地区域名等自定义,密码还是123456
[root@node1 docker]# openssl req -new -key server.key -out server.csr
#抹掉证书使用时的密码,这样证书将不需要密码,可以直接使用
[root@node1 docker]# cp server.key server.key.org
[root@node1 docker]# openssl rsa -in server.key.org -out server.key
#生成证书
[root@node1 docker]# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
#创建目录,并赋予目录权限,目录同harbor 配置相关,将证书文件移动到此目录下
[root@node1 docker]# mkdir -p /data/cert
[root@node1 docker]# chmod -R 777 /data/cert/
[root@node1 docker]# mv server.* /data/cert/
- 访问测试
#停止harbor 仓库
[root@node1 harbor]# docker-compose stop
#启动harbor 仓库
[root@node1 harbor]# docker-compose up -d
发现错误,无法通过网页访问,本机也登录不了。
问题: 域名没有解析,修改 /etc/hosts 文件,增加一条记录:
192.168.1.10 hub.lidepic.com
再次访问:使用配置文件默认的用户登录: admin / Harbor2345
Login之后,创建一个项目,名为test-repository
这里有推送的方法,首先是需要修改镜像名称,然后推送到仓库。下一步会使用到。
· docker tag SOURCE_IMAGE[:TAG] hub.lidepic.com/test-repository/IMAGE[:TAG]
· docker push hub.lidepic.com/test-repository/IMAGE[:TAG]
- 上传镜像测试
指定镜像仓库地址
#编辑daemon.json文件,告诉服务器该地址安全,不然认证通不过
[root@node1 harbor]# vi /etc/docker/daemon.json
{
"insecure-registries": ["hub.lidepic.com"]
}
#修改配置文件在ExecStart=/usr/bin/dockerd后增加 --insecure-registry hub.lidepic.com
[root@node1 harbor]# vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry hub.lidepic.com
#重新加载
[root@node1 harbor]# systemctl daemon-reload
#重启docker
[root@node1 harbor]# systemctl restart docker
登录harbor仓库,user admin 密码Harbor12345
[root@node1 ~]# docker login -u admin hub.lidepic.com
Password:
Login Succeeded
如果出现截图错误,可能原因是host name 和IP 不匹配,检查hosts文件
解决办法: 修改改hosts 文件,增加一条记录,可以ping 通这个域名,重新登录即可。
192.168.1.10 hub.lidepic.com
上传镜像到harbor仓库
#修改原有镜像,按照 域名/项目名/镜像名:版本 格式
[root@node1 ~]# docker tag tomcat:v1.0 hub.lidepic.com/test-repository/tomcat:v1.2
#上传镜像到harbor 仓库test-repository项目
[root@node1 ~]# docker push hub.lidepic.com/test-repository/tomcat:v1.2
The push refers to a repository [hub.lidepic.com/test-repository/tomcat]
9318ec22b1eb: Pushed
…
7bd4370c96a2: Pushed
v1.2: digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104 size: 2408
查看网页端,在test-repository 项目下,增加了一个tomcat 镜像
- 在其他docker 客户端node2下载测试
#首先指定镜像仓库地址,编辑daemon.json文件,告诉服务器该地址安全,不然认证通不过
[root@node1 harbor]# vi /etc/docker/daemon.json
{
"insecure-registries": ["hub.lidepic.com"]
}
#修改hosts 文件,是 node2 可以通过域名访问到hub.lidepic.com
[root@node2 docker]# vi /etc/hosts
hub.lidepic.com 192.168.1.10
node2 192.168.1.11
192.168.1.10 hub.lidepic.com
#测试是否可以正常ping 通
[root@node2 docker]# ping hub.lidepic.com
PING hub.lidepic.com (192.168.1.10) 56(84) bytes of data.
64 bytes from hub.lidepic.com (192.168.1.10): icmp_seq=1 ttl=64 time=0.954 ms
64 bytes from hub.lidepic.com (192.168.1.10): icmp_seq=2 ttl=64 time=1.40 ms
#下载镜像
[root@node2 docker]# docker pull hub.lidepic.com/test-repository/tomcat:v1.2
Error response from daemon: Get https://hub.lidepic.com/v1/_ping: x509: certificate signed by unknown authority
#这里发现了问题,https证书校验没通过,可能是没有reload配置文件,reload并重启docker
[root@node2 docker]# systemctl daemon-reload
[root@node2 docker]# systemctl restart docker
[root@node2 docker]# docker pull hub.lidepic.com/test-repository/tomcat:v1.2
Error response from daemon: repository hub.lidepic.com/test-repository/tomcat not found: does not exist or no pull access
#这里发现 does not exist or no pull access, 应该是没有login,这里是私有仓库。要指定域名,不然默认登录docker 官方网站
[root@node2 docker]# docker login -u admin hub.lidepic.com
Password:
Login Succeeded
#再次pull,成功
[root@node2 docker]# docker pull hub.lidepic.com/test-repository/tomcat:v1.2
v1.2: Pulling from test-repository/tomcat
Digest: sha256:596979c794747283e4993062fdf275bf84b13219e93aed47cec934c70706f104
Status: Downloaded newer image for hub.lidepic.com/test-repository/tomcat:v1.2
#查看镜像
[root@node2 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hub.lidepic.com/test-repository/tomcat v1.2 45c8e9694a5f 4 days ago 813 MB