Docker入门学习

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
Docker入门学习_第1张图片

然后取上面输出内容中标红的部分,即:$ 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入门学习_第2张图片

# 停止和删除容器
$ 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界面。
Docker入门学习_第3张图片

# 新开一个控制台,进入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
图片描述

# 输入wget,会报命令未找到。
图片描述

# 输入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/...

你可能感兴趣的:(Docker入门学习)