1 运行容器镜像原理
[root@centos7-01 ~]# docker run busybox echo "Hello world"
Unable to find image 'busybox:latest' locally
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
61c5ed1cbdf8: Pull complete
Digest: sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Status: Downloaded newer image for docker.io/busybox:latest
Hello world
图2.1 展示了执行docker run 命令之后发生的事情。首先, Docker 会检查busybox:latest 镜像是否己经存在于本机。如果没有,Docker 会从http: //docker.io 的Docker 镜像中心拉取镜像。镜像下载到本机之后, Docker 基于这个镜像创建一个容器并在容器中运行命令。ec h o 命令打印文字到标准输出流,然后进程终止,容器停止运行。
![](https://i-blog.csdnimg.cn/blog_migrate/ecaf760a026ca22c382c431aa7922896.png)
#运行其他的容器镜像命令:
$ docker run <image>
$ docker run <image>:<tag>
#tag为镜像的版本,当引用镜像没有显式地指定tag 时, Docker 会默认指定tag 为latest
2 构建一个简单的Node.js Web 应用
#代码清单2.2 一个简单的Node.js应用: app.js
[root@centos7-01 docker_test]# cat app.js
const http = require('http');
const os = require('os');
console.log("Kubia server starting ...");
var handler = function(request, response) {
console.log("Received request from " + request.connection.remoteAddress);
response.writeHead(200);
response.end ("You've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);
代码实现的功能:在8080 端口启动了一个HTTP 服务器。服务器会以状态码200 OK 和文字"You've hit <hostname>" 来响应每个请求。请求handler 会把客户端的IP 打印到标准输出,以便日后查看。
3 为镜像创建Dockerfile
#代码:青单2.3 构建应用容器镜像的Dockerfile
[root@centos7-01 docker_test]# cat Dockerfile
FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
From 行定义了镜像的起始内容(构建所基于的基础镜像) 。这个例子中使用的是node 镜像的tag 7 版本。
4 构建容器镜像
$ docker build -t kubia
图2.2 展示了镜像构建的过程。用户告诉Docker 需要基于当前目录(注意命令结尾的点)构建一个叫kubi a 的镜像, Docker 会在目录中寻找Dockerfile ,然后基于其中的指令构建镜像。
![](https://i-blog.csdnimg.cn/blog_migrate/d189d0a25a492440a94d5c92a338c8e2.png)
[root@centos7-01 docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kubia latest 803af35b8aec 10 minutes ago 660 MB
docker.io/busybox latest 018c9d7b792b 6 days ago 1.22 MB
docker.io/node 7 d9aed20b68a4 2 years ago 660 MB
5 运行容器镜像
$ docker run --name kubia-container -p 8080:8080 -d kubia
这条命令告知Docker基于kubia镜像创建一个叫kubia-container的新容器。这个容器与命令行分离(- d标志),这意味着在后台运行。本机上的8080端口会被映射到容器内的8080 端口(-p 8080:8080选项),所以可以通过http://localhost:8080访问这个应用。
[root@centos7-01 docker_test]# curl localhost:8080
You've hit 60dfafaec47d
#或者在浏览器上:输入地址:把192.168.159.128替换成你的虚拟机的ip
http://192.168.159.128:8080/
常用命令列表:
#列出运行中的容器
$ docker ps
#docker ps只会展示容器的大部分基础信息。 可以使用docker inspect查看更多的信息:
$ docker inspect kubia-container
#Docker 会打印出包含容器底层信息的长JSON。
6 探索运行容器的内部
$ docker exec -it kubia-container bash
这会在已有的kubia-container容器内部运行bash。bash 进程会和主容器进程拥有相同的命名空间。这样可以从内部探索容器,查看Node.js 和应用是如何在容器里运行的。-it 选项是下面两个选项的简写:
#从容器内列出进程
roo七@44d76963e8el:/# ps aux
#运行在主机操作系统上的容器进程
$ ps aux | grep app.js
这证明了运行在容器中的进程是运行在主机操作系统上的。如果你足够敏锐,会发现进程的ID在容器中与主机上不同。容器使用独立的PIDLinux命名空间并且有着独立的系列号,完全独立于进程树。
![](https://i-blog.csdnimg.cn/blog_migrate/5159a346f0b5d32b9a7e00aa8a771424.png)
#通过告知Docker停止kubia-container容器来停止应用
$ docker stop kubia-container
因为没有其他的进程在容器内运行,这会停止容器内运行的主进程。容器本身仍然存在并且可以通过docker ps -a来查看。-a选项打印出所有的容器,包括运行中的和已经停止的。想要真正地删除一个容器,需要运行docker rm:
$ docker rm kubia-container
7 向镜像仓库推送镜像
![](https://i-blog.csdnimg.cn/blog_migrate/34ff70d0b7dd0a28ff82ddb7c366263a.png)
$ docker push luksa/kubia
$ docker run -p 8080:8080 -d luksa/kubia