Docker 暴露容器方法
第一种: 将容器中的一个端口映射成宿主机中的一个随机端口
第二种: 将容器中的一个端口映射成宿主机中的一个端口
第三种: 将容器中的一个端口映射成宿主机中的一个特定网卡上的随机端口
第四种: 将容器中的一个端口映射成宿主机中的一个特定网卡上的一个端口
[使用多次 - p 选项可以实现暴露多个端口]
Docker 端口映射的四种方法使用演示
第一种: 将容器中的一个端口映射成宿主机中的一个随机端口
下面的操作确保虚拟机是在桥接模式
第一步: 下载 httpd 镜像
- [[email protected] ~]# docker pull httpd
- [[email protected] ~]# 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: 表示退出容器时删除容器
[[email protected] ~]# docker container run --name httpd1 -d -P --rm httpd
第三步: 查看端口
可以发现容器内的 80 端口被指向了宿主机的 32768 端口
- [[email protected] ~]# 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 端口
- [[email protected] ~]# ss -tnl | grep 32768
- LISTEN 0 1024 :::32768 :::*
第四步: 访问
输入宿主机的 IP 地址加映射的端口号
通过以上的方法就可以实现外部主机访问一个容器了.
第二种: 将容器中的一个端口映射成宿主机中的一个端口
第一步: 启动 httpd 容器
-name: 指定容器名称
-d: 后台运行
-p: 小写的 p 指定端口, 123 为宿主机端口, 80 为容器的端口
-rm: 退出容器及删除容器
[[email protected] ~]# docker container run --name httpd2 -d -p 1234:80 --rm httpd
第二步: 查看端口
- [[email protected] ~]# 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
- [[email protected] ~]# ss -tnl | grep 1234
- LISTEN 0 1024 :::1234 :::*
第三步: 访问
输入宿主机 IP 地址和设置的端口即可访问
第三种: 将容器中的一个端口映射成宿主机中的一个特定网卡上的随机端口
第一步: 启动 httpd 容器
指定特定的网卡需要使用小 p 后面加上 网卡 ip:: 容器端口
[[email protected] ~]# docker container run --name httpd3 -d -p 10.220.5.13::80 --rm httpd
第二步: 查看端口
可以看到下面生成了一个随机端口 32768
- [[email protected] ~]# 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
- [[email protected] ~]# ss -tnl | grep 32768
- LISTEN 0 1024 10.220.5.13:32768 *:*
第三步: 访问
使用生成的随机端口加上 IP 地址即可进行容器的访问
第四种: 将容器中的一个端口映射成宿主机中的一个特定网卡上的一个端口
第一步: 启动容器
指定特定的网卡需要使用小 p 后面加上 网卡 ip: 宿主机端口: 容器端口
这里我指定了使用宿主机的 8080 端口进行容器端口的映射
[[email protected] ~]# docker container run --name httpd3 -d -p 10.220.5.13:8080:80 --rm httpd
第二步: 查看端口
- [[email protected] ~]# 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
- [[email protected] ~]# 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 用来基于一个现有容器来创建镜像
- [[email protected] ~]# docker commit --help
- Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- Create a new image from a container's changes
参数详解
- [[email protected] ~]# docker container exec -it busybox1 /bin/sh
- / # mkdir /data
- / # echo "test for my image">/data/index.html
- / # httpd -h /data
- / #
- [[email protected] ~]# docker commit -a "ken" -p -c "CMD ["/bin/httpd","-f","-h","/data"]" busybox1 kenken/httpd1
- sha256:29846cdbd83478bc9469b6ad25e76851655072bca6c984eeffedb52a8c8b91c0
- [[email protected] ~]# 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
- [[email protected] ~]# docker login --username=kenkendyg registry.cn-beijing.aliyuncs.com
- Password:
- Login Succeeded
- [[email protected] ~]# 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
- [[email protected] ~]# docker login --username=kenkendyg registry.cn-beijing.aliyuncs.com
- Password:
- Login Succeeded
- [[email protected] ~]# 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
- [[email protected] ~]# 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
- docker run -name "containerA" -c 1024 httpd
- docker run -name "containerB" -c 512 httpd
- [[email protected] ~]# cat /sys/fs/cgroup/CPU/docker/a1f00b2682796ec9d0c64c8356645ecaeba95c622b4d306124c01d17fd9e5829/CPU.shares
- 512
- namespace
来源: http://www.bubuko.com/infodetail-3164319.html