Py学习  »  docker

零基础入门 Docker(上)

安全优佳 • 4 年前 • 286 次点击  
点击上方“安全优佳” 可以订阅哦!

一、Docker 简介、应用场景和优点

1.1 简介

  • Docker 是开源应用容器引擎,轻量级容器技术。

  • 基于 Go 语言,并遵循 Apache2.0 协议开源。

  • Docker 可以让开发者打包他们的应用、依赖包及配置文件打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 系统上,也可以实现虚拟化。

  • 容器完全使用沙箱技术,相互之间不会有任何接口。

  • 类似于虚拟机技术(vmware、vitural),但 docker 直接运行在操作系统(Linux)上,而不是运行在虚拟机中,速度快,性能开销极低。

白话文,简介就是:

Docker 支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。 运行中的这个镜像称为容器,容器启动是非常快速的。类似 windows 里面的 ghost 操 作系统,安装好后什么都有了。

1.2 Docker 应用场景

  • Web 应用的自动化打包和发布。

  • 自动化测试和持续集成、发布。

  • 在服务型环境中部署和调整数据库或其他的后台应用。

  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

1.3 Docker 优点

  • 简化程序: Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker 改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker 中进行管理。方便快捷已经是 Docker 的最大优势,过去需要用数天乃至数周的任务,在 Docker 容器的处理下,只需要数秒就能完成。

  • 避免选择恐惧症: 如果你有选择恐惧症,还是资深患者。Docker 帮你打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。

  • 节省开支: 一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

三、Docker 核心概念

3.1 docker 镜像(Images)

  • 一个只读模板,可以用来创建容器,一个镜像可以创建多个容器

  • Docker 提供了一个很简单的机制来创建和更新现有的镜像,甚至可以直接从其他人那里获取做好的镜像直接使用

  • 可以理解为 Java 中的类

