Docker 的另外两个话题: DockerHub 和 容器网络
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料。
Hello,大家好,我是子悠,作为本周的小编昨天已经跟大家介绍过自己了,今天就让我们继续学习江南一点雨( 其实江南最近好多雨,哈哈)的 Docker 系列文章吧。下面是正文。
通过前面的学习,大家对于 Docker 的基本操作相信已经基本掌握了,本文就来和大家说说关于 Docker 的另外两个话题: DockerHub 和 容器网络!
本文是本系列的第五篇,阅读前面的文章有助于更好的理解本文:
DockerHub
DockerHub 类似于 GitHub 提供的代码托管服务,Docker Hub 提供了镜像托管服务,Docker Hub 地址为 https://hub.docker.com/。
利用 Docker Hub 读者可以搜索、创建、分享和管理镜像。Docker Hub 上的镜像分为两大类,一类是官方镜像,例如我们之前用到的 nginx、mysql 等,还有一类是普通的用户镜像,普通用户镜像由用户自己上传。对于国内用户,如果觉得 Docker Hub 访问速度过慢,可以使用国内一些公司提供的镜像,例如网易:
https://c.163yun.com/hub#/m/home/
本文使用官方的 Docker Hub 来演示,读者有兴趣可以尝试网易的镜像站。
首先读者打开 Docker Hub ,注册一个账号,这个比较简单,我就不赘述了。
账号注册成功之后,在客户端命令行可以登录我们刚刚注册的账号,如下:
看到 Login Succeeded 表示登录成功!
登录成功之后,接下来就可以使用 push 命令上传我们自制的镜像了。注意,自制的镜像要能够上传,命名必须满足规范,即 namespace/name 格式,其中 namespace 必须是用户名,以前文我们创建的 Dockerfile 为例,这里重新构建一个本地镜像并上传到 Docker Hub ,如下:
首先调用 docker build 命令重新构建一个本地镜像,构建成功后,通过 docker images 命令可以看到本地已经有一个名为 wongsung/nginx 的镜像,接下来通过 docker push 命令将该镜像上传至服务端。上传成功后,用户登录Docker Hub ,就可以看到刚刚的镜像已经上传成功了,如下:
看到这个表示镜像已经上传成功了,接下来,别人就可以通过如下命令下载我刚刚上传的镜像:
docker pull wongsung/nginx
pull下来之后,就可以直接根据该镜像创建容器了。具体的创建过程读者可以参考我们本系列前面的文章。
自动化构建
自动化构建,就是使用 Docker Hub 连接一个包含 Dockerfile 文件的 GitHub 仓库或者 BitBucket 仓库, Docker Hub 则会自动构建镜像,通过这种方式构建出来的镜像会被标记为 Automated Build ,也称之为受信构建 (Trusted Build) ,这种构建方式构建出来的镜像,其他人在使用时可以自由的查看 Dockerfile 内容,知道该镜像是怎么来的,同时,由于构建过程是自动的,所以能够确保仓库中的镜像都是最新的。具体构建步骤如下:
添加仓库
首先登录到 Docker Hub,点击右上角的 Create,然后选择 Create Automated Build ,如下图:
则新进入到的页面,选择 Link Account 按钮,然后,选择连接 GitHub ,在连接方式选择页面,我们选择第一种连接方式,如下:
选择完成后,按照引导登录 GitHub ,完成授权操作,授权完成后的页面如下:
构建镜像
授权完成后,再次点击右上角的 Create 按钮,选择 Create Automated Build ,在打开的页面中选择 GitHub ,如下两张图:
这里展示了刚刚关联的 GitHub 上的仓库,只有一个 docker ,然后点击进去,如下:
填入镜像的名字以及描述,然后点击 Create 按钮,创建结果如下:
如此之后,我们的镜像就算构建成功了,一旦 GitHub 仓库中的 Dockerfile 文件有更新, Docker Hub 上的镜像构建就会被自动触发,不用人工干预,从而保证镜像始终都是最新的。
接下来,用户可以通过如下命令获取镜像:
docker pull wongsung/nginx2
获取到镜像之后,再运行即可。
有没有觉得很神奇!镜像更新只要更新自己的 GitHub 即可。镜像就会自动更新!事实上,我们使用的大部分 镜像都是这样生成的。
构建自己的 DockerHub
前面我们使用的 Docker Hub 是由 Docker 官方提供的,我们也可以搭建自己的 Docker Hub ,搭建方式也很容器,因为 Docker 官方已经将 Docker 注册服务器做成镜像了,我们直接 pull 下来运行即可,没有没很酷!。具体步骤如下:
拉取镜像
运行如下命令拉取registry官方镜像:
docker pull registry
运行
接下来运行如下命令将registry运行起来,如下:
docker run -itd --name registry -p 5000:5000 2e2f252f3c88
运行成功后,我们就可以将自己的镜像提交到registry上了,如下:
这里需要注意的是,本地镜像的命名按照 registryHost:registryPort/imageName:tag 的格式命名。
容器运行在宿主机上,如果外网能够访问容器,才能够使用它提供的服务。本文就来了解下容器中的网络知识。
暴露网络端口
在前面的文章中,我们已经有用过暴露网络端口相关的命令了,即 -p 参数,实际上,Docker 中涉及暴露网络端口的参数有两个,分别是 -p 和 -P 。下面分别来介绍。
-P
使用 -P,Docker 会在宿主机上随机为应用分配一个未被使用的端口,并将其映射到容器开放的端口,以 Nginx 为例,如下:
可以看到,Docker 为应用分配了一个随机端口 32768 ,使用该端口即可访问容器中的 nginx(http://lcalhost:32768)。
-p
-p 参数则有几种不同的用法:
hostPort:containerPort
这种用法是将宿主机端口和容器端口绑定起来,如下用法:
如上命令表示将宿主机的80端口映射到容器的80上,第一个 80 是宿主机的 80 ,第二个 80 是容器的 80 。
ip:hostPort:containerPort
这种是将指定的 ip 地址的端口和容器的端口进行映射。如下:
将 192.168.0.195 地址的80端口映射到容器的80端口上。
ip::containerPort
这种是将指定 ip 地址的随机端口映射到容器的开放端口上,如下:
总结
本文主要向大家介绍了 DockerHub 和容器网络,DockerHub 是我们容器的集散中心,网络则使我们的容器有办法对外提供服务。
参考资料:
[1] 曾金龙,肖新华,刘清.Docker开发实践[M].北京:人民邮电出版社,2015.
Java 极客技术公众号,是由一群热爱 Java 开发的技术人组建成立,专注分享原创、高质量的 Java 文章。如果您觉得我们的文章还不错,请帮忙赞赏、在看、转发支持,鼓励我们分享出更好的文章。
推荐阅读
面试系列
Docker 系列
Docker 的另外两个话题: DockerHub 和 容器网络的更多相关文章
- 【转】理解Docker容器网络之Linux Network Namespace
原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...
- web项目docker化的两种方法
标题所讲的两种方法其实就是创建docker镜像的两种方法 第一种:启动镜像后进入容器中操作,将需要的软件或者项目移动到容器中,安装或者部署,然后退出即可 第二种:编写dockerfile,将需要的镜像 ...
- 两台主机间docker容器网络互通
服务器1: 网络172.30.0.0/16 服务器2: 网络172.31.0.0/16 服务器1和服务器2上的docker容器网络之间是无法互通的,如果需要互通,需要做以下配置: 服务器1上执行: i ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- Docker的单主机容器网络
作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...
- 理解Docker单机容器网络
在” 理解Docker单机容器网络 “一文中,还有一个Docker容器网络的功能尚未提及,那就是Docker容器的端口映射.即将容器的服务端口P’ 绑定到宿主机的端口P上,最终达到一种效果:外部程序通 ...
- docker常规操作——启动、停止、重启容器实例
一.启动一个已经停止的容器实例 docker start 容器ID或容器名,建议使用容器ID,容器ID支持模糊查询而容器名称不支持1. 先查看已经暂停的容器实例信息 2. 通过docker start ...
- docker容器网络
1.我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=host指定 · containe ...
- 5、Docker容器网络
使用Linux进行IP层网络管理的指 http://linux-ip.net/html/ # yum install iproute http://linux-ip.net/html/tool ...
随机推荐
- 利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法
1.利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法 首先判断字符串的长度是否为0,如果是,直接返回字符串 第二,循环判断字符串的首部是否有空格,如 ...
- php如何定义数组常量
是这样吗?<?php define('BEST_PHPER',array('name'=>'巩文','address'=>'china')); My God,明确告诉你不可以:原因是 ...
- Hive入门(三)分桶
1 什么是分桶 上一篇说到了分区,分区中的数据可以被进一步拆分成桶,bucket.不同于分区对列直接进行拆分,桶往往使用列的哈希值进行数据采样.在分区数量过于庞大以至于可能导致文件系统崩溃时,建议使用 ...
- Codeforces 758A:Holiday Of Equality(水题)
http://codeforces.com/problemset/problem/758/A 题意:给出n个值,求这里面每个值都要变成最大的那个数,总共需要加上多少. 思路:找出最大的直接算. #in ...
- springMVC java.lang.IllegalStateException: getOutputStream() has already bee
在导出文件的时候,一直报这个错误. 网上一般的做法是out.clear();或者使用servlet或者Action返回null. 试过了这些方法都不成功. 最后直到试了在jsp重定向的方法才成功了. ...
- C# “从元数据”
所谓元数据.其实是指由微软所封装的类..这些类你可以查看.但是无法修改. 元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述.将您的代码编译 ...
- C语言实现-航空订票系统(飞机订票系统)
开发环境:CodeBlocks 开发语言:C 实现功能:登录,订票,退票 数据存储:文本读写 涉及文件: 相关文件下载: 码云:https://gitee.com/ikaros-521/c_pro ...
- 大话Spark(9)-源码之TaskScheduler
上篇文章讲到DAGScheduler会把job划分为多个Stage,每个Stage中都会创建一批Task,然后把Task封装为TaskSet提交到TaskScheduler. 这里我们来一起看下Tas ...
- C++学习书籍推荐《More Exceptional C++》下载
百度云及其他网盘下载地址:点我 编辑推荐 <More Exceptional C++:40个新的工程难题.编程疑问及解决方法(中文版)>作为广为人知的<Exceptional C++ ...
- C# 管道式编程
受 F# 中的管道运算符和 C# 中的 LINQ 语法,管道式编程为 C# 提供了更加灵活性的功能性编程.通过使用 扩展函数 可以将多个功能连接起来构建成一个管道. 前言 在 C# 编程中,管道式编程 ...