• docker容器创建的流程详解


    普通启动的容器

    runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo “Hello world”
    Hello world

    各个参数解析:

    • **docker:**Docker 的二进制执行文件。

    • **run:**与前面的 docker 组合来运行一个容器。

    • ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库Docker Hub下载公共镜像。

    • **/bin/echo “Hello world”😗*在启动的容器里执行的命令

    运行交互式的容器

    我们通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力

    runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash
    root@dc0050c79503:/#

    各个参数解析:

    • **-t:**在新容器内指定一个伪终端或终端。

    • **-i:**允许你对容器内的标准输入 (STDIN) 进行交互。

    启动容器(后台模式)

    使用以下命令创建一个以进程方式运行的容器

    runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c “while true; do echo hello world; sleep 1; done”
    2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

    首先,我们需要确认容器有在运行,可以通过docker ps来查看

    runoob@runoob:~$ docker ps

    **CONTAINER ID:**容器ID

    **NAMES:**自动分配的容器名称

    在容器内使用docker logs命令,查看容器内的标准输出

    runoob@runoob:~$ docker logs 2b1b7a428627

    停止容器

    我们使用docker stop命令来停止容器:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhtPfkNz-1660424429317)(http://www.runoob.com/wp-content/uploads/2016/05/docker25.png)]

    通过docker ps查看,容器已经停止工作:

    runoob@runoob:~$ docker ps

    运行一个web应用

    前面我们运行的容器并没有一些什么特别的用处。

    接下来让我们尝试使用 docker 构建一个 web 应用程序。

    我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

    runoob@runoob:~# docker pull training/webapp # 载入镜像
    runoob@runoob:~# docker run -d -P training/webapp python app.py

    参数说明:

    • **-d:**让容器在后台运行。

    • **-P:**将容器内部使用的网络端口映射到我们使用的主机上。

    • 查看 WEB 应用容器

      使用docker ps来查看我们正在运行的容器:

    • Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。

      这时我们可以通过浏览器访问WEB应用

      我们也可以通过-p参数来设置不一样的端口:

      runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py

      docker ps查看正在运行的容器

      runoob@runoob:~# docker ps
      CONTAINER ID IMAGE PORTS NAMES
      bf08b7f2cd89 training/webapp … 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
      d3d5e39ed9d3 training/webapp … 0.0.0.0:32769->5000/tcp xenodochial_hoov

      容器内部的 5000 端口映射到我们本地主机的 5000 端口上。

    网络端口的快捷方式

    通过docker ps命令可以查看到容器的端口映射,docker还提供了另一个快捷方式docker port,使用docker port可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。

    上面我们创建的 web 应用容器 ID 为bf08b7f2cd89名字为wizardly_chandrasekhar

    我可以使用docker port bf08b7f2cd89或docker port wizardly_chandrasekhar来查看容器端口的映射情况。

    runoob@runoob:~$ docker port bf08b7f2cd89
    5000/tcp -> 0.0.0.0:5000

    runoob@runoob:~$ docker port wizardly_chandrasekhar
    5000/tcp -> 0.0.0.0:5000


    查看 WEB 应用程序日志

    docker logs [ID或者名字] 可以查看容器内部的标准输出。

    runoob@runoob:~$ docker logs -f bf08b7f2cd89
    * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
    192.168.239.1 - - [09/May/2016 16:30:37] “GET / HTTP/1.1” 200 -
    192.168.239.1 - - [09/May/2016 16:30:37] “GET /favicon.ico HTTP/1.1” 404 -

    -f:docker logs像使用tail -f一样来输出容器内部的标准输出。

    移除WEB应用容器

    我们可以使用docker rm命令来删除不需要的容器

    runoob@runoob:~$ docker rm wizardly_chandrasekhar
    wizardly_chandrasekhar

    删除容器时,容器必须是停止状态,否则会报如下错误

    runoob@runoob:~$ docker rm wizardly_chandrasekhar
    Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove

    构建镜像

    我们使用命令docker build, 从零开始来创建一个新的镜像。为此,我们需要创建一个Dockerfile文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

    runoob@runoob:~$ cat Dockerfile
    FROM centos:6.7
    MAINTAINER Fisher “fisher@sudops.com”

    RUN /bin/echo ‘root:123456’ |chpasswd
    RUN useradd runoob
    RUN /bin/echo ‘runoob:123456’ |chpasswd
    RUN /bin/echo -e "LANG=“en_US.UTF-8"” >/etc/default/local
    EXPOSE 22
    EXPOSE 80
    CMD /usr/sbin/sshd -D

    每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

    第一条FROM,指定使用哪个镜像源

    RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

    然后,我们使用Dockerfile文件,通过docker build命令来构建一个镜像。

    runoob@runoob:~$ docker build -t runoob/centos:6.7 .
    Sending build context to Docker daemon 17.92 kB
    Step 1 : FROM centos:6.7
    —> d95b5ca17cc3
    Step 2 : MAINTAINER Fisher “fisher@sudops.com”
    —> Using cache
    —> 0c92299c6f03
    Step 3 : RUN /bin/echo ‘root:123456’ |chpasswd
    —> Using cache
    —> 0397ce2fbd0a
    Step 4 : RUN useradd runoob

    参数说明:

    • -t:指定要创建的目标镜像名

    • .:Dockerfile文件所在目录,可以指定Dockerfile的绝对路径

    使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec

    runoob@runoob:~$ docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    runoob/centos 6.7 860c279d2fec About a minute ago 190.6 MB
    runoob/ubuntu v2 70bf1840fd7c 17 hours ago 158.5 MB
    ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB
    php 5.6 f40e9e0f10c8 10 days ago 444.8 MB
    nginx latest 6f8d099c3adc 12 days ago 182.7 MB
    mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
    httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
    ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB
    hello-world latest 690ed74de00f 6 months ago 960 B
    centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB
    training/webapp latest 6fae60ef3446 12 months ago 348.8 MB

    我们可以使用新的镜像来创建容器

    runoob@runoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash
    [root@41c28d18b5fb /]# id runoob
    uid=500(runoob) gid=500(runoob) groups=500(runoob)

    从上面看到新镜像已经包含我们创建的用户runoob

    网络端口映射

    我们创建了一个 python 应用的容器。

    runoob@runoob:~$ docker run -d -P training/webapp python app.py
    fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

    另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。

    我们使用**-P参数创建一个容器,使用docker ps**来看到端口5000绑定主机端口32768。

    另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。

    runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
    95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c

    这样我们就可以通过访问127.0.0.1:5001来访问容器的5000端口。

    上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上**/udp**。

    runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
    6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a

    docker port命令可以让我们快捷地查看端口的绑定情况。

    runoob@runoob:~$ docker port adoring_stonebraker 5000
    127.0.0.1:5001


    Docker容器连接

    端口映射并不是唯一把 docker 连接到另一个容器的方法。

    docker有一个连接系统允许将多个容器连接在一起,共享连接信息。

    docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。


    容器命名

    当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用–name标识来命名容器,例如:

    runoob@runoob:~$ docker run -d -P --name runoob training/webapp python app.py
    43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

    我们可以使用docker ps命令来查看容器名称。

    runoob@runoob:~$ docker ps -l
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    43780a6eabaa training/webapp “python app.py” 3 minutes ago Up 3 minutes 0.0.0.0:32769->5000/tcp runoob

    b

  • 相关阅读:
    python面试常考题
    Electron自动化测试技术选型调研
    【数据结构】树和二叉树以及经典例题
    药物研发---信息部门考核办法
    Spring的@Async使用防坑
    [附源码]计算机毕业设计JAVA小区疫情防控系统
    java计算机毕业设计家乡旅游文化推广网站MyBatis+系统+LW文档+源码+调试部署
    Vue_安装vue脚手架
    Python基础学习笔记1(AI Studio)
    (七)React Ant Design Pro + .Net5 WebApi:后端环境搭建-日志、异常处理
  • 原文地址:https://blog.csdn.net/m0_54850825/article/details/126327546