前言
在上一篇博客《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
参数详解
- [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
- [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
来源: https://www.cnblogs.com/kenken2018/p/10030567.html