[root@master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@master ~]# yum install docker-ce
我这里使用的是阿里云镜像站加速器:
#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://XXXXXX.mirror.aliyuncs.com"]
}
[root@master ~]# systemctl start docker
[root@master ~]# systemctl enable docker
Base镜像有两层含义:一是不依赖其他镜像,从stratch构建;二是其他镜像可以以此为基础进行构建。
说白了就是各Linux发行版的docker镜像,如Ubuntu,Centos,Debian等。
Linux操作系统由系统内核和用户空间组成,内核就是Kernel,用户空间rootfs,就是文件系统,我们常见的/bin、/home、/etc等;
基本上99%以上的镜像都是从base镜像进行扩展和构建的,以nginx镜像为例:
[root@master ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
b8f262c62ec6: Pull complete
a6639d774c21: Pull complete
22a7aa8442bf: Pull complete
Digest: sha256:9688d0dae8812dd2437947b756393eb0779487e361aa2ffbc3a529dca61f102c
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
从nginx镜像的下载过程可以看出,该镜像分为3个镜像层。
容器由最上面的一个可写的容器层和若干只读的镜像层组成,容器的数据就存放在这些层中,这些分层结构的最大特性是Copy-on-Write:
(1) 新数据会存放在最上面的容器层;
(2) 修改现有数据会先从镜像层复制到容器层,修改后的数据存放在容器层,镜像层不变;
(3) 如果多个层中有名字相同的文件,用户只能看到最上层的那个文件。
分层结构使镜像和容器的创建、共享及分发变得非常高效,而这些都要归功于Docker Storange driver,正是他实现了多层数据的堆叠并为用户提供了一个单一的合并之后的统一视图。
搜索镜像:
[root@master ~]# docker search nginx
下载镜像:
[root@master ~]# docker pull nginx
删除镜像:
[root@master ~]# docker rmi nginx
查看镜像构建过程:
[root@master ~]# docker history nginx
docker commit命令:也可以写成docker container commit,是利用容器来构建镜像。
首先下载一个ubuntu镜像并启动容器:
[docker@docker ~]$ docker run -it -p 80 --name commit-test ubuntu bash
在ubuntu容器内安装nginx:
[docker@docker ~]$ apt-get install nginx
使用commit构建镜像
[docker@docker ~]$ docker commit -a ‘zhaoll’ -m ‘zhaoll-ubuntu-nginx’ 43ac46de76a9 docker.io/zhaoll-nginx
-a ‘zhaoll’ 是添加作者信息,
-m ‘zhaoll-ubuntu-nginx’是添加备注信息,
43ac46de76a9是docker ps命令看到的nginx容器的ID,
docker.io/zhaoll-nginx是我们的仓库名/镜像名和版本信息,版本信息我们没填写,默认为latest。
查看本地镜像是否有我们刚创建的镜像文件:
[docker@docker ~]$ docker images zhaoll-nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/zhaoll-nginx latest 7c86b97f10df 27 hours ago 206 MB
什么是Dockerfile?
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。例:
docker build -f /path/to/a/Dockerfile
Dockerfile的基本结构:
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
Dockerfile文件说明:
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Dockerfile文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
在这里列出了一些常用的指令:
FROM:指定基础镜像,必须为第一个命令,例如:
FROM ubuntu:latest
MAINTAINER: 维护者信息,例如:
MATAINER zhaoll
RUN:构建镜像时执行的命令,例如:
RUN apt-get update&& apt-get install -y nginx
或者:
RUN ["executable", "param1", "param2"]
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget,例如:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源;
CMD:构建容器后调用,也就是在容器启动时才进行调用,CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。。
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令:
ENTRYPOINT ["top", "-b"]
LABEL:用于为镜像添加元数据:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
ENV:设置环境变量:
格式:
ENV #之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量
ENV = … #可以设置多个变量,每个变量为一个"=“的键值对,如果中包含空格,可以使用\来进行转义,也可以通过”"来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
EXPOSE:指定于外界交互的端口:
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
VOLUME:用于指定持久化目录:
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
卷可以容器间共享和重用
容器并不一定要和其它容器共享卷
修改卷后会立即生效
对卷的修改不会对镜像产生影响
卷会一直存在,直到没有任何容器在使用它
WORKDIR:工作目录,类似于cd命令:
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户:
示例:
USER www
注:
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
下面是一个Dockerfile案例:
[root@master ~]# cat Dockerfile
#新生成的镜像是基于sshd:dockerfile镜像
FROM centos
MAINTAINER by zhaoll
WORKDIR /usr/local/src
#安装wget
RUN yum install -y wget
#下载并解压源码包
RUN wget http://nginx.org/download/nginx-1.12.1.tar.gz
RUN tar zxvf nginx-1.12.1.tar.gz
WORKDIR nginx-1.12.1
#编译安装nginx
RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel openssl*
RUN useradd -M -u 40 -s /sbin/nologin nginx
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-http_realip_module
RUN make
RUN make install
#启动Nginx服务
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
RUN /usr/local/nginx/sbin/nginx
#修改Nginx配置文件,以非daemon方式启动
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
#复制服务启动脚本并设置权限
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh
#设置生成容器时需要执行的脚本
CMD ["/usr/local/sbin/run.sh"]
#开放22、80、443端口
EXPOSE 22
EXPOSE 80
EXPOSE 443
run.sh脚本:
[root@master ~]# cat run.sh
#!/bin/bash
/usr/sbin/sshd &
/usr/local/nginx/sbin/nginx
查看Dockerfile所在的目录文件Dockerfile所涉及到的文件尽量放在同一个目录内:
[root@master ~]# ll
-rw-------. 1 root root 1241 9月 16 10:29 anaconda-ks.cfg
-rw-r--r-- 1 root root 1103 9月 27 01:07 Dockerfile
-rw-r--r-- 1 root root 58 9月 27 01:04 run.sh
下面开始构建镜像:
[root@master ~]# docker build -t nginx:v1 .
Sending build context to Docker daemon 18.94kB
Step 1/21 : FROM centos
latest: Pulling from library/centos
Digest: sha256:307835c385f656ec2e2fec602cf093224173c51119bbebd602c53c3653a3d6eb
Status: Downloaded newer image for centos:latest
---> 67fa590cfc1c
Step 2/21 : MAINTAINER by zhaoll
---> Running in cb9ae337a31e
Removing intermediate container cb9ae337a31e
---> 3aa43e148267
Step 3/21 : WORKDIR /usr/local/src
---> Running in 8cc6b8c37003
Removing intermediate container 8cc6b8c37003
---> 477bc63a0d54
Step 4/21 : RUN yum install -y wget
---> Running in 65f84fa7d881
Removing intermediate container 65f84fa7d881
---> f1d0e5114f4a
Step 5/21 : RUN wget http://nginx.org/download/nginx-1.12.1.tar.gz
---> Running in 84a9c1956c58
Removing intermediate container 84a9c1956c58
---> e5d44db76db1
Step 6/21 : RUN tar zxvf nginx-1.12.1.tar.gz
---> Running in bb7eebc14b89
......
Removing intermediate container bb7eebc14b89
---> 483dfa9c20c5
Step 7/21 : WORKDIR nginx-1.12.1
---> Running in 79f9b3aae8dd
Removing intermediate container 79f9b3aae8dd
---> dbb1373eabe1
Step 8/21 : RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel openssl*
---> Running in 3bbc05bbdfaa
Removing intermediate container 3bbc05bbdfaa
---> eea062bc45ee
Step 9/21 : RUN useradd -M -u 40 -s /sbin/nologin nginx
---> Running in 20f8d0ee6e5f
Removing intermediate container 20f8d0ee6e5f
---> 35d1092c724e
Step 10/21 : RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-http_realip_module
---> Running in d3aa019f5fc8
……
Removing intermediate container d3aa019f5fc8
---> a3c0cf9ccf4d
Step 11/21 : RUN make
---> Running in 7bae567cf4ae
Removing intermediate container 7bae567cf4ae
---> b4e6569e644d
Step 12/21 : RUN make install
---> Running in 55defe6c5f59
Removing intermediate container 55defe6c5f59
---> 2f39b1dfd279
Step 13/21 : RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
---> Running in c8f431fe3012
Removing intermediate container c8f431fe3012
---> 242734cc83eb
Step 14/21 : RUN /usr/local/nginx/sbin/nginx
---> Running in d4e51599af3b
Removing intermediate container d4e51599af3b
---> 8cfbc881fb44
Step 15/21 : RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
---> Running in f6ee91d9993d
Removing intermediate container f6ee91d9993d
---> 6103ff9ea305
Step 16/21 : ADD run.sh /usr/local/sbin/run.sh
---> 6ae6de96e303
Step 17/21 : RUN chmod 755 /usr/local/sbin/run.sh
---> Running in 138e7b79baac
Removing intermediate container 138e7b79baac
---> 93ce3af5aceb
Step 18/21 : CMD ["/usr/local/sbin/run.sh"]
---> Running in 5402b057dfe2
Removing intermediate container 5402b057dfe2
---> bd1a854f3335
Step 19/21 : EXPOSE 22
---> Running in 647d183ddfe9
Removing intermediate container 647d183ddfe9
---> 6705b264f153
Step 20/21 : EXPOSE 80
---> Running in ad0e97b758f8
Removing intermediate container ad0e97b758f8
---> ef784aeacaa4
Step 21/21 : EXPOSE 443
---> Running in 0c42eef3c7ea
Removing intermediate container 0c42eef3c7ea
---> 7c791317ad6f
Successfully built 7c791317ad6f
Successfully tagged nginx:v1
末尾两行Successfully,说明nginx:v1镜像构建完成,我们来看一下:
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 7c791317ad6f 9 minutes ago 525MB
centos latest 67fa590cfc1c 5 weeks ago 202MB
下面使用nginx:v1镜像启动nginx容器:
[root@master ~]# docker run -itd -P --name nginx nginx:v1
8df6a9dbbe59b507ebed18b3c22001fb99e12480527ecb21734fdf3f3815d28e
查看正在运行的容器:
访问容器的80端口随机映射到宿主机的32772端口,我们来访问测试一下:
[root@master ~]# curl 192.168.1.4:32772
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
可以正常访问,说明此镜像才真正构建成功了
先使用docker save命令将镜像保存到本地:
[root@master ~]# docker save -o nginx.tar docker.io/nginx:latest
[root@master ~]# ll
总用量 126796
-rw-------. 1 root root 1241 9月 16 10:29 anaconda-ks.cfg
-rw-r--r-- 1 root root 1103 9月 27 01:07 Dockerfile
-rw------- 1 root root 129825280 9月 27 03:38 nginx.tar
-rw-r--r-- 1 root root 58 9月 27 01:04 run.sh
将本地镜像全部删除后,使用nginx.tar恢复镜像:
[root@master ~]# docker load
2db44bce66cd: Loading layer [===================================>] 72.48MB/72.48MB
3bb51901dfa3: Loading layer [===================================>] 57.32MB/57.32MB
509a5ea4aeeb: Loading layer [===================================>] 3.584kB/3.584kB
Loaded image: nginx:latest
查看nginx镜像已恢复本地:
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f949e7d76d63 44 hours ago 126MB
我们以阿里云容器镜像站为例。
登陆阿里云-容器镜像服务-镜像仓库-创建镜像仓库,命名空间自己定义,但镜像仓库建议使用镜像名来命名。
(1) 登录阿里云Docker Registry
docker login --username=***username*** registry.cn-beijing.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在产品控制台首页修改登录密码。
(2)从Registry中拉取镜像
docker pull registry.cn-beijing.aliyuncs.com/xxxx/nginx:[镜像版本号]
(3)将镜像推送到Registry
[root@master ~]# docker login --username=***username*** registry.cn-beijing.aliyuncs.com
[root@master ~]# docker tag [ImageId] registry.cn-beijing.aliyuncs.com/xxxx/nginx:[镜像版本号]
[root@master ~]# docker push registry.cn-beijing.aliyuncs.com/xxxx/nginx:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
例:
先从docker官方仓库下载一个nginx镜像:
[root@master ~]# docker pull docker.io/nginx
Using default tag: latest
latest: Pulling from library/nginx
b8f262c62ec6: Pull complete
e9218e8f93b1: Pull complete
7acba7289aa3: Pull complete
Digest: sha256:aeded0f2a861747f43a01cf1018cf9efe2bdd02afd57d2b11fcc7fcadc16ccd1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
查看镜像ID:
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f949e7d76d63 43 hours ago 126MB
重新打标签:
[root@master ~]# docker tag f949e7d76d63 registry.cn-beijing.aliyuncs.com/xxxx/nginx:v1
推送至阿里云镜像仓库:
[root@master ~]# docker push registry.cn-beijing.aliyuncs.com/xxxx/nginx:v1
The push refers to repository [registry.cn-beijing.aliyuncs.com/xxxx/nginx]
509a5ea4aeeb: Pushed
3bb51901dfa3: Pushed
2db44bce66cd: Pushed
v1: digest: sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76 size: 948
[root@master ~]#
推送成功,登上阿里云查看此镜像。
删除本地镜像,将阿里云上的镜像pull下来:
[root@master ~]# docker pull registry.cn-beijing.aliyuncs.com/xxxx/nginx:v1
v1: Pulling from zhaoll/nginx
b8f262c62ec6: Pull complete
e9218e8f93b1: Pull complete
7acba7289aa3: Pull complete
Digest: sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76
Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/zhaoll/nginx:v1
registry.cn-beijing.aliyuncs.com/zhaoll/nginx:v1
(1)系统环境
主机名 | IP | 角色 |
---|---|---|
server | 10.1.1.17 | 镜像仓库 |
node | 10.1.1.18 | 客户端 |
(2)安装docker并启动;
(3)创建host挂载目录:
mkdir -p /docker /registry
(4)创建密码存放目录
mkdir -p /docker/auth
(5)生成用户名密码:
docker run --entrypoint htpasswd registry -Bbn username password > /docker /auth/htpasswd
(6)在server端拉取registry镜像:
docker pull registry
(7)启动registry容器,并开启端口映射:
[root@master ~]# docker run -d -p 5000:5000 --restart=always --privileged=true \
-v /docker/registry:/var/lib/registry \
-v /docker/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
--name registry \
registry
04f38add8e3f4d013a39377569b34c618153ff260700ea10ac43cdd9fd463a2c
参数说明
-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
–restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
–name registry:创建容器命名为registry,你可以随便命名;
registry:latest:这个是刚才pull下来的镜像
–privileged=true:使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
(8)登录到私有仓库:
docker login -u zhaoll -p 123456 10.1.1.17:5000
(9)安装docker-registry web
docker run -d -p 8080:80 \
-e ENV_DOCKER_REGISTRY_HOST=10.1.1.17 \
-e ENV_DOCKER_REGISTRY_PORT=5000 \
konradkleine/docker-registry-frontend:v2
然后访问10.1.1.17:8080,可以看到,当前仓库没有任何镜像。
(10)客户端测试推送镜像:
在node上下载busybox:latest镜像:
docker pull busybox
给镜像重新打标签:
[root@node1 ~]# docker tag docker.io/busybox:latest 10.1.1.17:5000/busybox:V1
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.1.1.17:5000/busybox V1 19485c79a9bb 29 hours ago 1.22 MB
docker.io/busybox latest 19485c79a9bb 29 hours ago 1.22 MB
客户机登录到镜像仓库:
docker login -u zhaoll -p 123456 10.1.1.17:5000
推送镜像到私有仓库:
[root@node1 ~]# docker push 10.1.1.17:5000/busybox:V1
The push refers to a repository [10.1.1.17:5000/busybox]
6c0ea40aef9d: Pushed
V1: digest: sha256:dd97a3fe6d721c5cf03abac0f50e2848dc583f7c4e41bf39102ceb42edfd1808 size: 527
[root@node1 ~]#
打开10.1.1.17:8080,可以看到出现了我们推送的镜像:
点击页面上的busybox可以看到该镜像镜像有哪些tag:
注意可能会出现以下报错的情况:
报错1:
[root@node1 ~]# docker push 10.1.1.17:5000/busybox:V1
The push refers to a repository [10.1.1.17:5000/busybox]
6c0ea40aef9d: Preparing
no basic auth credentials
这是因为客户机没登录到镜像仓库,需要登录:
docker login -u zhaoll -p 123456 10.1.1.17:5000
再次推送就没问题了
[root@node2 ~]# docker push 10.1.1.17:5000/busybox:V2
The push refers to a repository [10.1.1.17:5000/busybox]
Get https://10.1.1.17:5000/v1/_ping: http: server gave HTTP response to HTTPS client
出现此问题是因为docker默认需要https的方法才能上传,我们可以修改下daemon.json来解决:
[root@node2 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://z11csm7d.mirror.aliyuncs.com"],
"insecure-registries": [ "10.1.1.17:5000"]
}
然后重启docker服务,再次推送就可以了:
systemctl daemon-reload
systemctl restart docker
[root@node1 ~]# docker push 10.1.1.17:5000/busybox:V1
The push refers to a repository [10.1.1.17:5000/busybox]
6c0ea40aef9d: Retrying in 1 second
received unexpected HTTP status: 500 Internal Server Error
出现此情况,通常是因为服务器端在启动registry容器时,没添加–privileged=true参数。我们添加这个参数了,所以正常推送。
删除本地镜像:
[root@node1 ~]# docker rmi -f $(docker images -aq)
Untagged: 10.1.1.17:5000/busybox:V1
Deleted: sha256:19485c79a9bbdca205fce4f791efeaa2a103e23431434696cc54fdd939e9198d
Deleted: sha256:6c0ea40aef9d2795f922f4e8642f0cd9ffb9404e6f3214693a1fd45489f38b44
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@node1 ~]#
从私有仓库拉取镜像:
[root@node1 ~]# docker pull 10.1.1.17:5000/busybox:V1
Trying to pull repository 10.1.1.17:5000/busybox ...
V1: Pulling from 10.1.1.17:5000/busybox
7c9d20b9b6cd: Pull complete
Digest: sha256:dd97a3fe6d721c5cf03abac0f50e2848dc583f7c4e41bf39102ceb42edfd1808
Status: Downloaded newer image for 10.1.1.17:5000/busybox:V1
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.1.1.17:5000/busybox V1 19485c79a9bb 30 hours ago 1.22 MB
注意拉取的时候别忘了V1标签,不加上标签,会自动默认latest标签,会出现失败情况:
[root@node1 ~]# docker pull 10.1.1.17:5000/busybox
Using default tag: latest
Trying to pull repository 10.1.1.17:5000/busybox ...
Pulling repository 10.1.1.17:5000/busybox
Error: image busybox:latest not found
1、环境准备:
修改/etc/hosts,追加一行
192.168.1.10 test95598.com
修改/etc/hostname
test95598.com
修改windows主机的hosts文件,具体路径为:C:\Windows\System32\drivers\etc,在末尾追加一行:
192.168.1.10 test95598.com
保存后在CMD窗口ping以下test95598.com,确认解析到的主机地址为192.168.1.10。
2、先使用openssl创建CA证书:
(1)使用openssl工具生成一个RSA私钥并输入密码
openssl genrsa -des3 -out server.key 2048
(2)创建证书签名请求CSR文件
openssl req -new -key server.key -out server.csr
hostname必须输,且必须和主机名相同,其他的可以空着
把上面设置的密码去掉:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
(3)生成CA证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
创建/data/cert目录,用于存放证书文件,这个目录是Harbor默认的证书目录:
mkdir -p /data/cert
mv /root/server* /data/cert
以上执行完成,可以在当前目录下看到3个文件:
[root@www harbor]# ls /data/cert/
server.crt server.csr server.key
3、安装docker,配置加速器地址,开机自启动;
4、安装docker-compose;
5、安装harbor:
先下载离线安装文件:
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-online-installer-v1.7.4.tgz
解压到指定目录:
tar -zxf harbor-online-installer-v1.7.4.tgz -C /usr/local/
切换到解压后的目录:
cd /usr/local/harbor/
编辑harbor.cfg配置文件:
hostname修改为当前主机名,不要使用localhost等默认名称
ui_url_protocol = https
保存后执行:
./install.sh
执行完成后,有如下提示: