提示:学习本章内容会用到VMware Workstation Pro和FinalShell软件 。
软件下载链接:https://pan.baidu.com/s/1ojCC_E6CMgFcloDc8dOD0A
提取码:1468
课程文档下载链接:链接:https://pan.baidu.com/s/1R4qGGqUMC8ra5Tz9rIXa4w
提取码:1468
项目部署存在的问题
Docker如何解决依赖的兼容问题
Docker如何解决不同系统环境的问题
小结
Docker是一个快速交付应用、运行应用的技术:
镜像和容器:基于镜像去创建容器,容器可从镜像中读数据
镜像就是硬盘中的文件(镜像只能读,容器在运行过程中不能往镜像写东西,而是将镜像中存放数据的文件复制一份到容器,再将内容写到容器中文件里面)
进程就是容器(如将mysql跑起来的这个进程就是容器),只不过Docker会给容器做隔离,对外不可见
如何将镜像分享出去呢?
答:使用DockerHub镜像托管服务,所有这类的服务统称为DockerRegistry
DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
问题:怎么用docker完成镜像构建、远程拉去镜像、如何运行容器呢?
Docker是一个CS架构的程序,由两部分组成:
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器,完成镜像、容器的各自操作等
客户端(client):通过命令(本地)或RestAPI(远程)向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
一个镜像可以运行多个容器,形成集群
小结
镜像相关命令
镜像操作命令
CRUD
命令记不住怎么办?
在终端输入docker --help即可查看到所有docker命令以及对应解释
还可以进一步查看 images命令
案例一
拉取nginx镜像:docker pull nginx
案例二
先将本地镜像保存到压缩文件tar: docker save -o nginx.tar nginx:latest
再删除本地镜像: docker rmi nginx:latest
再将tar加载成镜像: docker load -i nginx.tar
记不住命令,就查看帮助文档:docker 命令 --help
比如 docker push --help
小结
练习一
[root@localhost ~]# ll
总用量 142488
-rw-r--r--. 1 root root 0 1月 30 17:05 {
-rw-r--r--. 1 root root 0 1月 30 17:05 }
-rw-------. 1 root root 1440 1月 26 21:38 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 1月 30 17:05 EOF
-rw-------. 1 root root 145902080 1月 31 08:56 nginx.tar
-rw-r--r--. 1 root root 0 1月 30 17:05 registry-mirrors:
[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
redis latest 7614ae9453d1 2 years ago 113MB
[root@localhost ~]# docker save --help
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Aliases:
docker image save, docker save
Options:
-o, --output string Write to a file, instead of STDOUT
[root@localhost ~]# docker save -o redis.tar redis:latest
[root@localhost ~]# ll
总用量 256064
-rw-r--r--. 1 root root 0 1月 30 17:05 {
-rw-r--r--. 1 root root 0 1月 30 17:05 }
-rw-------. 1 root root 1440 1月 26 21:38 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 1月 30 17:05 EOF
-rw-------. 1 root root 145902080 1月 31 08:56 nginx.tar
-rw-------. 1 root root 116301312 1月 31 09:34 redis.tar
-rw-r--r--. 1 root root 0 1月 30 17:05 registry-mirrors:
[root@localhost ~]# docker rmi redis:latest
Untagged: redis:latest
Untagged: redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Deleted: sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631
Deleted: sha256:49c70179bc923a7d48583d58e2b6c21bde1787edf42ed1f8de9e9b96e2e88e65
Deleted: sha256:396e06df5d1120368a7a8a4fd1e5467cdc2dd4083660890df078c654596ddc1c
Deleted: sha256:434d118df2e9edb51238f6ba46e9efdfa21be68e88f54787531aa39a720a0740
Deleted: sha256:2047f09c412ff06f4e2ee8a25d105055e714d99000711e27a55072e640796294
Deleted: sha256:13d71c9ccb39b206211dd1900d06aa1984b0f5ab8abaa628c70b3eb733303a65
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
[root@localhost ~]# docker load --help
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Aliases:
docker image load, docker load
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
[root@localhost ~]# docker load -i redis.tar
9b24afeb7c2f: Loading layer [==================================================>] 338.4kB/338.4kB
4b8e2801e0f9: Loading layer [==================================================>] 4.274MB/4.274MB
529cdb636f61: Loading layer [==================================================>] 27.8MB/27.8MB
9975392591f2: Loading layer [==================================================>] 2.048kB/2.048kB
8e5669d83291: Loading layer [==================================================>] 3.584kB/3.584kB
Loaded image: redis:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
redis latest 7614ae9453d1 2 years ago 113MB
[root@localhost ~]#
docker run:创建一个容器,并让容器处于运行状态
使用docker exec -it xxx xxx
命令进入容器,在容器内修改文件是不推荐的。后面会学数据卷,用来解决这个问题
案例一:创建运行一个Nginx容器
docker run --name mn -p 80:80 -d nginx:latest
访问宿主机(我用的是虚拟机)ip,得到以下结果
查看该容器日志:
docker logs mn
但是这个并不会持续输出日志
docker logs --help
查看帮助文档,发现-f 可以实现持续日志输出
ctrl+c
停止日志跟踪
小结
案例二
docker exec -it mn bash
exit
退出容器
nginx的HTML所在目录是由dockerhub官方规定的,在官网文档中能查看到所在目录地址
因为docker容器中没有vi vim命令,因此用sed替换命令来实现需求
停止mn容器 docker stop mn
展示所有容器 docker ps -a
重启mn容器 docker start mn
删除mn容器 docker rm -f mn
小结
容器练习
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
#官网告诉我们的命令
[root@localhost ~]# docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
06343c521ba4b54bb16b881355f60f3b70ecbb93f45c59a26fddc231fafb8836
[root@localhost ~]# docker exec -it mr bash
root@06343c521ba4:/data# redis-cli //进入redis-cli客户端
127.0.0.1:6379> set num 666
OK
127.0.0.1:6379> get num
"666"
127.0.0.1:6379>
在redis客户端可以看到缓存的num=666
也可以直接执行
[root@localhost ~]# docker exec -it mr redis-cli //直接进入redis-cli
127.0.0.1:6379> set num 666
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录
删除容器,不会删除数据卷
操作数据卷
语法:docker volume 命令
docker volume inspect 数据卷名
可以查到该数据卷对应在宿主机中的文件路径
案例一
删除数据卷
[root@localhost ~]# docker volume prune //删除所有未使用的数据卷
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
[root@localhost ~]# docker volume rm html //删除指定数据卷
html
挂在数据卷—将数据卷挂载到容器中(建立容器与宿主机联系)
docker run --name 容器名 -p 宿主机端口:容器端口 -v 数据卷名:容器目录 -d nginx/redis/mysql等
案例一
docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx
//-d表示后台运行
大多数时我们不必自己创建数据卷因为该命令会自动创建html数据卷(当没有html数据卷时),但是nginx镜像一定要存在(nginx这样写默认就是用latest版本也可这样写 nginx:版本号)
案例二
命令
###官方给的命名缺少端口,和数据卷挂载,-p -v自己写 -v:后的去hubdocker官网查找
docker run \ --name mmysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3306:3306 \ -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ -v /tmp/mysql/data:/var/lib/mysql \ -d \ mysql:5.7.25
操作命令
[root@localhost _data]# cd /tmp
[root@localhost tmp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
redis latest 7614ae9453d1 2 years ago 113MB
[root@localhost tmp]# docker load -i mysql.tar
5dacd731af1b: Loading layer [==================================================>] 58.45MB/58.45MB
f411d8bde01c: Loading layer [==================================================>] 338.4kB/338.4kB
0aa7d65147ef: Loading layer [==================================================>] 10.44MB/10.44MB
3437f67a712b: Loading layer [==================================================>] 4.472MB/4.472MB
ec41e34b35a0: Loading layer [==================================================>] 1.536kB/1.536kB
458d25c646d8: Loading layer [==================================================>] 46.15MB/46.15MB
97874ea0e7f9: Loading layer [==================================================>] 31.74kB/31.74kB
5075b9328698: Loading layer [==================================================>] 3.584kB/3.584kB
364557e875f1: Loading layer [==================================================>] 257.3MB/257.3MB
9209148debed: Loading layer [==================================================>] 9.728kB/9.728kB
82582edf9553: Loading layer [==================================================>] 1.536kB/1.536kB
Loaded image: mysql:5.7.25
[root@localhost tmp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
redis latest 7614ae9453d1 2 years ago 113MB
mysql 5.7.25 98455b9624a9 4 years ago 372MB
[root@localhost tmp]# mkdir -p mysql/data
[root@localhost tmp]# mkdir -p mysql/conf
[root@localhost tmp]# docker run \
> --name mmysql \
> -e MYSQL_ROOT_PASSWORD=123456 \
> -p 3306:3306 \
> -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
> -v /tmp/mysql/data:/var/lib/mysql \
> -d \
> mysql:5.7.25
dbc5c2d36ceb24b1fbe6e23ea23ab49875e52448b8d411dfc2ee69f824e342f6
[root@localhost tmp]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbc5c2d36ceb mysql:5.7.25 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mmysql
5b469339c8bb nginx "/docker-entrypoint.…" 18 hours ago Up 18 hours 0.0.0.0:80->80/tcp, :::80->80/tcp mn
06343c521ba4 redis "docker-entrypoint.s…" 19 hours ago Up 19 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp mr
数据卷挂载与目录挂载对比
数据卷挂载:隐藏细节(创建数据卷,并不能指定数据卷所对应宿主机的位置),不方便管理
目录挂载:自己创建宿主机目录,方便管理
小结
镜像是由应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
什么是 Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令 (Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./mysql-5.7.rpm /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目
创建镜像:docker build -t javaweb:1.0
命令如下
[root@localhost /]# cd /tmp
[root@localhost tmp]# mkdir docker-demo
[root@localhost tmp]# cd docker-demo
[root@localhost docker-demo]# ll
总用量 0
将文件拖拽进入虚拟机文件夹
[root@localhost docker-demo]# ll
总用量 206192
-rw-r--r--. 1 root root 25620395 2月 1 10:38 docker-demo.jar
-rw-r--r--. 1 root root 494 2月 1 10:38 Dockerfile
-rw-r--r--. 1 root root 185515842 2月 1 10:39 jdk8.tar.gz
[root@localhost docker-demo]# docker build -t javaweb:1.0 . //生成javaweb:1.0镜像 .代表Dockfile文件路径在本地
[+] Building 62.8s (9/9) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.4s
=> => transferring dockerfile: 591B 0.2s
=> [internal] load metadata for docker.io/library/ubuntu:16.04 16.6s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/4] FROM docker.io/library/ubuntu:16.04@sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c 25.8s
=> => resolve docker.io/library/ubuntu:16.04@sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c 0.4s
=> => sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c 1.42kB / 1.42kB 0.0s
=> => sha256:a3785f78ab8547ae2710c89e627783cfa7ee7824d3468cae6835c9f4eae23ff7 1.15kB / 1.15kB 0.0s
=> => sha256:b6f50765242581c887ff1acc2511fa2d885c52d8fb3ac8c4bba131fd86567f2e 3.36kB / 3.36kB 0.0s
=> => sha256:58690f9b18fca6469a14da4e212c96849469f9b1be6661d2342a4bf01774aa50 46.50MB / 46.50MB 10.1s
=> => sha256:b51569e7c50720acf6860327847fe342a1afbe148d24c529fb81df105e3eed01 857B / 857B 0.9s
=> => sha256:da8ef40b9ecabc2679fe2419957220c0272a965c5cf7e0269fa1aeeb8c56f2e1 528B / 528B 1.0s
=> => sha256:fb15d46c38dcd1ea0b1990006c3366ecd10c79d374f341687eb2cb23a2c8672e 170B / 170B 1.4s
=> => extracting sha256:58690f9b18fca6469a14da4e212c96849469f9b1be6661d2342a4bf01774aa50 14.4s
=> => extracting sha256:b51569e7c50720acf6860327847fe342a1afbe148d24c529fb81df105e3eed01 0.0s
=> => extracting sha256:da8ef40b9ecabc2679fe2419957220c0272a965c5cf7e0269fa1aeeb8c56f2e1 0.0s
=> => extracting sha256:fb15d46c38dcd1ea0b1990006c3366ecd10c79d374f341687eb2cb23a2c8672e 0.0s
=> [internal] load build context 21.0s
=> => transferring context: 211.19MB 21.0s
=> [2/4] COPY ./jdk8.tar.gz /usr/local/ 2.5s
=> [3/4] COPY ./docker-demo.jar /tmp/app.jar 0.4s
=> [4/4] RUN cd /usr/local && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_144 ./java8 13.2s
=> exporting to image 3.3s
=> => exporting layers 3.3s
=> => writing image sha256:4031bf03fcfb669dfe100efac05f86f407d6a4d27e2445d0538203e83dde5e4a 0.0s
=> => naming to docker.io/library/javaweb:1.0 0.0s
[root@localhost docker-demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
javaweb 1.0 4031bf03fcfb 14 seconds ago 722MB
nginx latest 605c77e624dd 2 years ago 141MB
redis latest 7614ae9453d1 2 years ago 113MB
mysql 5.7.25 98455b9624a9 4 years ago 372MB
[root@localhost docker-demo]# docker run --name web -p 8090:8090 -d javaweb:1.0 //将javaweb:1.0镜像运行成一个容器
9d93fa8812dedc6e2f9fe526744b17db628c79f097262b8a56bbb28c0929458c
[root@localhost docker-demo]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d93fa8812de javaweb:1.0 "/bin/sh -c 'java -j…" 11 seconds ago Up 7 seconds 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp web
dbc5c2d36ceb mysql:5.7.25 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mmysql
5b469339c8bb nginx "/docker-entrypoint.…" 19 hours ago Up 19 hours 0.0.0.0:80->80/tcp, :::80->80/tcp mn
06343c521ba4 redis "docker-entrypoint.s…" 20 hours ago Up 20 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp mr
[root@localhost docker-demo]#
最后访问 http://192.168.83.130:8090/hello/count ,其中的ip为你的虚拟机ip
上述案例存在一些问题
在dockerfile中存在大量的数据可复用,若我要执行多个java微服务 按这样岂不是每个微服务都要配置环境变量,很麻烦,能不能把配置环境变量,Jdk安装等可复用的步骤形成一个新的镜像。以后部署微服务只要在这个镜像上接着执行就好了
答:能 基于java:8-alpine镜像(别人已经给我们做好了)
先更新Dockerfile
将这三个资料传入虚拟机一个文件夹中(我用的是 /tmp/docker-demo1)
然后在虚拟机中执行以下命令,跟上述类似
[root@localhost /]# cd /tmp/docker-demo1
[root@localhost docker-demo1]# docker build -t javaweb:2.0 . //创建javaweb:2.0 镜像
[+] Building 32.9s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 278B 0.0s
=> [internal] load metadata for docker.io/library/java:8-alpine 16.1s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 1.4s
=> => transferring context: 25.63MB 1.4s
=> [1/2] FROM docker.io/library/java:8-alpine@sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f 14.5s
=> => resolve docker.io/library/java:8-alpine@sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f 0.0s
=> => sha256:d49bf8c44670834d3dade17f8b84d709e7db47f1887f671a0e098bafa9bae49f 947B / 947B 0.0s
=> => sha256:3fd9dd82815ca4510a34bafef556815c440bcff37827d8495639137aeb145a36 3.29kB / 3.29kB 0.0s
=> => sha256:7095154754192bfc2306f3b2b841ef82771b7ad39526537234adb1e74ae81a93 2.31MB / 2.31MB 0.7s
=> => sha256:38a1c0aaa6fda9a4f5f940c5c7a0622430f1faac9de367016cd5a0aed8ef4478 228B / 228B 0.9s
=> => sha256:5b58c996e33ea9b6701cb8935434be70cb9e5908d81a81f360b47e6f9394a1d7 49.36MB / 49.36MB 8.7s
=> => extracting sha256:7095154754192bfc2306f3b2b841ef82771b7ad39526537234adb1e74ae81a93 0.7s
=> => extracting sha256:38a1c0aaa6fda9a4f5f940c5c7a0622430f1faac9de367016cd5a0aed8ef4478 0.1s
=> => extracting sha256:5b58c996e33ea9b6701cb8935434be70cb9e5908d81a81f360b47e6f9394a1d7 5.7s
=> [2/2] COPY ./docker-demo.jar /tmp/app.jar 1.5s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:e93f16c6deeff9b2b657be33baa902f8c7dfda98e5217d10798aa6d858e2f776 0.0s
=> => naming to docker.io/library/javaweb:2.0 0.0s
[root@localhost docker-demo1]# docker run --name web2 -p 8091:8090 -d javaweb:2.0 //将javaweb:2.0镜像运行成容器web2
8effb72404119f6b8dceb553adf24874db972df17ee050471ea4033fe082a934
[root@localhost docker-demo1]# docker ps -a //查看存在
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8effb7240411 javaweb:2.0 "/bin/sh -c 'java -j…" 7 seconds ago Up 5 seconds 0.0.0.0:8091->8090/tcp, :::8091->8090/tcp web2
9d93fa8812de javaweb:1.0 "/bin/sh -c 'java -j…" 24 minutes ago Up 24 minutes 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp web
dbc5c2d36ceb mysql:5.7.25 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mmysql
5b469339c8bb nginx "/docker-entrypoint.…" 20 hours ago Up 20 hours 0.0.0.0:80->80/tcp, :::80->80/tcp mn
06343c521ba4 redis "docker-entrypoint.s…" 21 hours ago Up 21 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp mr
[root@localhost docker-demo1]#
然后访问http://192.168.83.130:8091/hello/count
小结
•Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
•Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行
•DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
安装DockerCompse 参考Docker安装笔记
DockerCompose 有什么作用?答:集群的快速构建和部署
案例:将cloud-demo微服务集群利用DockerCompose部署
微服务地址不向外暴露,只向外暴露网关(网关是微服务的入口)
例如
进入虚拟机的cloud-demo文件夹中
一键部署 docker-compose up -d
查看全部日志 docker-compose logs
查看某个服务日志docker-compose logs -f userservice
重启微服务 docker-compose restart gateway userservice orderservice
注意:先部署nacos再部署其他微服务,因为其他微服务要在nacos中注册
有公共和私有两种形式,dockerhub就是一个公共的镜像仓库。但企业需要私有镜像仓库
搭建好了以后,在浏览器输入http://192.168.83.130:8080/
#重新tag本地镜像 名称前缀为私有仓库地址
[root@localhost registry-ui]# docker tag redis:latest 192.168.83.130:8080/redis:1.0
#推送镜像
[root@localhost registry-ui]# docker push 192.168.83.130:8080/redis:1.0
#拉取镜像
[root@localhost registry-ui]# docker pull 192.168.83.130:8080/redis:1.0
点击下方按钮会自动帮你复制拉取命令 docker pull 192.168.83.130:8080/redis:1.0 拉取到docker
使用docker images 能查看拉取到的镜像
小结