Docker容器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器相关的知识,希望对你有一定的参考价值。
Docker
第1章 容器简介
1.1 什么是容器?
linux容器是与系统其它部分分隔开来的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件,容器提供的镜像包含了应用的所有依赖项,因而从开发到测试再到生产的整个过程中,它都具有可移植性和一致性
容器虚拟化按技术已经成为一种被大家广泛认可的容器技术服务器资源共享方式,容器技术可以在按需构建容器技术操作系统实例的过程中为系统管理员提供极大的灵活性,由于hypervisor虚拟化技术仍然存在一些性能和资源使用效率方面的问题,因此出现了一种称为容器的新型虚拟化技术来解决这些问题
详解:
假定您在开发一个应用,您使用的是一台笔记本电脑,而且您的开发环境具有特定的配置,其他开发人员深处的环境配置可能稍有不同,您正在开发的应用依赖于您当前的配置,还要依赖于某些特定文件,与此同时,您的企业还拥有标准化的测试环境和生产环境,且具有自身的配置和 一系列支持文件,您希望尽可能多的在本地模拟这些环境,而不产生重新创建服务环境的开销
因此,您要如何确保应用能够在这些环境中运行和通过质量检测,并且在部署过程中不出现令人头疼的问题,也无需重新编写代码和进行故障修复?答案就是容器,容器可以确保您的应用拥有必须的配置和文件,使得这些应用能够从开发到测试,在到生产的整个顺利运行,而不出现任何不良问题,这样可以避免危机
1.1 容器不就是虚拟化吗?
虚拟化使得许多操作系统可同时在单个系统上运行
容器则可共享同一个操作系统内核,将应用进程与系统其它部分隔离开
这意味着什么呢?
首先,让多个操作系统在单个虚拟机监控程序上运行以实现虚拟化,并不能达成和使用容器同等的轻量级效果,事实上,在仅拥有容量有限的有限资源时,您需要能够可以进行密集部署的轻量级应用,linux容器可从单个操作系统运行,在所有容器中共享该操作系统,因此应用和服务能够保持轻量级,并快速运行,所以和KVM对比下,kvm是重量级的虚拟化技术,而docker更加轻量级,针对应用的虚拟化
1.1 容器的生态链:
? 容器的平台技术:
编排引擎:
docker swarm
k8s(kubernetes) 谷歌提供
? 管理平台:
rancher
containership
? 容器网络:
docker network
flannel
waeave
第2章 什么是docker?
docker可以看做是一个特殊的文件系统,处理提供容器运行需要的程序,库资源,配置文件外,还包含了运行的准备的配置参数,镜像不包含任何动态数据
2.1 docker包含三个概念:
? 镜像 : 镜像是docker运行容器的前提
? 仓库 : 存放镜像的地方
? 容器 : docker容器和文件夹很类似,一个docker容器包含了所有的某个应用运行所需要的环境,这些容器各自独立,并且这些容器都是从镜像创建的
2.2 docker如何工作?
docker技术使用linux内核和内核功能来分隔进程,以便各进程相互独立运行,这种独立性正式采用容器的目的所在,它可以独立运行多种进程,多个应用程序,更加充分的发挥基础设施的作用,同时保持各个独立系统的安全性,工作原理是基于namespace和cgroup命令来实现的
容器工具可提供基于镜像的部署模式,这使得它能够轻松跨多环境,与其依赖程序共享应用或服务组,docker还可以在这一容器环境中自动部署应用程序(或者合并多种流程,以构建单个应用程序)
此外,由于这些工具基于linux容器构建,使得docker既易于使用,又别具一格,它可以为用户提供前所未有的高度应用程序访问权限,快速部署以及版本控制和分发能力
2.3 docker技术是否与传统的linux容器相同?
否!docker技术最初是基于LXC技术构建,但后来他逐渐摆脱了对这种技术的依赖
就轻量级虚拟化这一功能来看,LXC非常有用,但它无法提供出色的开发人员或用户体验,除了运行容器之外,docker技术还具备其他多项功能,包括简化用于构建容器,传输镜像以及控制镜像版本的流程
传统的linux容器使用init系统来管理多种进程,这意味着,所有应用程序都作为一个整体运行,与此相反,docker技术鼓励应用程序各自独立运行其进程,并提供相应工具来实现这一功能,这种精细化运作模式自有其优势
1.1 docker的工作流程:
先说一下docker核心组件:
? docker客户端---client 容器所有操作
? docker服务器---docker daemon 容器的API
? docker镜像 ---image
1. 例如启动一个nginx服务,docker daemon会先查看image中是否有镜像
2. 如果没有nginx image镜像,daemon会去仓库pull nginx镜像
3. 下载到本地后,加入容器中
第2章 部署docker
? 下载docker源:
[[email protected] ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
? 修改源中下载地址:
[[email protected] yum.repos.d]# sed 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' docker-ce.repo -i
? 进行docker安装:
[[email protected] yum.repos.d]# yum -y install docker-ce
? 启动docker服务:
[[email protected] ~]# systemctl start docker
? 启动容器:
[[email protected] share]# docker run -p 80:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx 8176e34d5d92: Pull complete 5b19c1bdd74b: Pull complete 4e9f6296fa34: Pull complete Digest: sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de Status: Downloaded newer image for nginx:latest 安装完成后命令行会一直hang住
可加上-d参数加入后台运行
? 访问主机ip地址检测:
第1章 监听远程端口
? 修改启动文件
[[email protected] ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0
? 重新加载并重启docker服务
[[email protected] ~]# systemctl daemon-reload [[email protected] ~]# systemctl restart docker.service
? 在其他机器上进行测试
[[email protected] ~]# docker -H 10.0.0.63 info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 18.03.0-ce Storage Driver: devicemapper
第2章 Docker镜像相关操作:
? 搜索镜像:
[[email protected] lib]# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 4081 [OK] ansible/centos7-ansible Ansible on Centos7 105 [OK] jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x86_… 92 [OK]
? 列表参数说明:
参数 | 说明 |
NAME | 镜像名称 |
DESCRIPTION | 镜像说明 |
STARS | 点赞数量 |
OFFICIAL | 是否是官方的 |
AUTOMATED | 是否是自动构建的 |
? 获取镜像:
[[email protected] ~]# docker image pull alpine
? 查看镜像列表:
[[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest e548f1a579cf 2 weeks ago 109MB
? 删除镜像:
[[email protected] ~]# docker images rmi
? 导出镜像:
[[email protected] ~]# docker image save alpine:latest >docker-alpine.tar.gz
[[email protected] ~]# ll total 4316 -rw-r--r--. 1 root root 4412416 Mar 8 22:48 docker-alpine.tar.gz
? 导入镜像:
[[email protected] ~]# docker image load -i docker-alpine.tar.gz [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest e548f1a579cf 2 weeks ago 109MB alpine latest 3fd9065eaf02 8 weeks ago 4.14MB
-i 参数指定镜像的位置
? 查看镜像详细信息
docker inspect centos-jiang [ { "Id": "sha256:966bc81ffbe96f293f2f713cfdc5ef88e27571f09f31a885d375daf06c5b2ef7", "RepoTags": [ "centos-jiang:latest" ],
第3章 Docke生成镜像的方式
? dockerfile最大的好处就是提交镜像不用手动commit,先来看一下手动提交的方式
? 而且docker镜像的生成是基于你进入的当前容器的位置,并生成一个新的镜像层
[[email protected] ~]# docker history centos IMAGE CREATED CREATED BY SIZE COMMENT e934aafc2206 2 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:f755805244a649ecc… 199MB [[email protected] ~]# docker history centos-wget IMAGE CREATED CREATED BY SIZE COMMENT db4068543936 2 minutes ago /bin/bash 0B e934aafc2206 2 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:f755805244a649ecc… 199MB
3.1 手动生成镜像
? 进入容器创建一个文件或下载之类的操作都可以
[[email protected] docker]# docker run -it centos-wget [[email protected] /]# touch jiang [[email protected] /]# ls anaconda-post.log bin dev etc home jiang lib lib64 media mnt opt proc root run sbin
? 使用docker ps查找镜像的随机名称
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6b741b9b4cb4 centos-wget "/bin/bash" 4 minutes ago Up 4 minutes blissful_volhard 1882ab7b9e7e nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp eloquent_villani
? 使用dcoker commit生成镜像
docker commit blissful_volhard centos-jiang sha256:966bc81ffbe96f293f2f713cfdc5ef88e27571f09f31a885d375daf06c5b2ef7
? 再次查看镜像,是否已经生成
docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos-jiang latest 966bc81ffbe9 43 seconds ago 199MB centos-wget latest db4068543936 8 minutes ago 199MB nginx latest b175e7467d66 2 weeks ago 109MB centos latest e934aafc2206 2 weeks ago 199MB
? 进入镜像查看创建的文件是否存在
docker run -it centos-jiang [[email protected] /]# ls anaconda-post.log bin dev etc home jiang lib lib64
3.2 使用dockerfile方式自动生成镜像
? dockerfile常用指令:
from ---指定基础镜像
maintainer ---指定维护者信息,可以没有
run ---放在命令的前面
add ---copy文件,会自动解压
workdir ---设置当前工作目录
volume ---设置卷,挂载主机目录
expose ---指定对外端口
cmd ---指定容器启动后要干的事情
env ---设置环境变量
? 编写dockerfile文件
[[email protected] tmp]# vim dockerfile FROM centos RUN yum -y install vim
? 执行dockerfile文件
[[email protected] tmp]# docker build -t centos-vim /tmp/dockerfile Sending build context to Docker daemon 4.608kB Step 1/2 : FROM centos ---> e934aafc2206 Step 2/2 : RUN yum -y install vim ---> Running in 96baf80ceda5 Loaded plugins: fastestmirror, ovl docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest e934aafc2206 Less than a second ago 199MB centos-vim latest e5e1a4ed8116 17 seconds ago 357MB docker history centos-vim IMAGE CREATED CREATED BY SIZE COMMENT e5e1a4ed8116 57 seconds ago /bin/sh -c yum -y install vim 158MB e934aafc2206 Less than a second ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> Less than a second ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> Less than a second ago /bin/sh -c #(nop) ADD file:f755805244a649ecc… 199MB
第4章 docker中的镜像分层
docker支持通过扩展现有的镜像,创建新的镜像,实际上,docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
从上面可以看到,新镜像从base镜像一层一层叠加生成的,每安装一个软件,就在现有的镜像基础上增加一层
1.1 docker为什么要分层?
镜像分层的最大好处就是共享资源
比如有多个镜像都是从相同的base镜像构建而来,那么docker host只需在磁盘上保存一份base镜像;同时内存中也只需要加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享
如果多个容器贡献一个基础镜像,当某个容器修改了基础镜像内容,比如/etc下的文件,这时其他的容器的/etc下的文件是不会被修改的,修改操作只会被限制在单个容器中,这就是容器的copy-on-write特性
1.2 可写容器层
当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常叫做容器层,容器层下面的都叫做镜像层
以上是关于Docker容器的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Rider 调试使用 docker 容器和 docker-compose 构建的 .net 核心应用程序。容器退出代码 139
vscode 远程连接 docker 容器进行 C++ 代码调试实践