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内核和内核功能来分隔进程,以便各进程相互独立运行,这种独立性正式采用容器的目的所在,它可以独立运行多种进程,多个应用程序,更加充分的发挥基础设施的作用,同时保持各个独立系统的安全性,工作原理是基于namespacecgroup命令来实现的

容器工具可提供基于镜像的部署模式,这使得它能够轻松跨多环境,与其依赖程序共享应用或服务组,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 hub99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

技术分享图片

从上面可以看到,新镜像从base镜像一层一层叠加生成的,每安装一个软件,就在现有的镜像基础上增加一层

1.1 docker为什么要分层?

镜像分层的最大好处就是共享资源

比如有多个镜像都是从相同的base镜像构建而来,那么docker host只需在磁盘上保存一份base镜像;同时内存中也只需要加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享

如果多个容器贡献一个基础镜像,当某个容器修改了基础镜像内容,比如/etc下的文件,这时其他的容器的/etc下的文件是不会被修改的,修改操作只会被限制在单个容器中,这就是容器的copy-on-write特性

1.2 可写容器层

当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常叫做容器层,容器层下面的都叫做镜像层

技术分享图片


以上是关于Docker容器的主要内容,如果未能解决你的问题,请参考以下文章

linux_docker入门

无法使用 Rider 调试使用 docker 容器和 docker-compose 构建的 .net 核心应用程序。容器退出代码 139

vscode 远程连接 docker 容器进行 C++ 代码调试实践

使用 Spring Boot 代码运行 docker 容器

Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码

如何使用 VS Code 在 Docker 容器中远程调试 python 代码