Docker基本概念及用法 (一)

本文基于Mac OS X系统,读完本文可以掌握Docker的基本概念及用法。

安装

brew cast install docker 

安装成功后,确认一下

docker --version

Docker version 17.12.0-ce, build c97c6d6 

基本概念

Docker是什么

Docker是一个软件平台,可以让开发者用容器进行软件开发,部署和运行。而这种应用开发方式也被称为应用容器化(Containerization)。

镜像(images)和容器(containers)

镜像和容器是Docker当中的重要概念。

镜像是可运行的软件包,其中包含了运行应用所需的所有软件,运行库,环境变量,配置文件等等。

容器则是由镜像生成的一个软件运行环境。

和虚拟机(VM)有何区别

和Docker相比,一个显著的特征是虚拟机的隔离性是比Docker好的,这也是因为它通过Hypervision(底层的虚拟机管理系统)技术在主操作系统上构建了一个从操作系统(Guest OS),而Docker容器则通过Docker从主操作系统中获取系统资源,所以性能上会比虚拟机好。

但是两者其实面向的应用方向是不太一样的,Docker更加适合隔离不同的应用,例如前端,后端,数据库。而虚拟机则适合VPS这样的产品。

用Dockerfile定义一个镜像并运行

我们以NodeJS应用为例,首先创建一个项目文件夹

mkdir docker-test
cd docker-test 

创建一个Dockerfile

touch Dockerfile 

编写Dockerfile

# Use Node 8.9.3
FROM node:8.9.3

# working directory
WORKDIR /app

# copy to /app
ADD . /app

# install devpendencies
RUN npm install

# expose port 80
EXPOSE 80

# RUN
CMD ["node", "app.js"] 

大致意思就是使用node v8.9.3这个版本,然后创建一个/app目录,将当前目录下的文件复制到/app目录下,然后运行npm install命令安装依赖,并暴露80端口,最后执行node app.js命令

然后我们编写app.js这个文件

var http = require('http');

var server = http.createServer((req, res) => {
 res.setHeader('content-type', 'text/html;charset=utf8');
 res.end(`<p>Hello Docker!</p>`);
});

server.listen(80);
console.log('Server is running!'); 

一个简单的server服务器,应用写完了,我们来包这个应用打包为镜像。

docker build -t docker-node-test . 

这句命令会将当前目录打包为一个名为docker-node-test的镜像。

使用

docker image ls 

可以看到docker-test-node镜像已经生成了

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-test-node    latest              6816cb340059        15 minutes ago      676MB 

接着我们开始运行这个镜像

docker run -p 3000:80 docker-test-node 

这个命令将会运行docker-test-node这个镜像,并通过-p将暴露的端口80映射到本机的3000端口。

docker container ls 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
caf45cf53524        docker-test-node    "node app.js"       16 minutes ago      Up 17 minutes       0.0.0.0:3000->80/tcp   nervous_banach 

可以看到我们的容器已经运行了。

docker containerdocker image还有很多操作命令,如下:

docker container ls                                # List all running containers
docker container ls -a             # List all containers, even those not running
docker container stop <hash>           # Gracefully stop the specified container
docker container kill <hash>         # Force shutdown of the specified container
docker container rm <hash>        # Remove specified container from this machine
docker container rm $(docker container ls -a -q)         # Remove all containers
docker image ls -a                             # List all images on this machine
docker image rm <img id>            # Remove specified image from this machine
docker image rm $(docker image ls -a -q)   # Remove all images from this machine 

好了,我们在浏览器中输入localhost:3000,即可看到Hello Docker!

光这样还不行,我们还必须能对应用进行共享。Docker官方提供了类似github这样的存储仓库,我们给我们的本地镜像打标签

#  docker tag imageName dockerID/repository:tag
docker tag docker-test-node jeffwcx/docker-test:0.1 

然后

docker push jeffwcx/docker-test:0.1 

就可以将我们的镜像分享出来

另一方,使用

docker run -p 3000:80 jeffwcx/docker-test:0.1 

即可使用在公共仓库上的docker镜像。

未完待续