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"
家庭版office2019没有access怎么办2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
⾸先,我们需要确认容器有在运⾏,可以通过 docker ps 来查看
runoob@runoob:~$ docker ps
CONTAINER ID:容器ID
NAMES:⾃动分配的容器名称
在容器内使⽤docker logs命令,查看容器内的标准输出
runoob@runoob:~$ docker logs 2b1b7a428627
传媒模板停⽌容器
我们使⽤ docker stop 命令来停⽌容器:
通过docker ps查看,容器已经停⽌⼯作:if函数怎么用的
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 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"
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"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......
参数说明:double类型数组初始化
-
t :指定要创建的⽬标镜像名
. :Dockerfile ⽂件所在⽬录,可以指定Dockerfile 的绝对路径
使⽤docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec
git如何克隆远程仓库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
centos和ubuntu
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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。