docker容器——介绍、安装、使用、流程解读、制作镜像与图形化工具
docker容器——介绍、安装、使用、流程解读、制作镜像与图形化工具
准备工作
首先,需要准备Ubuntu16.04.7环境,笔者是在vmware虚拟机中安装的该环境,附教程:https://blog.csdn.net/bruuuuuuuuno/article/details/121131478
docker简介
简介
官网:https://www.docker.com/
——百度百科
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
——docker中文社区
链接:https://www.docker.org.cn/
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。
Docker通常用于如下场景:
1、web应用的自动化打包和发布;
2、自动化测试和持续集成、发布;
3、在服务型环境中部署和调整数据库或其他的后台应用;
4、从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
——wikipedia
链接:https://zh.wikipedia.org/wiki/Docker
Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。
与虚拟机的区别
Docker容器在Linux本地运行,并与其他容器共享主机的内核。它运行一个离散进程,不占用任何其他可执行文件更多的内存,从而使其更轻巧。(容器不是模拟一个完整的操作系统,而是对进程进行隔离。)
相比之下,虚拟机(VM)是完整的操作系统,一些系统级别的操作步骤往往无法跳过。通常,VM会产生大量开销,超出了应用程序逻辑所消耗的开销。
docker安装
进入ubuntu命令行,输入以下代码,使用官方安装脚本自动安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
如果报错,可能是不能翻到外网的原因,可以按照以下方法将命令进行修改:
把https改成git
如果还是报错,可以查看官方安装教程进行安装:https://docs.docker.com/get-docker/
安装完成后,运行以下命令查看docker相关信息,来验证是否安装成功:
$ docker version
# 或者
$ docker info
为了避免每次命令都输入sudo,可以设置用户权限(将当前用户添加到docker组里面),注意执行后须注销重新登录:
sudo usermod -a -G docker $USER
安装完成Docker后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令:
# 启动docker
sudo service docker start
# 停止docker
sudo service docker stop
# 重启docker
sudo service docker restart
docker测试实例hello world
docker安装好后,让我们使用docker来运行第一个简单的实例。
首先,在确保启动docker服务后,在命令行输入以下代码,来获取helloworld实例的镜像:
docker image pull hello-world
接着,我们输入以下代码,来使用我们的镜像生成一个运行的容器:
docker container run hello-world
(docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。)
如果运行成功,将会得到如下的输出结果,输出完后,该容器将自动终止:
docker流程解读
docker引擎
docker引擎是具有以下主要组件的客户端-服务器应用程序:
- docker服务器是一种长期运行的程序,也称为守护进程( docker daemon)。
- REST API通讯层,它可以用来与守护程序进行通信并提供操作接口。
- 命令行界面(CLI)客户端(执行docker命令)。
docker客户端使用 REST API接口或直接使用CLI命令来控制Docker守护程序或与Docker守护程序进行交互。其他Docker应用程序都使用基础API和CLI。REST API是基于web容器提供服务,因此客户端和服务器的通信是基于HTTP协议的,兼容和扩展性好。守护程序用于创建和管理Docker 对象,例如镜像获取,容器创建等。
执行流程
Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以 在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在网络接口上使用REST API进行通信。
Docker守护程序(Docker daemon)
Docker守护程序侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
Docker客户端(Client)
Docker客户端是Docker用户与Docker交互的主要方式。当您使用诸如docker run之类的命令时,客户端会将这些命令发送到Docker daemon,以执行这些命令。Docker客户端可以与多个守护程序通信。
Docker注册中心(Registry)
Docker 注册中心存储Docker镜像。Docker Hub是任何人都可以使用的公共注册中心(远程/中央仓库),并且Docker默认配置为在Docker Hub上查找映像。
当客户端执行docker pull命令时,客户端通过通讯层将命令发送给守护程序,守护程序首先检测本地的images中是否存在该镜像,如果不存在,就会从配置的远程仓库中拉取镜像到本地。
此时客户端执行docker run命令,守护程序就会创建容器,启动应用。
image镜像
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。
可以把镜像看成生产车间的模具,只有通过这个模具,才能生产出产品;
同时,一个模具可以生产出很多产品;
一个模具生产出来的产品都是一样的。
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。Docker 的官方仓库 https://hub.docker.com/ 是最重要、最常用的 image 仓库。
对于电脑中的image文件,可以采用如下命令进行查看和删除:
# 列出本机的所有 image 文件。
docker image ls
# 删除 image 文件
docker image rm [imageName]
container容器
image 文件生成的容器实例,本身也是一个文件,称为容器文件。关闭容器并不会删除容器文件,只是容器停止运行而已。
如果镜像是生产车间的模具的话,容器则是生产出来的产品,是我们最终使用的;
一个模具生产出来的产品是一样的;
产品使用后不会被丢弃,还可以再次使用,如果要丢弃需要主动扔掉。
对于电脑中的container文件,可以采用如下命令进行查看、运行和删除:
# 列出本机正在运行的容器
docker container ls
# 列出本机所有容器,包括终止运行的容器
docker container ls --all
# 启动已存在的容器
docker start [containerID]
# 停止指定的容器运行
docker container kill [containerID]
# 删除指定的容器文件
docker container rm [containerID]
# 也可以使用docker container run命令的--rm参数,在容器终止运行后自动删除容器文件,如:
docker container run --rm -p 8000:3000 -it demo
制作自己的docker容器
配置文件介绍
Dockerfile文件
Dockerfile是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。Dockerfile的每一行是一个命令——Docker镜像是使用 Docker build 命令构建的。在构建镜像时,Docker创建了所谓的“层(layers)”。每一层都记录了Dockerfile中的命令所导致的更改,以及运行命令后镜像的状态。
Dockerfile 一般分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
(’#’ 为 Dockerfile 中的注释)
下面是一些常用的Dockerfile指令:
指令 | 描述 |
---|---|
FROM | 构造的新镜像是基于哪个镜像,例如:FROM centos:v1 |
MAINTAINER | 维护者信息,例如:MAINTAINER yanglin |
RUN | 构建镜像时运行的shell命令,例如:RUN [“yum”, “install”, “http”]、RUN yum install httpd |
CMD | 运行容器时执行的shell命令,例如:CMD ["-c","/startup.sh"]、CMD ["/usr/sbin/sshd","-D"]、CMD /usr/sbin/sshd -D |
EXPOSE | 指定于外界交互的端口,即容器在运行时监听的端口,EXPOSE 8081 8082 |
ENV | 设置容器内环境变量,例如:ENV MYSQL_ROOT_PASSWORD 123456 |
ADD | 拷贝文件或者目录到镜像,如果是URL或者压缩包会自动下载或者自动解压,例如:ADD hom* /mydir/、ADD test relativeDir/ |
COPY | 拷贝文件或者目录到镜像,用法同ADD,例如:COPY ./startup.sh /startup.sh |
ENTRYPOINT | 运行容器时执行的shell命令,例如:ENTRYPOINT ["/bin/bash","-c","/startup.sh"]、ENTRYPOINT /bin/bash -c ‘/startup.sh’ |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或者其他容器,例如:VOLUME ["/path/to/dir"] |
USER | 为RUN,CMD,ENTRYPOINT执行命令指定运行用户,例如:USER www,镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。 |
WORKDIR | 为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录,例如:WORKDIR /data |
HEALTHCHECK | 健康检查,HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ |
ARG | 在构建镜像时指定一些参数,例如:FROM centos:6、ARG age=100 |
在网上看到一张图,十分形象地展示了这些指令的作用:
.dockerignore文件
.dockerignore文件表示写入该文件的路径要排除,不要打包进入image镜像文件。如果没有路径要排除,这个文件可以不新建。
比如,像node_modules这种很大的文件在构建镜像时便可以排除,因为被继承的镜像中可能已经含有node_modules,所以无需再添加。
requirements.txt文件
用于记录所有python依赖包及其精确的版本号,以便新环境部署。
而为什么这些内容不直接在Dockerfile文件中构建呢,这就涉及到Docker镜像构建原理:
Docker镜像是使用 Docker build 命令构建的。在构建镜像时,Docker创建了所谓的“层(layers)”。每一层都记录了Dockerfile中的命令所导致的更改,以及运行命令后镜像的状态。
Docker在内部缓存这些层,这样在重新构建镜像时只需要重新创建已更改的层。例如,使用了flask的基础镜像,相同容器的所有后续构建都可以重用它,因为它不会改变。但是,因为项目修改,在下次重新构建过程中 app 目录的内容可能会有所不同,因此只会重新构建这一层。
需要注意的是,每当重新构建某一层时,Dockerfile 中紧随其后的所有层也都需要重新构建。例如,我们首先复制 requirements.txt 文件,然后再复制应用程序的其余部分。这样之前安装的依赖项只要没有新的依赖关系,即使应用程序中的其他文件发生了更改,也不需要重新构建这一层。这一点在创建 Dockerfiles 时一定要注意。
因此,通过将 pip 安装与应用程序其余部分的部署分离,可以优化容器的构建过程。
制作过程
本次案例将选取一个基于flask框架的python应用进行制作,较为简单。首先,新建一个文件夹,存放项目代码:
然后,在该文件夹下新建一个app.py文件,并输入如下代码:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return """ <h1>Python Flask in Docker!</h1> <p>A sample web-app for running Flask inside Docker.</p> """
if __name__ == "__main__":
app.run(debug=True,host="0.0.0.0", port=8000)
##host一定不要用默认的"127.0.0.1",不然容器启动,即使映射了端口,在浏览器中也仍然是无法访问服务
然后新建requirements.txt文件,输入:
Flask==1.0.2
然后新建Dockerfile文件,输入:
FROM python:3.6
MAINTAINER yjh
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip install -r requirements.txt
COPY . /
EXPOSE 8000
ENTRYPOINT [ "python3" ]
CMD [ "app.py" ]
打开命令行,创建Image镜像:
docker build -t flask_demo:0.1 .
#-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
如果成功的话,输入docker image ls可以查看到:
然后输入以下代码生成容器:
docker container run -p 8000:8000 -it flask_demo:0.1
#-p参数:容器的 8000 端口映射到本机的 8000 端口。
#-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
在浏览器中打开下方网址,即可看到成功生成的flask网站:
发布image文件
Docker官方维护了一个DockerHub的公共仓库,里边包含有很多平时用的较多的镜像。除了从上边下载镜像之外,我们也可以将自己自定义的镜像发布(push)到DockerHub上。
先注册:https://hub.docker.com/
然后登陆:
docker login
接着,为本地的 image 标注用户名和版本:
docker image tag [imageName] [username]/[repository]:[tag]
发布 image 文件:
docker image push [username]/[repository]:[tag]
docker图形化工具
简介
docker 图形页面管理工具常用的有三种,DockerUI ,Portainer ,Shipyard 。DockerUI 是 Portainer 的前身,这三个工具通过docker api来获取管理的资源信息。其实,docker 图形页面管理工具也是作为一个容器在电脑中运行,可以理解成别人做了一个镜像,这个镜像的功能是将docker的相关信息可视化,而你只需要根据他做的镜像在你的电脑里生成一个容器来运行,登录到容器指定的页面进行访问即可。平时我们常常对着shell对着这些命令行客户端,审美会很疲劳,如果有漂亮的图形化界面可以直观查看docker资源信息,是非常方便的。
这三种图形化管理工具中,以Portainer最为受欢迎。同时它们的安装方法也大同小异,故笔者将只叙述Portainer的安装过程。
Portainer安装
首先,打开命令行,输入以下代码查看Portainer镜像源。
docker search portainer
可以选择自己喜欢的一个镜像进行下载(推荐选择STARS最多的,也可以选择汉化版镜像),输入如下代码:
docker search portainer
等待镜像下载完毕后,像之前生成容器一样生成一个该镜像的容器运行(注意,代码末尾根据自己的选择进行修改):
docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce
它如果输出一串字符串,说明运行成功了:
这时候,可以打开浏览器,输入 http://172.17.0.2:9000 即可访问图形化页面。
创建用户后,自动登录进入,点击“开始”:
点击“local”跳到仪表盘:
这样,图形化工具便创建完成:
补充
(暂无)
参考资料
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://blog.csdn.net/rui754220732/article/details/112145374
https://developer.aliyun.com/article/110806
https://blog.csdn.net/qq_38415505/article/details/83687207
https://zhuanlan.zhihu.com/p/71251233
https://www.cnblogs.com/frankdeng/p/9686735.html
https://blog.csdn.net/m0_37617778/article/details/107930536
目录 返回
首页