什么是Docker?
去年实习的时候,接触到Docker,过后也一直用,间隔了一段时间后,发现有些都给忘了。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。而且Docker的操作命令跟Git命令类似。
Docker的用处
Docker其实就是一个虚拟化的容器,而且可以打包对应的环境和数据,比如你部署的某个服务器,包括各种各样的依赖环境和工具,有Git,MySql或MongoDB,nginx或者Caddy,Python3.5,OpenCV或者PIL等等,而且你也需要批量部署或者复制环境,比如需要把你的环境从A服务器迁移到B服务器,这个时候自己手动的去安装所有的环境会特别繁琐,但是如果使用Docker的话,只需要安装Docker程序,然后pull一下自己的Docker镜像,然后运行。
- 安装Docker
- Pull镜像
- docker run image_id
就像上图的右边部分,在底层(Kernel)之上,可以有很多容器(Container),每个容器都安装了不同的环境和软件,复制了容器就相当于复制所有的环境和软件,环境复制和部署极为方便。
Docker安装
安装教程请移步官网
注意:Docker版本分为社区版Docker CE
和企业版Docker EE
,个人安装的时候请选择CE版,CE版还分为稳定吧和测试版。
验证Docker安装是否成功
运行命令:1
2
3docker -v #查看安装的docker的版本
docker -h #查看帮助
docker version #查看docker客户端和服务器版本情况
注意:
如果运行docker version
的时候提示:1
2
3
4
5
6
7
8Client:
Version: 17.09.1-ce
API version: 1.32
Go version: go1.8.3
Git commit: 19e2cf6
Built: Thu Dec 7 22:23:40 2017
OS/Arch: linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
说明docker服务还没开启,开启docker服务(不同系统软件运行命令可能不一样):1
systemctl start docker #我用的是centos7的系统
重新运行docker version
后,发现一切正常。
1 | Client: |
Docker使用
参考书籍:Docker技术入门与实战
Docker包含哪些部分
- DockerClient、DockerServer 客户端、服务器
- Docker Image 镜像
- Docker 仓库
- DockerContainer 容器
Docker镜像
Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。
Docker容器
Docker容器是由Docker镜像创建的运行实例。Docker容器类似虚拟机,可以支持的操作包括启动,停止,删除等。每个容器间是相互隔离的,容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。
Docker仓库
Docker 仓库的概念跟Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
仓库支持的操作类似git,当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker容器与使用
- 下载镜像
- 根据镜像创建容器
- 运行容器
下面以搭建LAMP为例子:
- docker命令查找镜像:
docker search 镜像名1
docker search lamp
或者在DockerHub上查找镜像:
- 下载镜像
docker pull 用户名(username)/镜像名(image name):镜像标签(tag)- 其中 用户名/镜像名是镜像仓库的名称(用来区分镜像),tag是镜像的标签(往往用来显示版本信息),通常情况下,描述一个镜像需要包括“名称+标签的信息”,如果省略标签信息,默认的是:latest
1 | docker pull greyltc/lamp:latest |
- 下载过程中可以看出,镜像文件一般由若干层(layer)组成,上图中a3ed95caeb02这样的串是层的唯一id(256位的哈希值,确保唯一性),使用docker pull命令下载时会获取并输出镜像各层的信息。当不同的镜像包括相同的层是,本地仅存储层的一份内容,减少了需要的存储空间。
- 严格地讲,镜像的仓库名称中还应该添加仓库地址(即reigstry, 注册服务器)作为前缀,只是我们默认使用的是Docker Hub服务,该前缀可以省略。
例如,
docker pull ubuntu:14.04
命令相当于docker pull registry.hub.com/ubuntu:14.04
命令,即从默认的注册服务器Docker Hub Registry中的ubuntu仓库下载标签为14.04的镜像。
- 国内docker注册服务器:registry.docker-cn.com,如果下载镜像遇到
net/http: TLS handshake timeout
时,请更改仓库地址,比如,下载报错信息如下:
1 | root@lab-NF5270M3:/home/lab# docker pull yangxuan8282/kodexplorer |
指定国内下载仓库,一切正常
1 | root@lab-NF5270M3:/home/lab# docker pull registry.docker-cn.com/yangxuan8282/kodexplorer:php-amd64 |
最简单的解决方法:打开小火箭,然后搭个梯子就好了。
- 查看镜像
1
docker images
- 创建容器实例并运行镜像
1
docker run -it --name "lamp" 2359