前言
在上一篇博客《Docker介绍及常用操作演示--技术流ken》中,已经详细介绍了docker相关内容以及有关镜像和容器的使用命令演示。
现在我们已经可以自己下载镜像,以及创建容器了。
但是现在有这样一个问题,我们创建的容器可以被其他人或者另外一台服务器访问吗?
基于上一篇博客中容器的创建,那样的容器是不能被其他服务器进行访问的,只能在宿主机进行访问。
想要实现被其他服务器访问,就要用到本篇博客写的内容了,有关docker中的虚拟网络。
另外,本篇博客将会介绍一种简单制作镜像的命令,以便我们能够制作自己的镜像。
Docker的四种网络模式
一. bridge模式
docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
二. none模式
此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。
三. host模式
此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。
四. container模式
此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。
Docker访问容器的来源
1. 同一个宿主机上的其他容器
2. 宿主机
3. 其他物理机
4. 其他物理机上的容器
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
创建自己的镜像仓库
需要在阿里云创建镜像仓库
第一步:创建镜像仓库
点击创建镜像仓库
第二步:填写你的注册信息
第三步:点击本地仓库
第四步:如下就创建好了一个自己的镜像仓库
基于容器创建镜像
获取使用帮助
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