1. 程式人生 > >Docker埠對映及建立映象演示(二)--技術流ken

Docker埠對映及建立映象演示(二)--技術流ken

前言

在上一篇部落格《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, --author string    作者資訊 (e.g., "John Hannibal Smith <[email protected]>")
  -c, --change list      將Dockerfile指令應用於建立的映像 (default [])-m, --message string   提交資訊
  -p, --pause            提交時暫停容器 (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