普通启动的容器
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