#docker学习
1 容器简介
1.1什么是容器
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文 件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和 一致性。
- 更加详细地来说,请您假定您在开发一个应用。您使用的是一台笔记本电脑,而且您的开发环境具有特定的配置。其他开发人员身处的环境配置可能稍有不同。您正在开发的应用依赖于您当前的配置,还要依赖于某些特定文件。与此同时,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境,而不产生重新创建服务器环境的开销。
- 因此,您要如何确保应用能够在这些环境中运行和通过质量检测,并且在部署过程中不出现令人头疼的问题,也无需重新编写代码和进行故障修复?答案就是使用容器。容器可以确保您的应用拥有必需的配置和文件,使得这些应用能够在从开发到测试、再到生产的整个流程中顺利运行,而不出现任何不良问题。这样可以避免危机,做到皆大欢喜。
虽然这只是简化的示例,但在需要很高的可移植性、可配置性和隔离的情况下,我们可以利用 Linux 容器通过很多 方式解决难题。无论基础架构是在企业内部还是在云端,或者混合使用两者,容器都能满足您的需求。
1.2 容器是虚拟化?
容器可以称之为虚拟化,但也不等同于虚拟化。我们用一种简单方式来思考一下:
虚拟化使得许多操作系统可同时在单个系统上运行。
容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。
这意味着什么?首先,让多个操作系统在单个虚拟机监控程序上运行以实现虚拟化,并不能达成和使用容器同等的 轻量级效果。事实上,在仅拥有容量有限的有限资源时,您需要能够可以进行密集部署的轻量级应用。Linux 容器 可从单个操作系统运行,在所有容器中共享该操作系统,因此应用和服务能够保持轻量级,并行快速运行。
1.3 容器发展简史
2 什么是Docker?
是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
-
是在Linux容器里运行应用的开源工具
-
是一种轻量级的"虚拟机”
-
Docker的容器技术可以在一台主机 上轻松为任何应用创建一个轻量级的、 可移植的、自给自足的容器。
借助 Docker ,您可将容器当做重量轻、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器 的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境。
2.1 Docker如何工作?
Docker 是一种容器化平台,可以将应用程序和它们的依赖项打包成一个轻量级的、可移植的容器,以便在不同的
计算机环境中运行。Docker 的工作原理如下:
- Docker使用一个称为Dockerfile的文件来定义容器的配置。Dockerfile中包含了应用程序和依赖项的安装、 环境变量设置、文件系统设置等指令。
- Docker使用Dockerfile来创建一个镜像。镜像是一个只读的文件系统,包含了应用程序和依赖项以及容器运 行所需的所有文件和设置。每个镜像都有一个唯一的标识符,称为镜像 ID。
- 使用镜像来创建容器。容器是镜像的运行实例,是一个隔离的、可执行的环境。容器中包含了应用程序和依赖 项以及容器运行所需的所有文件和设置。容器可以在任何 Docker 支持的计算机上运行,并且可以随时启动、 停止或删除。
- Docker使用一个称为Docker引擎的守护程序来管理容器。Docker引擎可以创建、启动、停止和删除容器, 还可以监视容器的状态并提供日志输出和统计信息。
2.2 Docker技术是否与传统的Linux容器相同?
Docker 技术最初是基于 LXC 技术构建(大多数人都会将这一技术与“传统的” Linux 容器联系在一起),但后来它逐渐摆脱了对这种技术的依赖。
就轻量级虚拟化这一功能来看,LXC 非常有用,但它无法提供出色的开发人员或用户体验。除了运行容器之外,Docker 技术还具备其他多项功能,包括简化用于构建容器、传输镜像以及控制镜像版本的流程。
2.3 Docker的目标
Docker的设计宗旨: Build,Ship and Run Any App, Anywhere, 构建,运输,处处运行
docker的主要目标是"Build,Ship and Run any App,Angwhere"
构建:做一个docker镜像
运输:docker pull
运行:启动一个容器
每一个容器,他都有自己的文件系统rootfs.
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行"的目 的。
这里的组件,既可以是一一个应用,也可以是一套服务,甚至是一个完整的操作系统。
传统的 Linux 容器使用 init 系统来管理多种进程。这意味着,所有应用程序都作为一个整体运行。与此相反, Docker 技术鼓励应用程序各自独立运行其进程,并提供相应工具以实现这一功能。这种精细化运作模式自有其优势。
2.4 容器的特点
容器化越来越受欢迎,因为容器是:
-
灵活:即使是最复杂的应用也可以集装箱化。
-
轻量级:容器利用并共享主机内核。
-
可互换:可以即时部署更新和升级。
-
便携式:可以在本地构建,部署到云,并在任何地方运行。
-
可扩展:可以增加并自动分发容器副本。
-
可堆叠:可以垂直和即时堆叠服务。
2.5 容器核心技术
docker容器本质就是宿主机的个进程,docker容器是通过namespace实现资源隔离,通过cgroup实现资源限制
通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁 盘500g)
2.6 Docker核心概念
-
镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时 间,库、环境变量、和配置文件。 Docker镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。 因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。
-
容器
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每--个容器都是相互隔离、互不可 ⻅,以保证平台的安全性。 可以把容器看做是一个简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的 应用程序。
-
仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库 (Public) 或者私有
仓库(Private) 。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。Docker的镜像、容器、日志等内容全部都默认存储在/var/lib/docker 目录下。
总结
容器:
提供在多台主机上运行应用程序相同的运行环境
docker:
是开源的容器引擎,GO语言开发的,是容器里运行应用的工具,是一个轻量级的虚拟机 可以利用docker在多台主机上轻松的创建并运行容器 docker容器可以被看作运行在宿主机上的一个进程,容器共享宿主机的内核, 容器间是通过namespace (命名空间、名称空间)隔离资源,通过cgroups ( 资源配额)去限制资源
核心概念
镜像 :运行容器的基础,包含运行应用程序所需的所有内容.
容器 :是从镜像创建的运行实例
仓库 :集中保存镜像的地方(公有仓库docker hub,私有仓库harbor )
4 Docker镜像相关操作
4.1 搜索官方仓库镜像
[root@docker01 ~]# docker search centos
列表说明
参数 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像说明 |
STARS | 点赞数量 |
OFFICIAL | 是否是官方的 |
AUTOMATED | 是否是自动构建的 |
4.2 获取镜像
根据镜像名称拉取镜像
[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
查看当前主机镜像列表
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 080ed0ed8312 39 hours ago 142MB
centos latest 5d0da3dc9764 18 months ago 231MB
拉第三方镜像方法
[root@docker01 ~]# docker pull index.tenxcloud.com/tenxcloud/httpd
4.3 镜像导出和导入
#镜像导出
[root@docker01 ~]# docker save centos > docker-centos.tar.gz
#参数说明
save #保存镜像
centos #镜像名称
#镜像导入
[root@docker01 ~]# docker load -i docker-centos.tar.gz
#参数说明
load #镜像导入
-i #从tar存档文件读取
4.4 删除镜像
[root@docker01 ~]# docker rmi centos:latest
#参数说明
rmi #删除镜像
centos #镜像名称
latest #镜像版本号
4.5 查看镜像的详细信息
[root@docker01 ~]# docker inspect centos
5 容器的日常管理
5.1 容器启动和停止
运行一个最简单的容器
[root@docker01 ~]# docker run nginx
创建容器两步走(不常用)
[root@docker01 ~]# docker create centos:latest /bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
[root@docker01 ~]# docker start stupefied_nobel
stupefied_nobel
快速启动容器方法
[root@docker01 ~]# docker run centos:latest /usr/bin/sleep 20;
容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
查看正在运行容器
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94de8f61a48e nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp nice_mirzakhani
[root@docker01 ~]# docker container ls #不常用可忽略
查看正在运行容器详细信息(包括IP地址)
[root@docker01 ~]# docker inspect docker_name/docker_id
#参数说明
inspect #查看容器详细信息
docker_name #容器名称
docker_id #容器id
查看所有容器(运行中及未运行)
[root@docker01 ~]# docker ps -a
停止容器
[root@docker01 ~]# docker stop docker_name/docker_id
[root@docker01 ~]# docker container kill docker_name/docker_id #不常用可忽略
#参数说明
stop #停止容器
docker_name #容器名称
docker_id #容器id
5.2 进入容器方法
启动时进入容器
[root@docker01 ~]# docker run -it
#参数说明
-it 可交互终端
[root@docker01 ~]# docker run -it nginx:latest /bin/bash
root@79241093859e:/#
启动后进入容器
#启动一个docker并进入容器(不推荐使用)
[root@docker01 ~]# docker run -it centos:latest
[root@1bf0f43c4d2f /]# ps -ef
UID root root
PID PPID C STIME TTY TIME CMD
10015:47 pts/000:00:00 /bin/bash
131015:47 pts/000:00:00 ps -ef
#exec进入容器方法(推荐使用)
[root@docker01 ~]# docker exec -it lucid_williamson /bin/bash
[root@b8bbb2299397 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:20 pts/0 00:00:00 /bin/bash
root 14 0 0 14:21 pts/1 00:00:00 /bin/bash
root 27 14 0 14:21 pts/1 00:00:00 ps -ef
退出/离开容器
[root@b8bbb2299397 /]# exit
exit
5.3 删除一个或多个容器
#删除一个停止后的容器
[root@docker01 ~]# docker rm docker_name/docker_id
#删除一个运行中的容器
[root@docker01 ~]# docker rm -f docker_name/docker_id
#参数说明
rm #删除容器
-f #强制删除容器
docker_name #容器名称
docker_id #容器id
#删除多个容器(所有)!!!谨慎操作
[root@docker01 ~]# docker rm -f `docker ps -a -q`
[root@docker01 ~]# docker ps -qa | xargs docker rm -f
5.4 启动时进行端口映射
[root@docker01 ~]# docker run -d -p 8888:80 nginx:latest
287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9
参数:
run #运行
-d #放入后台运行
-p #端口映射
8888 #容器外部端口
80 #容器内部端口
不同指定映射方法
参数 | 说明 |
---|---|
-p hostPort:containerPort | 端口映射 -p 8080:80 |
-p ip:hostPort:containerPort | 配置监听地址 -p 10.0.0.100:8080:80 |
-p ip::containerPort | 随机分配端口 -p 10.0.0.100::80 |
-p hostPort:containerPort:udp | 指定协议 -p 8080:80:tcp |
-p 81:80 –p 443:443 | 指定多个 |