• 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

  • 相关阅读:
    CATransition
    OC中只有重写没有重载
    OC内存管理
    NSNotification
    关于一个小应用软件的思考
    tableView主从表在storyboard连线是 Selcetion Segue和Accessory Action的区别
    关于ios8模拟器不能输入中文问题以及软键盘不弹出问题
    UINavigation Bar中使用UIcollectionView,在UIcollectionView的顶端和低端出现空白的问题
    升级到Xcode6.2后 免证书真机调试出错的问题
    让UITableView 的 headerView跟随 cell一起滚动,tableHeaderView
  • 原文地址:https://www.cnblogs.com/it-peng/p/11388227.html
Copyright © 2020-2023  润新知