资讯专栏INFORMATION COLUMN

Docker入门学习

xiaodao / 3302人阅读

摘要:如无论哪个服务器,下载的文件内容是一样的。如果需要启动,通过命令执行完后,再打开文件,可以看到的了。

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27198.html

相关文章

  • Kubernetes学习视频教程

    摘要:视频学习目录核心要点及架构概述基础概念初始化应用快速入门资源清单定义入门控制器应用进阶控制器应用进阶控制器控制器资源与存储卷和控制器认证及认证及分级授权配置网络插件基于的网络策略调度器预选策略及优选函 Kubernetes视频学习目录 01-Devops核心要点及kubernetes架构概述.mp4 02-kubernetes基础概念.mp4 03-kubeadm初始化kuberne...

    wslongchen 评论0 收藏0
  • Docker入门学习

    摘要:一核心组件客户端和服务端镜像容器二关键概念以镜像为基础,在镜像的基础上创建运行容器,可以简单的理解为容器是镜像运行时的表现。 一、docker核心组件 docker客户端和服务端 docker镜像 registry docker容器 二、关键概念 docker以镜像为基础,在镜像的基础上创建、运行容器,可以简单的理解为容器是镜像运行时的表现。 三、docker基本命令 容器相关 1、d...

    Carl 评论0 收藏0
  • AI开发书籍分享

    摘要:编程书籍的整理和收集最近一直在学习深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后也找了很多的书和文章,随着不断的学习,也整理了下自己的学习笔记准备分享出来给大家后续的文章和总结会继续分享,先分享一部分的 编程书籍的整理和收集 最近一直在学习deep learning深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后...

    huayeluoliuhen 评论0 收藏0
  • AI开发书籍分享

    摘要:编程书籍的整理和收集最近一直在学习深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后也找了很多的书和文章,随着不断的学习,也整理了下自己的学习笔记准备分享出来给大家后续的文章和总结会继续分享,先分享一部分的 编程书籍的整理和收集 最近一直在学习deep learning深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后...

    antz 评论0 收藏0
  • AI开发书籍分享

    摘要:编程书籍的整理和收集最近一直在学习深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后也找了很多的书和文章,随着不断的学习,也整理了下自己的学习笔记准备分享出来给大家后续的文章和总结会继续分享,先分享一部分的 编程书籍的整理和收集 最近一直在学习deep learning深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后...

    YorkChen 评论0 收藏0
  • AI开发书籍分享

    摘要:编程书籍的整理和收集最近一直在学习深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后也找了很多的书和文章,随着不断的学习,也整理了下自己的学习笔记准备分享出来给大家后续的文章和总结会继续分享,先分享一部分的 编程书籍的整理和收集 最近一直在学习deep learning深度学习和机器学习的东西,发现深入地去学习就需要不断的去提高自己算法和高数的能力然后...

    sixleaves 评论0 收藏0

发表评论

0条评论

xiaodao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<