docker学习笔记二
知识点:
1)手动构建镜像
2)Dockerfile快速构建镜像
3)Docker生产环境部署和实践
4)自建本地私有仓库
5)harbor私有仓库搭建
阿里云yum源
https://developer.aliyun.com/mirror/
镜像制作
nginx镜像实例
创建并运行centos容器
[root@izm5edykqg8tzid352ga0iz mysql]# docker pull centos //以centos为基础 [root@izm5edykqg8tzid352ga0iz mysql]# docker run -it centos /bin/bash [root@696cd0ad637b /]# //已经进入容器
更新容器yum源并安装nginx
[root@8ab2b9d7afab yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-7.repo [root@8ab2b9d7afab yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@8ab2b9d7afab yum.repos.d]# yum -y install nginx
退出该容器,然后基于该容器做一个镜像
[root@izm5edykqg8tzid352ga0iz mysql]# docker commit -m "my nginx" e1edeef7375f(容器名or容器ID) danny/nginx:v1(镜像名:版本号) sha256:a5d464ef190c80411161ec6193b877eb5592a1961aeb318e341a9f9c46a39d05 [root@izm5edykqg8tzid352ga0iz mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE danny/nginx v1 a5d464ef190c 2 minutes ago 427 MB //基于mynginx容器制作的镜像 docker.io/nginx latest 71c43202b8ac 4 days ago 109 MB docker.io/centos latest 5182e96772bf 3 weeks ago 200 MB docker.io/alpine latest 11cd0b38bc3c 8 weeks ago 4.41 MB [root@izm5edykqg8tzid352ga0iz mysql]# docker run -dit --name nginxv1 danny/nginx:v1 [root@92c8d3a4bc2a /]# [root@92c8d3a4bc2a /]# ps -ef //已经进入容器 UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:21 ? 00:00:00 /bin/bash root 16 1 0 08:21 ? 00:00:00 ps -ef [root@92c8d3a4bc2a /]# vim /etc/nginx/nginx.conf //修改配置文件添加 daemon off; //不在后台运行 [root@92c8d3a4bc2a /]# nginx -t //验证配置文件语法是否有误 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@92c8d3a4bc2a /]# exit exit [root@izm5edykqg8tzid352ga0iz mysql]# docker commit -m "my nginx" 92c8d3a4bc2a danny/nginx:v2 //再次提交修改版本v2 sha256:062c8ef6e694b94fec7213bc8c65a055d75dc968fe2b671d97826381e0259f48 [root@izm5edykqg8tzid352ga0iz mysql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE danny/nginx v2 062c8ef6e694 9 seconds ago 427 MB //修改后提交的版本 danny/nginx v1 a5d464ef190c 12 minutes ago 427 MB docker.io/nginx latest 71c43202b8ac 4 days ago 109 MB docker.io/centos latest 5182e96772bf 3 weeks ago 200 MB docker.io/alpine latest 11cd0b38bc3c 8 weeks ago 4.41 MB [root@izm5edykqg8tzid352ga0iz mysql]# docker run -it -p 82:80 danny/nginx:v2 /usr/sbin/nginx //启动v2版本的容器 08df10e92f9df846a840d61d10d07c045397e40ff06d9b4afdc09e4840266d23 [root@izm5edykqg8tzid352ga0iz mysql]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 08df10e92f9d danny/nginx:v2 "/usr/sbin/nginx" 13 seconds ago Up 12 seconds 0.0.0.0:82->80/tcp optimistic_bardeen
然后就可以通过82端口访问了 http://IP:82
列出镜像变更历史
docker history 镜像名
Dockerfile构建(快速构建镜像)
常用指令
FROM 指定基础镜像
MAINTAINER 维护者信息
ENV 指定环境变量 例:
ENV JAVA_HOME /usr/local/jdk1.8_121 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin
RUN 加在命令前执行命令
ADD copy文件,会自动解压
WORKDIR 相当于cd进目录
VOLUME 目录挂载
EXPOSE 端口
USER 设置启动容器的用户,可以是用户名或UID
USER daemon
USER UID
ENTRYPOINT指令和CMD指令详解
ENTRYPOINT 指定启动容器时执行的命令
Dockerfile中的ENTRYPOINT指令和CMD指令都可以设置容器启动时要执行的命令,但用途是有略微不同的。
ENTRYPOINT指令和CMD指令虽然是在Dockerfile中定义,但是在构建镜像的时候并不会被执行,只有在执行docker run命令启动容器时才会起作用。
注意:
在Dockerfile中,只能有一个ENTRYPOINT指令,如果有多个ENTRYPOINT指令则以最后一个为准。
在Dockerfile中,只能有一个CMD指令,如果有多个CMD指令则以最后一个为准。
在Dockerfile中,ENTRYPOINT指令或CMD指令,至少必有其一
1. ENTRYPOINT指令
首先,执行docker run如果带有其他命令参数,不会覆盖ENTRYPOINT指令。
不过,docker run的--entrypoint可以覆盖Dockerfile中ENTRYPOINT设置的命令,后续文章详述。
1) exec格式用法(推荐)
ENTRYPOINT ["top","-b", "-H"]
exec格式,也被称为JSON风格["command","arg1"]。
在创建容器实例执行docker run命令时,设置的任何命令参数或CMD指令的命令,都将作为ENTRYPOINT指令的命令参数,追加到ENTRYPOINT指令的命令之后。
如,在Dockerfile中有如上ENTRYPOINT指令的情况下,执行docker run <container_name> -v启动容器。则容器启动后执行的第一条完整命令如下:
top -b -H -v
即将-v作为top的追加参数。
2) shell格式用法
ENTRYPOINT top -b -H
这种格式屏蔽追加任何参数,即CMD指令或docker run ... <command>的参数都将被忽略。
采用shell格式,在创建容器后会首先调用Shell,即自动在命令前面追加/bin/sh -c。如,对于上述定义,在容器启动时执行的第一条命令如下:
/bin/sh -c top -b -H
这样,ENTRYPOINT指令设置的top命令就不是容器中的第一个进程PID 1,这样在容器停止的时候就无法收到系统的SIGTERM信号。要想收到SIGTERM信号,务必使用Bash的内置exec命令使得top的PID 1,定义ENTRYPOINT指令如下:
ENTRYPOINT exec top -b -H (常用)
2. CMD指令
首先,执行docker run如果带有其他命令参数,将会覆盖CMD指令。
如果在Dockerfile中,还有ENTRYPOINT指令,则CMD指令中的命令将作为ENTRYPOINT指令中的命令的参数(CMD和ENTRYPOINT指令必须采用JSON风格,即exec格式,定义)。
1) exec格式用法(推荐)
CMD ["echo","hello", "world"]
exec格式,也被称为JSON风格["command","arg1"]。
这种格式,在容器执行时不会调用任何Shell,即不会进行命令中的变量替换。要进行Shell处理,需要将sh直接加入到命令中:
CMD ["sh", "-c", "echo $HOME"] (sh -c 这种方式可能会常常见到,具体解释可参考https://www.cnblogs.com/FengZeng666/p/14821142.html)
这样,$HOME才会被解析为真实的主目录。
但是并不推荐将sh加入到CMD指令中,因为CMD指令的命令往往作为ENTRYPOINT指令的追加参数,因而如下形式更常见:
CMD ["-c","echo world"]
2) shell格式用法
CMD echo $HW
这种格式,在创建容器后会首先调用Shell,即自动在命令前面追加/bin/sh -c,即上述设置将执行如下命令:
/bin/sh -c echo $HW
示例:
每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
vim /opt/dockerfile/nginx/dockerfile #This docker file #VERSION 1 #Author:danny #Base image FROM centos # MAINTAINER danny danny@qq.com #Commands RUN rpm -ivh https://mirrors.aliyun.com/centos/7.5.1804/extras/x86_64/Packages/epel-release-7-9.noarch.rpm RUN yum -y install nginx ADD index.html /usr/share/nginx/html/index.html #ADD会自动解压 RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx"] [root@izm5edykqg8tzid352ga0iz nginx]# docker build -t mynginx:v3 /opt/dockerfile/nginx/
查看镜像制作结果
[root@izm5edykqg8tzid352ga0iz nginx]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mynginx v3 3cf3c3308849 8 minutes ago 429 MB danny/nginx v2 062c8ef6e694 2 hours ago 427 MB danny/nginx v1 a5d464ef190c 2 hours ago 427 MB docker.io/nginx latest 71c43202b8ac 4 days ago 109 MB docker.io/centos latest 5182e96772bf 3 weeks ago 200 MB docker.io/alpine latest 11cd0b38bc3c 8 weeks ago 4.41 MB 制作并启动容器 [root@izm5edykqg8tzid352ga0iz nginx]# docker run -dit -p 82:80 --name mynginx_1 mynginx:v3 /usr/sbin/nginx c373c95329937126d3e879e78c24843f026547975185ce1b6ea655f8f8d5420d [root@izm5edykqg8tzid352ga0iz nginx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c373c9532993 mynginx:v3 "nginx" 4 seconds ago Up 4 seconds 0.0.0.0:82->80/tcp mynginx_1 [root@izm5edykqg8tzid352ga0iz nginx]# curl -I http://localhost:82 HTTP/1.1 200 OK ...
比较ENTRYPOINT与CMD指令
ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。
docker run <command>往往用于给出替换CMD的临时参数。
--link使用
1)先创建启动源容器mysql
docker run --name mysql --restart=always -d -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
2)创建启动接收容器tomcat --link 源容器(被连接容器)mysql
docker run -d --name 接收容器名(#一般是tomcat) --link 源容器(被连接容器)(#一般是mysql) --restart=always 源容器镜像名 docker run -d -p 8080:8080 --name tomcat --link mysql --restart=always -v /data/tomcat/webapps:/usr/local/tomcat/webapps tomcat
当使用--link时,docker会自动在被连接容器内创建基于–link参数的环境变量。
在接收容器中执行: env | grep -i hub_name
会显示源容器的的环境变量
接下来在tomcat容器的webapps中配置msyql连接,数据源输入mysql的容器名即可
--link 参数可以把两个容器连接为一组容器,一般用于连接mysql,而不用映射mysql的端口到宿主机
--link 主要用来解决两个容器的连接问题
例如,tomcat和mysql建立link之后,在tomcat里可以直接ping通mysql的容器名.
在tomcat配置MySQL连接的文件中不需要再写入localhost或者ip地址,直接写入mysql容器名即可连接到mysql数据库
常用自定义镜像示例:
自定义JDK镜像:
FROM centos:latest MAINTAINER wkcto ADD jdk-8u121-linux-x64.tar.gz /usr/local ENV JAVA_HOME /usr/local/jdk1.8.0_121 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin CMD java -version
构建镜像:docker build -t wkcto_jdk1.8.0_121 .
运行镜像:docker run -d ac84bde53958
定义 Dockerfile 文件: FROM wkcto_jdk1.8.0_121 #指定上面制作的镜像为基础镜像 MAINTAINER wkcto ADD apache-tomcat-8.5.24.tar.gz /usr/local/ ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.24 ENV PATH $PATH:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-8.5.24/bin/catalina.sh run
构建镜像:docker build -t wkcto-tomcat-8.5.24 .
运行镜像:docker run -d -p 8080:8080 ab41b5f48256
定义 Dockerfile 文件: FROM centos:centos6 MAINTAINER wkcto RUN yum install mysql-server mysql -y RUN /etc/init.d/mysqld start &&\ mysql -e "grant all privileges on *.* to 'root'@'%' identified by '123456' WITH GRANT OPTION ;"&&\ mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456' WITH GRANT OPTION ;"&&\ mysql -uroot -p123456 -e "show databases;" EXPOSE 3306 CMD /usr/bin/mysqld_safe
定义 Dockerfile 文件: FROM centos:latest MAINTAINER wkcto RUN yum install epel-release -y && yum install redis -y && yum install net-tools -y EXPOSE 6379 CMD /usr/bin/redis-server –protected-mode no
构建镜像:docker build -t wkcto-redis .
运行镜像:docker run -d -p 6379:6379 390583cf0531
自定义tomcat镜像2
FROM centos MAINTAINER xxx #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下 COPY c.txt /usr/local/cincontainer.txt #把java与tomcat添加到容器中 ADD jdk-8u842-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.53.tar.gz /usr/local/ #安装vim编辑器 RUN yum -y install vim #设置工作访问时候的WORKDIR路径,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_242 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.53 ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.53 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # ENTRYPOINT ["/usr/1ocal/apache-tomcat-9.0.8/bin/startup.sh" ] # CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh", "run"] CMD /usr/local/apache-tomcat-8.5.53/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.53/bin/logs/catalina.out
Docker生产环境部署和实践
Docker安装Nginx
[root@docker ~]# docker pull nginx [root@docker ~]# docker run --name nginx -p 8081:80 -d nginx
Nginx部署
#创建目录nginx [root@docker ~]# mkdir -p ~/nginx/{www,logs,conf} #拷贝容器内Nginx默认配置文件到本地当前目录下的conf目录 [root@docker ~]# docker cp b2c013828445:/etc/nginx/nginx.conf ~/nginx/conf/ #编辑网页 [root@docker ~]# cat ~/nginx/www/index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>恨君不似江楼月</title> </head> <body> <h1>只有相随</h1> <p>无别离。</p> </body> </html> #映射挂载 [root@docker ~]# docker run -d -p 8082:80 --name nginx-test-web -v ~/nginx/www/:/usr/share/nginx/html -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/log:/var/log/nginx 602e111c06b6 #镜像ID
Docker安装PHP
#拉取官方镜像 [root@docker ~]# docker pull php:5.6-fpm #启动php [root@docker ~]# docker run --name myphp-fpm -v ~/nginx/www:/www -d php:5.6-fpm #修改配置 [root@docker ~]# mkdir nginx/conf/conf.d [root@docker ~]# vim nginx/conf/conf.d/test-php.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name; include fastcgi_params; } } #启动服务 [root@docker ~]# docker run --name runoob-php-nginx -p 8083:80 -d -v ~/nginx/www:/usr/share/nginx/html:ro -v ~/nginx/conf/conf.d:/etc/nginx/conf.d:ro --link myphp-fpm:php nginx #-p 8083:80 端口映射,把nginx中的80映射到本地的8083端口 #~/nginx/www是本地html文件的存储目录,/usr/share/nginx/html是容器内html文件的存储目录 #~/nginx/conf/conf.d是本地nginx配置文件的存储目录,/etc/nginx/conf.d是容器内nginx配置文件的存储目录 #--link myphp-fpm:php 把myphp-fpm的网络并入nginx,并通过修改nginx的/etc/hosts,把域名php映射成127.0.0.1,让nginx通过php:9000访问php-fpm #编辑测试页面 [root@docker ~]# vim nginx/www/index.php <?php echo phpinfo(); ?>
自建私有仓库
本地镜像服务器
仓库配置
[root@dockerhub ~]# docker pull registry [root@dockerhub ~]# docker run -d -v /registry:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest #--restart=always docker服务重启时容器会随之启动 #--privileged=true 扩展权限 #目录映射的目的是防止docker私有仓库这个容器被删除时,仓库里的镜像也会被删除
配置支持http方式推送镜像
docker私有仓库服务器默认是基于https传输,需要在客户端做相关设置,不使用https传输
每一个要使用http方式访问私有镜像仓库的机器上的docker都要配置insecure-registries
[root@docker ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://sopn42m9.mirror.aliyuncs.com"], "insecure-registries":["192.168.213.129:5000"] } [root@docker ~]# systemctl restart docker
上传镜像到镜像仓库
#给hello-world镜像打个tag,表示新的版本 [root@docker ~]# docker tag hello-world 192.168.213.129:5000/hello-world:latest #将新的hello-world镜像上传到私有仓库 [root@docker ~]# docker push 192.168.213.129:5000/hello-world:latest The push refers to repository [192.168.213.129:5000/hello-world] 9c27e219663c: Pushed [root@docker ~]# docker pull 192.168.213.129:5000/hello-world
[root@dockerhub ~]# ls /registry/docker/registry/v2/repositories/ hello-world
harbor的安装使用
简介:
Harbor 是由 VMware 公司中国团队为企业用户设计的 Registry server 开源项目,包括了权限管理(RBAC)、LDAP、审计、管理界面、自我注册、HA 等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。
作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
-
基于角色的访问控制 - 用户与 Docker 镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
-
镜像复制 - 镜像可以在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
-
图形化用户界面 - 用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间。
-
AD/LDAP 支持 - Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。
-
审计管理 - 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
-
国际化 - 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
-
RESTful API - RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
-
部署简单 - 提供在线和离线两种安装工具, 也可以安装到 vSphere 平台(OVA 方式)虚拟设备
搭建harbor
Harbor需要在Docker与Docker-compose组件上运行
Harbor官方地址: https://github.com/goharbor/harbor/releases
先安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 或 curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 新版本 curl -L https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
注:如果上面地址失效,可直接官网去下载 https://github.com/docker/compose/releases
给docker-compose添加执行权限
chmod +x /usr/local/bin/docker-compose
查看docker-compose是否安装成功
$ docker-compose -version docker-compose version 1.25.0, build 0a186604
下载Harbor的压缩包(本次安装 v2.0.1)
wget https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-offline-installer-v2.0.1.tgz
tar -xzf harbor-offline-installer-v2.0.1.tgz mkdir /opt/harbor mv harbor/* /opt/harbor cd /opt/harbor
修改Harbor的配置,没有的话复制harbor.yml.tmpl
vim harbor.yml 修改hostname和port hostname: 192.168.1.1 #harbor服务访问IP/域名,如果需要外网访问,就填外网IP port: 85
注意:修改harbor.yml配置文件后,需要执行./prepare,再重启生效
安装Harbor
./prepare ./install.sh #如果需要支持存储helm的chart包,添加如下参数 ./install.sh --with-chartmuseum
可能会出现的问题一:
✖ Need to upgrade docker package to 17.06.0+.
centos 7 默认安装的docker较低,升级即可
#卸载旧版本 yum -y remove docker* #更新yum源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #查看docker版本 yum list docker-ce --showduplicates | sort -r #安装新版docker即可 yum -y install docker-ce-18.06.3.ce-3.el7 #启动docker systemctl start docker.service
可能会出现的问题二:
vim harbor.yml (注释掉https配置即可)
可能会出现的问题三:
failed to initialize logging driver: dial tcp 127.0.0.1:1514
vim /etc/rsyslog.conf $ModLoad imtcp $InputTCPServerRun 1514 systemctl restart rsyslog.service
然后再重启harbor即可
可能出现的问题四:
Network harbor_harbor Error 0.1s failed to create network harbor_harbor: Error response from daemon: Failed to program FILTER chain: iptables failed: iptables --wait -I FORWARD -o br-8c6a374389d8 -j DOCKER: iptables v1.4.21: Couldn't load target `DOCKER':No such file or directory Try `iptables -h' or 'iptables --help' for more information. (exit status 2)
重启docker即可
systemctl restart docker
harbor后台页面访问
192.168.1.1:85 默认用户名密码admin/Harbor12345 账号密码可在配置文件里修改
启动、停止Harbor
docker-compose up -d 启动 docker-compose stop 停止 docker-compose restart 重新启动
推送镜像验证
先需要将仓库添加到docker配置里面
$ vim /etc/docker/daemon.json { "registry-mirrors": ["https://sopn42m9.mirror.aliyuncs.com"], "insecure-registries": ["192.168.1.1:85"] #填harbor访问地址即可,此处写的什么地址,下面docker登录就用什么地址 } $ systemctl daemon-reload $ systemctl restart docker.service
下载测试镜像
docker pull nginx
给镜像重新打标签
docker tag nginx 192.168.1.1:85/library/nginx:latest
登录Harbor仓库
[root@k8s-n1 harbor]# docker login 192.168.1.1:85 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
退出登录
docker logout 192.168.1.1:85
上传镜像(推送命令格式可在harbor后台查看)
[root@k8s-n1 harbor]# docker push 192.168.1.1:85/library/nginx:latest The push refers to repository [192.168.1.1:85/library/nginx] 6c7de695ede3: Pushed 2f4accd375d9: Pushed ffc9b21953f4: Pushed latest: digest: sha256:8269a7352a7dad1f8b3dc83284f195bac72027dd50279422d363d49311ab7d9b size: 948
$ vim /etc/docker/daemon.json { "insecure-registries": ["192.168.1.1:85"] } $ systemctl restart docker
下载测试镜像
docker pull 192.168.1.1:85/library/nginx:laster
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了