Docker端口映射及创建镜像演示(二)
Docker暴露容器方法
第一种:将容器中的一个端口映射成宿主机中的一个随机端口
第二种:将容器中的一个端口映射成宿主机中的一个端口
第三种:将容器中的一个端口映射成宿主机中的一个特定网卡上的随机端口
第四种:将容器中的一个端口映射成宿主机中的一个特定网卡上的一个端口
【使用多次-p选项可以实现暴露多个端口】
Docker端口映射的四种方法使用演示
第一种:将容器中的一个端口映射成宿主机中的一个随机端口
下面的操作确保虚拟机是在桥接模式
第一步:下载httpd镜像
[root@ken ~]# docker pull httpd
[root@ken ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest 2a51bb06dc8b 12 days ago 132MB
redis latest 55cb7014c24f 5 months ago 83.4MB
第二步:启动httpd容器
–name: 指定容器名
-d: 后台运行
-P: 大写的P,映射随机端口(暴露容器内所有端口,映射到宿主机的随机端口)
–rm: 表示退出容器时删除容器
[root@ken ~]# docker container run --name httpd1 -d -P --rm httpd
第三步:查看端口
可以发现容器内的80端口被指向了宿主机的32768端口
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b02a0dd47b7b httpd "httpd-foreground" 25 seconds ago Up 20 seconds 0.0.0.0:32768->80/tcp httpd1
查看宿主机是否有32768端口
[root@ken ~]# ss -tnl | grep 32768
LISTEN 0 1024 :::32768 :::*
第四步:访问
输入宿主机的IP地址加映射的端口号
通过以上的方法就可以实现外部主机访问一个容器了。
第二种:将容器中的一个端口映射成宿主机中的一个端口
第一步:启动httpd容器
–name:指定容器名称
-d:后台运行
-p:小写的p指定端口,123为宿主机端口,80为容器的端口
–rm:退出容器及删除容器
[root@ken ~]# docker container run --name httpd2 -d -p 1234:80 --rm httpd
第二步:查看端口
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e083fd2915a7 httpd "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:1234->80/tcp httpd2
[root@ken ~]# ss -tnl | grep 1234
LISTEN 0 1024 :::1234 :::*
第三步:访问
输入宿主机IP地址和设置的端口即可访问
第三种:将容器中的一个端口映射成宿主机中的一个特定网卡上的随机端口
第一步:启动httpd容器
指定特定的网卡需要使用小p 后面加上 网卡ip::容器端口
[root@ken ~]# docker container run --name httpd3 -d -p 10.220.5.13::80 --rm httpd
第二步:查看端口
可以看到下面生成了一个随机端口32768
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63060c0e83f0 httpd "httpd-foreground" 7 seconds ago Up 5 seconds 10.220.5.13:32768->80/tcp httpd3
[root@ken ~]# ss -tnl | grep 32768
LISTEN 0 1024 10.220.5.13:32768 *:*
第三步:访问
使用生成的随机端口加上IP 地址即可进行容器的访问
第四种:将容器中的一个端口映射成宿主机中的一个特定网卡上的一个端口
第一步:启动容器
指定特定的网卡需要使用小p 后面加上 网卡ip:宿主机端口:容器端口
这里我指定了使用宿主机的8080端口进行容器端口的映射
[root@ken ~]# docker container run --name httpd3 -d -p 10.220.5.13:8080:80 --rm httpd
第二步:查看端口
[root@ken ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a30717c6df7 httpd "httpd-foreground" 57 seconds ago Up 56 seconds 10.220.5.13:8080->80/tcp httpd3
[root@ken ~]# ss -tnl | grep 8080
LISTEN 0 1024 10.220.5.13:8080 *:*
第三步:浏览器访问
只要输入ip:端口即可进行访问
如果想要暴露一个容器内的多个端口可以使用多个-p
创建自己的镜像仓库
需要在阿里云创建镜像仓库
控制台–》镜像仓库
第一步:创建镜像仓库
点击创建镜像仓库
第二步:填写你的注册信息
第三步:点击本地仓库
第四步:如下就创建好了一个自己的镜像仓库
往阿里云仓库推送和拉取镜像:
1. 登录阿里云Docker Registry
$ sudo docker login --username=kenkendyg registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在产品控制台首页修改登录密码。
2. 从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/kenken/myself:[镜像版本号]
3. 将镜像推送到Registry
$ sudo docker login --username=kenkendyg registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/kenken/myself:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/kenken/myself:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
基于容器创建镜像
获取使用帮助
commit用来基于一个现有容器来创建镜像
[root@ken ~]# docker commit --help Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] Create a new image from a container's changes
参数详解
-a, 作者信息 (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, 将Dockerfile指令应用于创建的映像 (default [])-m, --message string
-m 提交信息
-p, 提交时暂停容器 (default true)
第一步:启动容器
[root@ken ~]# docker container run -it --name busybox1 busybox
第二步:创建则是页面
[root@ken ~]# docker container exec -it busybox1 /bin/sh
/ # mkdir /data
/ # echo "test for my image">/data/index.html
/ # httpd -h /data
/ #
第三步:基于容器创建镜像
[root@ken ~]# docker commit -a "ken" -p -c "CMD ["/bin/httpd","-f","-h","/data"]" busybox1 kenken/httpd1
sha256:29846cdbd83478bc9469b6ad25e76851655072bca6c984eeffedb52a8c8b91c0
第四步:查看镜像
可以看到第一个就是刚才创建的镜像
[root@ken ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
kenken/httpd1 latest 29846cdbd834 23 seconds ago 1.15 MB
docker.io/nginx latest 568c4670fa80 16 hours ago 109 MB
docker.io/redis latest c188f257942c 12 days ago 94.9 MB
docker.io/httpd latest 2a51bb06dc8b 12 days ago 132 MB
docker.io/busybox latest 59788edf1f3e 8 weeks ago 1.15 MB
第五步:往阿里云推送
首先需要登录阿里云
输入的密码是注册的阿里云账号的密码
[root@ken ~]# docker login --username=kenkendyg registry.cn-beijing.aliyuncs.com
Password:
Login Succeeded
第六步:给制作好的镜像打一个标签
29846cdbd834是你的镜像的ID
[root@ken ~]# docker tag 29846cdbd834 registry.cn-beijing.aliyuncs.com/kenken/httpd:v1
第七步:推送镜像
[root@ken ~]# docker push registry.cn-beijing.aliyuncs.com/kenken/httpd:v1
The push refers to a repository [registry.cn-beijing.aliyuncs.com/kenken/httpd]
b4a60ebae046: Pushed
8a788232037e: Pushed
v1: digest: sha256:88008e08275bc85dbbef8f770d66cdec5cf96e86e4ad5e2a38c5b5a8c1b2e57f size: 734
第八步:在阿里云查看
首先点击管理
点击镜像 版本即可查看
第九步:拉取阿里云镜像到本地
拉取镜像需要在另一台主机上面登录阿里云
[root@ken ~]# docker login --username=kenkendyg registry.cn-beijing.aliyuncs.com
Password:
Login Succeeded
[root@ken ~]# docker pull registry.cn-beijing.aliyuncs.com/kenken/httpd:v1
v1: Pulling from kenken/httpd
90e01955edcd: Already exists
3d5cd4fa148f: Pull complete
Digest: sha256:88008e08275bc85dbbef8f770d66cdec5cf96e86e4ad5e2a38c5b5a8c1b2e57f
Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/kenken/httpd:v1
[root@ken ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-beijing.aliyuncs.com/kenken/httpd v1 29846cdbd834 17 minutes ago 1.15MB
nginx latest 568c4670fa80 17 hours ago 109MB
httpd latest 2a51bb06dc8b 12 days ago 132MB
busybox latest 59788edf1f3e 8 weeks ago 1.15MB
redis latest 55cb7014c24f 5 months ago 83.4MB
实现容器的底层技术
为了更好地理解容器的特性,我们将讨论容器的底层实现技术。
cgroup 和 namespace 是最重要的两种技术。cgroup 实现资源限额, namespace 实现资源隔离。
cgroup
cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。
cgroup 到底长什么样子呢?我们可以在 /sys/fs/cgroup 中找到它。还是用例子来说明,启动一个容器,设置内存为512M
在 /sys/fs/cgroup/memory/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名:
对内存使用限制
Docker 可以通过 -c 或 –cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例
换句话说:通过 cpu share 可以设置容器使用 CPU 的优先级。
比如在 host 中启动了两个容器:
docker run –name “containerA” -c 1024 httpd
docker run –name “containerB” -c 512 httpd
containerA 的 cpu share 1024,是 containerB 的两倍。当两个容器都需要 CPU 资源时,containerA 可以得到的 CPU 是 containerB 的两倍。
需要特别注意的是,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 containerA 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU。
可以在这里找到设置的cpu
[root@ken1 ~]# cat /sys/fs/cgroup/cpu/docker/a1f00b2682796ec9d0c64c8356645ecaeba95c622b4d306124c01d17fd9e5829/cpu.shares
512
namespace
在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使 host 上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。
Linux 实现这种方式的技术是 namespace。namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。
Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User,下面我们分别讨论。
Mount namespace
Mount namespace 让容器看上去拥有整个文件系统。
容器有自己的 /
目录,可以执行 mount
和 umount
命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。
UTS namespace
简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h
或 --hostname
参数设置。
IPC namespace
IPC namespace 让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起。
PID namespace
容器在 host 中以进程的形式运行。容器内进程的 PID 不同于 host 中对应进程的 PID,容器中 PID=1 的进程当然也不是 host 的systemd进程。也就是说:容器拥有自己独立的一套 PID,这就是 PID namespace 提供的功能。
Network namespace
Network namespace 让容器拥有自己独立的网卡、IP、路由等资源。
User namespace
User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。
Continue Reading
Docker端口映射及创建镜像演示(二)的更多相关文章
- Docker端口映射及创建镜像演示(二)--技术流ken
前言 在上一篇博客<Docker介绍及常用操作演示--技术流ken>中,已经详细介绍了docker相关内容以及有关镜像和容器的使用命令演示. 现在我们已经可以自己下载镜像,以及创建容器了. ...
- [转]Docker基础-使用Dockerfile创建镜像
本文转自:https://www.cnblogs.com/jie-fang/p/7927643.html 1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # T ...
- Docker基础-使用Dockerfile创建镜像
1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # This dockerfile uses the ubuntu image # VERSION 2 - ED ...
- Docker端口映射
Docker端口映射是指将容器内应用的服务端口映射到本机宿主机器.当要在宿主机外部访问Docker内部应用时,需要对容器内应用端口进行映射. 一.容器启动时指定端口映射 容器运行时可以通过-p 或 - ...
- docker 端口映射错误解决方法
今天搞了半天shipyard,在网页上打开时无法显示容器和镜像,最后发现是docker端口映射错误,由于防火墙未关闭: 4月 12 18:51:29 localhost firewalld[757]: ...
- Docker构建nginx+uwsgi+flask镜像(二)
Dockerfile搭建环境并打包应用 在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask ...
- 【Docker端口映射】
Docker端口映射即将容器内开放的端口映射到宿主机端口,以实现外部网络的访问. 首先,我们先下载用于测试端口映射的镜像: [root@fedora ~]# docker pull training/ ...
- 详解Docker 端口映射与容器互联
详解Docker 端口映射与容器互联 1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行 ...
- docker端口映射,批量删除容器
docker端口映射 http://blog.csdn.net/yjk13703623757/article/details/69212521 批量删除容器 http://blog.csdn.net/ ...
随机推荐
- 使用openpyxl创建excel,设置不显示网格线
最近在学openpyxl,想设置excel不显示网格线,试了好多种方法都不行,最后发现可以通过修改views文件来实现. 文件路径:虚拟目录\Lib\site-packages\openpyxl\wo ...
- NOIP2007 树网的核 [提高组]
题目:树网的核 网址:https://www.luogu.com.cn/problem/P1099 题目描述 设 T=(V,E,W)T=(V,E,W) 是一个无圈且连通的无向图(也称为无根树),每条边 ...
- Ubuntu 20.04美化及QQ、微信安装
1.前言 电脑用了很多年了,安装的windows7,经常出现很卡的情况,于是今天索性重装了系统.既然重装系统,选择什么系统好呢,windows10系统的话,对于我这老旧本来说,可能真的是为难它了.刚好 ...
- HTTP基础 --响应
响应,由服务端返回给客户端,分为三部分:响应状态码(Response Status Code),响应头(Response Headers)和响应体(Response Body). 响应状态码 响应服务 ...
- 区块链入门到实战(26)之以太坊(Ethereum) – 挖矿
以太坊(Ethereum)与其他公共区块链一样,使用工作量证明机制确保区块链网络正常运行. 矿工进行工作量证明计算,即挖矿,来选择区块,写入区块链,确认交易. 交易过程如下图所示: 从技术角度来看,以 ...
- Fiddler扩展——导出Jmeter脚本
前言 Fiddler,对于大家而言,应该早已耳熟能详,是个抓包神器,具体的使用,我就不多说了.如果对Fiddler的使用还不太熟练,可以翻看我以前一系列的博文.我罗列出来,方便大家阅读,如下所示: 1 ...
- session 机制和 httpsession 详解 (转载)
https://www.cnblogs.com/bjanzhuo/archive/2013/02/27/3575884.html 一.术语session 在我的经验里,session这个词被滥用的程度 ...
- JavaScript面向对象的学习
1.面向过程与面向对象 1.1面向过程 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了. 1.2面向对象 面向对象是把事务分解成为一个 ...
- Zigzags CodeForces - 1400D
给出一组数: 寻找四元组的个数 (i,j,k,l)其中a[i]=a[k],并且a[j]=a[l] 刚看到这个题的时候想到了记录每个数的个数,然后求前缀和以及后缀和.先枚举i和k,当a[i]和a[k]相 ...
- vue 中使用echarts
前言:在vue2.0中使用百度echarts有三种解决方案. 一.原始方法直接使用 这样每次都要获取图表dom元素 然后通过setOption渲染数据,最后在mounted中初始化.很麻烦. < ...