Docker是基于Go语言实现的开源容器项目,属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
软件开发最大的麻烦事之一,就是环境配置,软件要能运行,用户必须保证两件事:操作系统的设置,各种库和组件的安装。
环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。
Docker的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。总体来说,有了 Docker,就不用担心环境问题。
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Docker支持Windows、macOS、Linux等系统,本人使用树莓派Ubuntu安装Docker
官方链接:Ubuntu armhf版 安装Docker
对着这个文档step by step,直到Hello world!
root@ubuntu:/home/ubuntu# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4ee5c797bcd7: Pull complete
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm32v7)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
这段log清楚的说明了当我们运行docker run hello-world命令的时候,Docker 做了什么。
当你看到命令行输出‘Hello from Docker!’说明Docker已经安装好了,并且网络通信等功能都是好的。
Docker使用client-server架构,
Docker daemon是一个守护进程,作为server,提供一套REST API,Docker client通过socker或网络接口与daemon通信。所以client和daemon可以运行在本地同一台机器,也可以daemon在远程服务器,client可以与多个daemon通信。
Docker Registry是镜像仓库,比如官方提供的Docker Hub就是最大的公开仓库。
Docker镜像是一个只读的模板,包含创建一个Docker容器的指令,通常镜像都是在其他镜像上面加上自定义的内容,例如在ubuntu镜像上添加一个网络服务以及配置文件。可以从仓库下载,也可以自己打包,打包的镜像也可以发布到公开仓库供他人使用,也可以建私有仓库。
Docker容器,类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
Docker VS VM
下载官方的学习例子源码,解压,进到工程项目路径下
curl -LO https://github.com/dockersamples/node-bulletin-board/archive/master.zip
unzip master.zip
cd node-bulletin-board-master/bulletin-board-app
看一下Dockerfile的内容
FROM node:current-slim
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
EXPOSE 8080
CMD [ "npm", "start" ]
COPY . .
Dockerfile指定的操作如下:
打包镜像:Usage: docker build [OPTIONS] PATH | URL | -
docker build --tag bulletinboard:1.0 .
-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
如果运行成功,就可以看到新生成的镜像了,image:bulletinboard
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bulletinboard 1.0 6212224c2ab8 21 minutes ago 163MB
node current-slim b16bc4fd60ff 2 weeks ago 146MB
hello-world latest 851163c78e4a 6 months ago 4.85kB
运行镜像bulletinboard:
root@ubuntu:~# docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
1b8ed80e77a6534da8a4f13603a3324faccddcb9d942698def4e52f0cb37edb8
root@ubuntu:~# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b8ed80e77a6 bulletinboard:1.0 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:8000->8080/tcp bb
29f8e4e0656d hello-world "/hello" 41 minutes ago Exited (0) 41 minutes ago sleepy_kirch
68c2a398d5fd hello-world "/hello" 46 hours ago Exited (0) 46 hours ago ecstatic_edison
这个命令两个参数
浏览器访问树莓派的8000端口看看
停止运行这个容器
docker stop bb
删除这个容器
docker rm bb
先停止,再删除,否则就要加–force参数
把镜像发布到Docker hub
root@ubuntu:~# docker login -u -p
root@ubuntu:~# docker tag bulletinboard:1.0 /bulletinboard:1.0
root@ubuntu:~# docker push /bulletinboard:1.0
Docker 官方文档 【推荐】
Docker命令
Docker一个月入门到放弃