docker的官网:https://www.docker.com/
官方文档:https://docs.docker.com/
github: https://github.com/docker/lab...
Docker类似虚拟机,是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
Docker分两个版本,CE(Community Edition)和EE(Enterprise Edition)。CE版本是免费的,如果我们学习或者一般应用,CE足够。EE版本在安全性上有很大提升,是收费版本,可以试用一定时间。
Docker容器和虚拟机的主要区别在于,虚拟机管理程序对整个设备进行抽象处理,而容器只是对操作系统内核进行抽象处理。相对于虚拟机,容器可以“丢弃没有用的99.9%的虚拟机垃圾,剩下一个小巧简洁的胶囊式容器,里面含有你的应用程序”。
主要概念
5个概念:
镜像(Docker Image)
可以看成是Java中的类。镜像可以用来创建Docker容器。可以通过命令“dock images”查看本地的所有镜像。
容器(Docker Container)
Image的一个运行实例就是一个Container,可以看成是Java中的对象,通过类实例化而来。一个Image可以有多个Container,每个Container都是相互隔离的。可以通过命令“docker ps”查看正在运行的Container(或者通过docker ps -a查看所有Container)。
仓库(Docker Repository/Registry)
同maven仓库,它用来存放第三方库。Docker的仓库用来存放镜像,且也可分为公开仓库和私有仓库,比如公开仓库:https://hub.docker.com/ https://store.docker.com/。
Docker客户端(Docker client)
命令行工具,用于与Docker后台交互。
Docker后台(Docker daemon)
宿主机上运行的Docker后台服务,管理容器的构建、运行、分发等。
这里以Docker CE版本和CentOS7(虚拟机)系统为例,简单介绍Docker。
安装
安装方式有3种,1)在线安装;2)下载安装包手动安装;3)通过官方提供的自动脚本安装。
下载安装包手动安装比较简单,适合上不了网的机器。自动脚本安装不推荐,这里举例在线安装。
# 首先卸载旧的版本(如果有的话)
$ sudo yum remove docker docker-common docker-selinux docker-engine
如果没有,则会提示如下:
No Match for argument: docker
No Match for argument: docker-common
No Match for argument: docker-selinux
No Match for argument: docker-engine
No Packages marked for removal
# 安装依赖的包
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置Docker的repository。后续通过该repository安装和更新
$ sudo yum-config-manager --add-repo https://download.docker.com/l...
Loaded plugins: fastestmirror, langpacks
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
*注:如果国内服务器,可以将https://download.docker.com/linux/
替换为 https://mirrors.aliyun.com/docker-ce/linux/
。如:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
无论哪个服务器,下载的docker-ce.repo文件内容是一样的。*
生成了/etc/yum.repos.d/docker-ce.repo文件,可以查看里面的内容,默认只有[docker-ce-stable]是启用的,即enabled=1,其他如docker-ce-edge、docker-ce-test等都是禁用的。
如果需要启动docker-ce-edge,通过命令:
$ sudo yum-config-manager --enable docker-ce-edge
执行完后,再打开/etc/yum.repos.d/docker-ce.repo文件,可以看到docker-ce-edge的enabled=1了。
如果要禁用,通过命令:
$ sudo yum-config-manager --disable docker-ce-edge
# 安装最新版的Docker CE(或指定版本)
$ sudo yum install docker-ce
如果在生产环境,往往不是安装最新版本,而是安装指定版本,那么可以先通过如下命令查看版本:
$ yum list docker-ce --showduplicates|sort -r
然后取上面输出内容中标红的部分,即:$ sudo yum install docker-ce-17.12.0.ce
# 启动Docker。启动好后,客户端命令就和该docker daemon交互了
$ sudo systemctl start docker
# 检查docker是否已正确安装
$ sudo docker run hello-world
该命令会下载一个test镜像,并在容器中运行。输出如下,表示已正确安装:
Unable to find image 'hello-world:latest' locally
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
# 查看Docker版本
$ docker -v
Docker version 17.12.0-ce, build c97c6d6
# 配置docker用户
【linux下除非必要,否则别用root】如果不是root用户,运行docker命令需要sudo。可以增加docker用户至docker组。命令:
# 创建用户组docker(如果已经创建了,则不用再创建)
$ sudo groupadd docker
# 用户$USER替换成真实用户,添加用户至docker组
$ sudo usermod -aG docker $USER
然后退出重新登录(可能需要重启)。
# 使用国内的镜像加速
$ sudo docker pull registry.docker-cn.com/library/redis:latest
下载latest版本。
或者按下列步骤(注:daemon.json不存在的话,则新建。该文件用来存放docker命令行选项,key-value形式):
# 1 这一步可以不要,如果/etc/docker已存在
sudo mkdir -p /etc/docker
# 2 这一步将registry-mirrors内容写入到daemon.json。如果daemon.json不存在则创建。(我的默认没有这个文件)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
# 3 重新载入systemd,扫描新的或有变动的单元
sudo systemctl daemon-reload
# 4 重启docker
sudo systemctl restart docker
推荐用这种方式。做了一下测试,在daemon.json中把地址改为国外registry.docker.com,速度明显慢很多。
至此,docker已在CentOS7上安装完成。
简单使用
注:Docker分客户端和服务端,即C/S模式,上面步骤安装完后,本机就有了Docker Client和Docker Daemon。我们输入的docker命令,都是通过客户端与Docker Daemon交互的。
# 下载一个镜像alpine(轻量级的Linux发行版)
$ docker pull alpine
可以通过search命令查询有哪些镜像,比如:$ docker search alpine
# 下载完之后,查看本地已有的镜像
$ docker images
注:可以通过 docker rmi 镜像名或镜像ID 删除镜像。如果镜像被容器使用了,则会提示无法删除。需要先停止并删除容器。如果没有容器使用,也删除不了,比如报错:
Error response from daemon: conflict: unable to delete 6c6084ed97e5 (cannot be forced) - image has dependent child images
可以试试用 名称:TAG,如:
$ docker rmi alpine:3.5
# 根据镜像创建一个镜像的运行实例,即容器
$ docker run alpine ls -l
这里是运行alpine镜像的一个容器,并执行ls -l命令
# 进入容器内的交互模式。可通过exit命令退出
$ docker run -it alpine /bin/sh
进入交互模式后,就可以在该Container中运行一些命令了。
# 查看容器
# 查看当前正运行的容器
$ docker ps
# 查看所有容器(包含未运行的)
$ docker ps -a
到这里,简单使用介绍完毕。接下来,部署一个web服务。
运行一个web服务
目前为止,还没看到一个网站的例子,下面介绍。步骤如下:
注:这里仍然直接用公开库的例子static-site
# 下载镜像
$ docker run -d dockersamples/static-site
# 启动该镜像的一个容器
$ docker run --name static-site -e AUTHOR="Your Name" -d -P dockersamples/static-site
# 查看该容器服务的访问端口
$ docker port static-site
# 打开浏览器,访问服务
上图中,可以看出80端口映射的是32773端口。随意浏览器中输入地址:http://192.168.0.12:32773(IP替换成你的实际IP),显示如下:
# 停止和删除容器
$ docker stop static-site
$ docker rm static-site
至此,我们访问了一个部署在Docker容器中的简单服务了。
部署一个Java web应用
如果我们的应用采用的是微服务架构,那么可以将各个微服务通过Docker来部署,简单又快捷。这里以一个Java Web应用部署为例说明。
# 下载一个Tomcat镜像
$ docker pull tomcat
默认下载最新版的Tomcat
# 启动tomcat镜像的一个实例容器
$ docker run -p 5000:8080 --name tomcat-container1 tomcat
这里的-p 5000:8080表示将容器内的8080端口映射到宿主机的5000端口上,通过5000来访问该tomcat服务。启动完成后,会在当前控制台输出日志。会看到:
org.apache.catalina.startup.Catalina.start Server startup in 1365 ms
表示启动成功。
# 浏览器中输入地址
比如我这里:http://192.168.0.12:5000,会显示熟悉的Tomcat界面。
# 新开一个控制台,进入container中,准备部署war包
$ docker exec -it tomcat-container1 /bin/sh
进入之后,就可以查看tomcat的目录了。
注意这里是docker exec,不是docker run。docker run是启动新的容器。
# 将war包放在宿主机某个位置,然后拷贝到容器中
$ docker cp /var/ftp/pub/TestWebApp.war tomcat-container1:/usr/local/tomcat/webapps
表示将宿主机上/var/ftp/pub/TestWebApp.war拷贝到容器中的/usr/local/tomcat/webapps下。
要查看容器中的具体位置,可以在进入容器后运行pwd命令查看,比如我这里为/usr/local/tomcat
注意,docker用户需要有war包的读取权限,否则拷贝时会报错:
ERRO[0000] Can't add file /var/ftp/pub/TestWebApp.war to tar: open /var/ftp/pub/TestWebApp.war: permission denied
ERRO[0000] Can't close tar writer: archive/tar: missed writing 869 bytes
Error response from daemon: Error processing tar file(exit status 1): unexpected EOF
war包放到webapp下后,会自动加载,通过浏览器访问即可。如:http://192.168.0.12:5000/TestWebApp/
一个简单的war包就部署好了。
如果我们的web应用采用了mysql, redis等,那么分别把相应的镜像下载下来,然后配置映射端口,并启动。我们通过宿主机的IP加端口,就可以访问各个服务了。不建议把所有服务放到一个容器里面,升级、维护都不方便。
我们知道,一个镜像可以启动多个容器,容器间互不干扰。所以,在上面tomcat例子中,我们可以再启动一个实例容器,名称为tomcat-container2,端口号映射到宿主机的5002端口:
$ docker run -p 5002:8080 --name tomcat-container2 tomcat
启动成功后,再开一个终端,进入tomcat-container2容器:
$ docker exec -it tomcat-container2 /bin/sh
进入容器后,cd到webapps目录,发现并没有刚才上传的TestWebApp.war,这也说明,两个容器是相互独立的。
镜像和容器的备份和恢复
# 镜像备份和恢复
# 打包镜像为tomcat.tar,保存在当前目录
$ docker save -o tomcat.tar tomcat
# 将tar包拷贝到另一台机器上(也安装了Docker),然后执行加载tar包命令
$ docker load -i tomcat.tar
# 可以通过docker images查看新加载进来的tomcat镜像,然后创建该镜像示例(容器)即可
$ docker run -it tomcat /bin/sh
# 容器备份和恢复
容器备份比镜像备份多了几个步骤。
# 查看需要备份的容器
$ docker ps -a
# 创建该容器的快照
$ docker commit -p 3f14281c89b5 tomcat-container1-backup
# 查看新的容器快照的镜像
$ docker images
接下来,步骤同上面的镜像备份和恢复。
# 将镜像打包成tar包
$ docker save -o tomcat-container1-backup.tar tomcat-container1-backup
# 将tar包拷贝到另一台机器上(也安装了Docker),然后执行加载tar包命令
$ docker load -i tomcat-container1-backup.tar
# 可以通过docker images查看新加载进来的tomcat镜像,然后运行该镜像容器,进入交互模式。注意这里并没有启动tomcat服务
$ docker run -it tomcat-container1-backup /bin/sh
进入到webapps目录,可以看到,之前放在容器中的TestWebApp.war也在。
# 再启动一个新的容器,映射端口5000,来访问一下tomcat
$ docker run -it -p 5000:8080 tomcat-container1-backup
# 通过浏览器访问
我这里的地址为: http://192.168.0.13:5000/TestWebApp/
容器中安装其他应用程序
这里举例Ubuntu容器安装wget工具。我们先把所有的容器停止和删除,当然也可以一个一个删:
$ docker stop docker ps -a -q
$ docker rm docker ps -a -q
# 首先获取一个ubuntu的docker镜像。如果已有,则略过
$ docker pull ubuntu
# 启动ubuntu实例容器,并进入容器
$ docker run -it ubuntu
# 输入apt-get install wget安装命令,报错E: Unable to locate package wget
出现如上错误,需要先执行apt-get update,然后再apt-get install wget
# wget安装好之后,可以执行如下命令
# wget https://segmentfault.com/
会现在index.html文件至当前目录,通过cat可查看文件内容。(未安装vi)
wget安装完成。
总结
$ docker run -it tomcat-container1-backup /bin/sh
这个命令是启动容器,并进入交互模式。退出交互模式后,该容器自动停止。
$ docker run -it tomcat-container1-backup
这个命令是直接启动tomcat容器,Ctrl+c退出
$ docker start inspiring_clarke
启动已有的容器,容器名称为inspiring_clarke
$ docker rename jovial_wright test1
容器重命名为test1,创建容器时如果不指定名称,会自动生成名称,比如这里的jovial_wright
$ docker stop nostalgic_bardeen
停止正在运行的容器,容器名称nostalgic_bardeen
$ docker rm inspiring_clarke
删除容器,容器名称inspiring_clarke
$ docker rmi e8301a85400c
删除镜像,镜像ID为e8301a85400c
$ docker images
查看本地所有镜像
$ docker ps
查看正在运行的容器
$ docker ps -a
查看所有创建的容器
到这里,对Docker应该有一个大致了解了。要更深入掌握,比如自己制作镜像等,请参考网上其他资料。
不错的资料参考:
https://blog.lab99.org/post/d...
http://www.zdnet.com/article/...