3.2 docker 容器(Container)

  • 容器是从镜像创建的运行实例,也就是镜像启动后的一个实例称为容器,是独立运行的一个或一组应用。

  • docker 利用容器来运行应用,他可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。

  • 可以把容器看做是一个简易版的 Linux(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

  • 可以理解为 Java 中通过类创建的实例。

3.3 docker 仓库(Resoisitory)

  • 仓库是集中存放镜像文件的场所,类似 git 代码仓库等。

  • 仓库(Respository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器一般存放多个仓库,每个仓库又有多个镜像,每个镜像又有不同的标签(tag)。

  • 仓库分为公开仓库(public)和私有仓库(private)两种形式。

  • 最大的公开仓库是 Docker Hub,国内的公开仓库有阿里云等。

  • 可以在本地网络创建一个私有仓库。

  • 当创建好自己的镜像后,可以通过 push 命令把它上传到公开或私有仓库。

  • 仓库的概念类似 Git,仓库注册服务器可以理解为 GitHub 这种托管服务。

3.4 docker 主机(Host)

  • 一个物理或虚拟的机器用来执行 Docker 守护进程和容器。

3.5 docker客户端(Client)

  • 客户端通过命令行或其他工具使用 Docker。

API 与 Docker 的守护进程进行通信

四、Docker 安装及启停

4.1 查看 centos 版本(以 centos7.4 为例)

Docker 要求 CentOS 系统的内核版本高于 3.10。

通过命令:

uname -r

查看当前 centos 版本,如版本不符,需升级系统版本。

4.2 升级软件包及内核(可选)

yum update

4.3 安装 docker

yum install docker

4.4 启动 docker

systemctl start docker

4.5 将 docker 服务设为开机启动

systemtctl enable docker

4.6 停止 docker

systemtctl stop docker

五、Docker 镜像常用操作命令

通常情况下,Docker 的镜像都放在 Docker 的官网 Docker Hub 上,点此前往官网

5.1 镜像检索

除了可以在 Docker Hub 上搜索镜像外,还可以通过命令 docker search xxx 进行搜索,下面以 mysql 为例:

docker search mysql

结果如下:

  • OFFICAL:是否是官方镜像

  • AUTOMATED:是否是自动构建的

另,docker search -参数 含义:

  • -s 30:列出收藏数不小于指定值(此处为 30)的镜像;

  • --no-trunc:显示镜像完整描述信息(eg. DESCRIPTION 字段完整展示);

  • --automated:只列出 automated build 类型的镜像(利用 dockerhub 提供的自动化构建技术在服务端直接构建镜像会被标记为 AUTOMATED);

5.2 镜像下载

下载命名为:docker pull 镜像名:tag;

其中,

  • tag 多为系统的版本,可选的,默认为 least;

eg.

docker pull mysql

5.3 镜像列表

获取已下载镜像列表命令:docker images

其中,

  • RESPOSITORY 为镜像名;

  • TAG 为镜像版本;

  • least 代表最新版;

  • IMAGE_ID 为该镜像唯一 ID;

  • CREATED 为该镜像创建时间;

  • SIZE 为该镜像大小。

docker images -参数 含义:

  • -a:列出本地所有镜像,含中间镜像层;

  • -q:只显示镜像 ID;

  • --digests:显示镜像摘要信息;

  • --no-trunc:显示完整的镜像信息(eg. 显示完整的IMAGE_ID信息)。

5.4 镜像删除

删除指定镜像:

docker rmi image-id

删除多个镜像:

docker rmi mysql tomcat

删除所有镜像:

docker rmi $(docker images -q)

强制删除镜像:

docker rmi -f image-id:强制删除(当前镜像启动的容器正在运行中,是无法正常删除的,可以通过 -f 强制删除)

如果删除时不指定 TAG,默认为最新版 Least。

六、Docker 容器常用操作命令

镜像运行起来后,称为容器。 可以理解为软件下载(下载 QQ)--> 安装(QQ)--> 运行(QQ)的过程。 下面以 Tomcat 为例

6.1 搜索镜像

docker search tomcat

6.2 下载镜像

docker pull tomcat

6.3 根据镜像新建并启动容器

最简单的根据镜像新建并启动容器的命令如下:

docker run --name container-name -d image-name

运行一个容器,使用 docker run 命令即可。 另,docker run -参数 含义:

  • -- name:为容器起一个名称;

  • -d:detached,执行完这句命令后,控制台将不会阻塞,可以继续输入命令操作,不会阻塞,也就是启动守护式容器,如果执行 docker run --name mycentos -it centos会进入启动容器的命令控制台,也就是启动交互式容器;

  • -i:以交互方式运行容器,通常与 -t 搭配使用;

  • -t:为容器重新分配一个伪输入终端,通常与 -i 搭配使用;

  • -P:随机端口映射;

  • -p:指定端口映射,后面会有端口映射详细讲解;

  • image-name:要运行的镜像名称;

如果以守护式方式启动 centos 容器,执行如下命令:docker run --name mycentos -d centos,会正常返回 container-id,但是通过 docker ps 查看,却发现没有在运行,通过 docker ps -a 发现,原来已经停止了,这是为什么呢?

原因及解决方案详见:点我直达

6.4 查看容器

可通过如下命令,查看运行中的容器列表:

docker ps

  • CONTAINER ID:启动时生成的 ID;

  • IMAGE:该容器使用的镜像;

  • COMMAND:容器启动时执行的命令;

  • CREATED:容器创建时间;

  • STATUS:当前容器状态;

  • PORTS:当前容器所使用的默认端口号;

  • NAMES:启动时给容器设置的名称。

另,docker ps -参数含义:

-a:查看所有容器,包括已停止运行的; -q:静默模式,只显示容器编号; -l:显示最近创建的容器; -n 3:显示最近创建的 num(此处为 3)个容器; --no-trunc:不截断输出,显示完整信息。

6.5 停止容器

通过以下命令来停止运行中的容器:

docker stop container-name/container-id

强制停止容器(类似强制关机):

docker kill container-name/container-id

6.6 启动容器

通过以下命令启动容器:

docker start container-name/container-id

6.7 重启容器

通过以下命令启动容器:

docker restart container-name/container-id

6.8 删除容器

删除单个容器:

docker rm container-id

删除多个容器:

docker rm container-id container-id

删除所有容器:

docker rm $(docker ps -a -q )

另,docker rm -参数含义:

-f:强制删除,如果在运行中,先停止,再删除

6.8 查看容器日志

查看当前容器日志,可通过如下命令:

docker logs container-id/container-name

另,docker logs -参数含义:

  • -t:加入时间戳;

  • -f:跟随最新的日志打印;

  • --tail:显示最后多少条。

6.9 连接到正在运行容器

docker attach container-id:连接到正在运行的容器;

要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。

官方文档中说 attach 后可以通过 CTRL-C 来 detach,但实际上经过我的测试,如果 container 当前在运行 bash,CTRL-C 自然是当前行的输入,没有退出;如果 container 当前正在前台运行进程,如输出 nginx 的 access.log 日志,CTRL-C 不仅会导致退出容器,而且还 stop 了。

这不是我们想要的,detach 的意思按理应该是脱离容器终端,但容器依然运行。好在 attach 是可以带上 --sig-proxy=false 来确保 CTRL-D 或 CTRL-C 不会关闭容器。

eg.

docker attach --sig-proxy=false 7f237caad43b

6.10 在运行的容器中执行命令

运行中的容器其实是一个功能完备的简易版 Linux 操作系统,所以我们可以像常规系统一样进行登陆及退出操作。

命令为:

docker exec -it container-id/container-name bash

退出命令为:

exit

exec 和 attach 区别:

  • attach:直接进入容器启动命令的终端,不会启动新的进程;

  • exec:在容器中打开新的终端,并且可以启动新的进程,可在宿主机中直接执行操作容器的命令,eg. docker exec -it 7f237caad43b ls /tmp。

6.11 查看容器中正在运行进程

可用通过如下命令查看容器中正在运行进程:

docker top container-id/container-top

6.12 查看容器内部细节

可用通过如下命令查看容器内部细节,返回为 json:

docker insepct container-id

6.13 容器和宿主机互相拷贝文件

宿主机拷贝文件到容器:

docker cp 文件 container-id:目标文件/文件夹
eg.
docker cp /tmp/suzhuji.txt 7f237caad43b:/tmp
将宿主机tem文件夹下suzhujia.txt文件拷贝到容器7f237caad43b中tmp目录中

从容器拷贝文件到宿主机:

docker cp container-id:目标文件/文件夹 宿主机目标文件/文件夹
eg.
docker cp 7f237caad43b:/tmp/yum.log /tmp
将容器7f237caad43b中tmp目录下yum.log拷贝到宿主机/tmp目录下

6.14 更多操作命令

更多命令可以参考:

https://docs.docker.com/engine/reference/commandline/docker/

七、Docker 端口映射

7.1 启动做端口映射的容器

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P(大写) 或 -p (小写) 参数来指定端口映射。启动容器的时候如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

Docker 的端口映射通过 -p 或 -P 参数实现,命令如下:

docker run --name tomcat1 -d tomcat
docker run --name tomcat2 -d -p 8888:8080 tomcat

如上,就把主机端口 8888 请求映射到 Docker 容器内部端口 8080 了。

-p 和 -P 区别为:

-P : 随机映射一个49000~49900的端口到内部容器开放的网络端口
-p : 可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器

执行完这两条命令后,通过 docker ps 查看:

通过 PORTS 可以看出,tomcat2 是做了端口映射的,tomcat1 是没进行映射过的。

分别通过浏览器访问:

http://*.*.*.*:8080/ // tomcat1默认端口; http://*.*.*.*:8888/ // 做过端口映射的 Tomcat2,8888 会转发请求到 tomcat2 的 8080。

结果如下:

第一个请求是无法请求到的,原因开篇处说过了。
第二个请求是可以正常进行请求的,会由 tomcat2 容器进行处理

7.2 端口映射格式

ip:hostport:containerport #指定ip、指定主机port、指定容器port
eg. docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
指定映射使用一个特定地址,比如 localhost地址 127.0.0.1
ip::containerport #指定ip、未指定主机port、指定容器port
eg. docker run -d -p 127.0.0.1::5000 training/webapp python app.py
绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口
还可以使用 udp 标记来指定 udp 端口
eg. docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
hostport:container #未指定ip port、指定主机port、指定容器port
eg. docker run -d -p 5000:5000 training/webapp python app.py
将本地的 5000 端口映射到容器的 5000 端口,默认会绑定本地所有接口上的所有地址

7.3 查看端口映射

可以通过如下命令查看容器映射了哪些端口及协议:

docker port container-id

示例:

[root@docker ~]#docker port 46114af6b44e
8080/tcp -> 0.0.0.0:8888
[root@docker ~]#docker port cea668ee4db0

如果返回空,则代表没进行端口映射。

7.4 小结

  • 容器有自己的内部网络和 ip 地址,可以使用 docker inspect container-id 可以获取所有的变量

  • Docker 还可以有一个可变的网络配置

  • -p 标记可以多次使用来绑定多个端口 eg. docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

八、总结与瞻望

8.1 总结

通过本篇,希望你可以清楚的了解

  • Docker 是什么,具有什么样的优势和应用场景;

  • Docker 的安装及核心概念;

  • Docker 容器及镜像常用命令;

  • Docker 端口映射的原因及操作。

在准备好这些枯燥的理论基础和基本命令后,就可以进行对 Docker 的进阶与实战篇了。

8.2 瞻望

在进阶与实战篇,预计内容规划如下(可能会不断调整及优化):

1. Docker 镜像原理及 commit

1.1 再看镜像及基础镜像

1.1 UnionFS 联合文件系统

1.2 镜像分层原理及好处

1.4 特点 Copy-on-Write

2. Docker 容器数据卷

2.1 介绍

2.2 用 V 命令添加

2.3 用 DockerFile 添加

2.4 volumes-from

3. Dockerfile 介绍及实战

3.1 概念

3.2 构建过程解析

3.3 保留字指令

3.4 自定义镜像

3.5 发布镜像

4. Docker 实战

4.1 安装 MySQL

4.2 安装 Redis

4.3 本地镜像推送到阿里云

安全优佳

http://news.secwk.com

长按识别左侧二维码,关注我们

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32947
 
286 次点击