Docker基础动手实验--操作笔记

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包安装

  1. 先到官网下载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
  1. 上传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
  1. 验证docker 是否安装启动成功

[root@node1 docker]# docker run hello-world # Hello-world是镜像名,不加版本号则获取最新版本

  1. 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

  1. 下载镜像
[root@node1 docker]# docker pull wordpress
[root@node1 docker]# docker pull mariadb
[root@node1 docker]# docker images   //查看已经下载的镜像

  1. 运行镜像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   //查看运行情况

  1. 验证:浏览器访问

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(/,/, "\nso:", $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 企业级私有仓库搭建

  1. 底层安装需求:

--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
  1. 下载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:\Windows\System32\drivers\etc的hosts文件,解析hub.lidepic.com

192.168.1.10 hub.lidepic.com

同时在linux server 本机,也需要修改/etc/hosts 文件,增加一条记录,不然无法使用域名访问。

hub.lidepic.com 192.168.1.10

  1. 创建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/
  1. 访问测试

https://hub.lidepic.com/

#停止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]

  1. 上传镜像测试

指定镜像仓库地址

#编辑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 镜像

  1. 在其他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
posted @ 2021-01-29 16:20  逆流的鱼2016  阅读(374)  评论(0编辑  收藏  举报