Docker 容器介绍

Docker 容器介绍

Docker 是一个基于 Go 语言的开源应用容器引擎,它既能实现虚拟化,又可用于将应用服务打包成轻量、可移植的容器,从而可以发布到任何 Linux 平台。除了优秀了沙箱机制外,Docker 容器的开销也极低。
正如其名,Docker 所做的事情正是以一个集装箱的身份承载应用服务的运行,它与传统的 KVMXen 等基于硬件虚拟化的云计算系统不同,而是采用了 LXC (Linux Container) 内核虚拟化的模式,使得应用服务不再需要独立的货轮(OS)为其提供运作环境,而是装载到集装箱(Container)中运行服务。

Docker 架构

组件

  • 镜像Docker 容器的模板,一般是一套完整的根文件系统。很多发行版都提供了官方可用的容器镜像,如 UbuntuCentOSAlpine 等。镜像中还会记录容器的基本信息如挂载点、外部端口和容器启动时需要执行的命令等。
  • 容器Docker 系统中相互独立的对象,它们是镜像的实例,也是应用运行的实体。从虚拟化的角度来讲,它们就类似一个个运行的虚拟机。容器可以方便地进行创建/删除操作,并随时启动/停止服务。为了向外部服务和实现数据持久化,容器通常能够绑定到主机的端口映射,以及挂载主机的特定路径。
  • 仓库的概念对于熟知 Linux 软件包管理的人来说已经不算是新鲜事物了,它在 Docker 系统中作为一个代码控制中心,主要负责镜像的管理和存取。Docker 官方维护的公共仓库:Docker Hub

核心

  • Server-Client 模式Docker 系统的本地工作模式,Docker Daemon 作为一个服务端,控制着容器的运行,并监听来自客户端的请求。Docker Client 负责执行用户的指令,向 Daemon 发出请求,从而完成操作。因此,尽管有些情形下没有必要,但 Docker 服务确实是可以进行远程管理的。
  • LXC 系统使用了由 Linux 内核提供的 namespace 功能,其 pidnetipcmntuts 等各 namespace 组件实现了进程、网络、消息、文件系统与主机名等各部分的隔离;它还通过 cgroups 来实现资源的配额与度量。
  • AUFS用于将不同目录挂载到一个虚拟文件系统下,并对虚拟文件系统进行了分层。简而言之,从一个镜像 A 进行修改并构建另一个镜像 B,则对于镜像 B 来说,A 原有的文件系统 Layer 是只读的,所有对 A 中原文件系统的更改只会存在于 B 新建的 Layer 中,这样就实现了个多个子镜像共用同一个父镜像。在创建容器时,Docker 会从 bootfs 开始逐层加载,直到加载到目标镜像并最终建立容器。在多容器并行的情形下,它们有着共同的底层镜像,所有的修改都存在于各自的顶层 Layer 中。
  • GRSEC是由内核提供的安全补丁,主要用于保护 host 主机,并非 Docker 组件。

Docker 运用

安装

很多发行版的软件仓库里已经为您准备好了 Docker 相关的包——但或许您更喜欢使用最新的 Docker 版本,在这种情况下,您可以参照 Docker 官方的安装文档。官方提供了 CentOSDebianFedoraUbuntu 的安装源和安装说明,同时也提供了从二进制文件配置安装的方法。参照官方文档的流程安装,通常不会出错。

这里给出 Debian 9 - Stretch 安装 Docker 的示例。

  • 为了安装最新的官方版本,首先需要卸载本地已安装的旧版 Docker 相关套件。(如未安装过旧版,可跳过此步。)
sudo apt purge docker docker-engine docker.io containerd runc
  • 接下来执行添加源和安装 Docker 的操作:
# 刷新数据库
sudo apt update
# 一些必要的前置
sudo apt install apt-transport-https ca-certificates     curl gnupg2 software-properties-common
# 添加 Docker 官方 GPG key
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# 以末8位字符查找其 fingerprint,应与文档页面所列一致
sudo apt-key fingerprint 0EBFCD88
# 添加软件源,注意机器架构 arch = amd64/armhf/arm64
sudo add-apt-repository     "deb [arch=amd64] https://download.docker.com/linux/debian     $(lsb_release -cs) stable"
# 刷新数据库并安装 Docker
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io
# 启动 docker 服务
sudo systemctl enable docker
sudo systemctl start docker
# 验证安装
sudo docker run hello-world
  • 到这里 Docker 就已经安装完成了,但为了让用户不需要获得 root 权限就能够操作 Docker,我们还需要继续以下操作:
# 首先查看当前系统是否有 docker 组
grep docker /etc/group
# 若没有,则建立 docker 组
sudo groupadd -g 233 docker
# 将用户加入到 docker 组
# username 为用户名,可用 $USER 变量表示当前用户
sudo gpasswd -a username docker
# 或新建一个用户
sudo useradd -G docker -u 2333 newuser
# 重启 docker 服务
sudo systemctl restart docker
# 重新登录并验证权限 <一定要重新登录>
docker info
  • 现在,您已经可以免 sudo 操作 Docker 了。

运行容器

要运行一个容器服务,我们需要为其准备一个镜像。这里我们以 Docker Hub 上的一个公共镜像:Alpine 为例,介绍容器创建和管理的相关命令。

# 搜索镜像
docker search alpine
# 从列表中选取镜像并拉取:<镜像名:标签>。其中标签可忽略,默认 latest
docker pull alpine # 或 alpine:latest
# 等待拉取完成,查看已有镜像列表
docker images # 或 docker image ls
# 查看镜像具体信息 <端口、挂载点等>
docker inspect alpine
# 新建容器并以交互模式 <-it> 运行 [/bin/ash] 命令
# ash 为 alpine 的默认 shell
docker run -it [--name test] [-v /tmp/test:/root] [-p 8080:80] alpine [/bin/ash]
# 也可以让容器创建后在后台以挂起模式 <-d> 运行
docker run -d --name background alpine
# 连接到一个已启动的容器并执行命令
docker exec -it test /bin/ash # 以交互模式从 test 容器运行终端
# 停止、启动或重启容器
docker stop/start/restart test
# 删除容器
docker rm [-f] test

构建镜像

如果我们要运行自己的应用服务,则需要自己构建合适的镜像。虽然从一个基础镜像构建容器并在容器内部操作也能实现应用服务的部署,甚至在此基础上还可以将容器打包为新的镜像,但这样做并不合适,其本身违背了 Docker 的初衷。Docker 镜像应当被设计为一个即插即用的模板,使得我们只需要少量的配置就能轻松部署大规模的应用服务。故为特定的应用服务构建合适的镜像是必不可少的。

为了构建一个镜像,我们需要先准备一个空目录,并在其中新建一个 Dockerfile 文件。此目录用来存放镜像需要的所有资源,在构建操作中,整个目录都会被提交到 Docker Daemon 上,因此目录中不应包含无用的资源。如果存在大量零碎的文件,将之打包成 tar 档案是推荐的做法。

Dockerfile 用于指定如何构建镜像,一个 Dockerfile 通常包含这些内容:

# 指定基础镜像
FROM alpine
# 镜像维护者信息
MAINTAINER Lost-Melody [email protected]
# 环境变量
ENV HOME /root
# 向镜像中添加文件目录,tar 包会自动解压
ADD dir.tar.gz /root/dir
# 向镜像中添加文件,与 ADD 区别在于不会解压 tar 包
COPY files/* /root/
# 指定工作目录
WORKDIR /root/dir
# 指定运行用户
USER root
# 构建时执行的命令,每个 RUN 命令都会提交一次新的镜像
# 两种方式:exec 方式、shell 方式
RUN ["/bin/sed", "-i", "s/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g"]
RUN apk update && apk upgrade     && apk add tzdata     && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime     && apk add openjdk8
# 指定容器启动命令,可被 docker run 指定的命令覆盖。多条 CMD 只有最后一条生效
CMD echo "Hello, world!"
CMD ["/bin/ash"]
# 指定容器入口命令,不被 run 覆盖。多条只有最后一条生效
ENTRYPOINT ["/usr/bin/java", "-version"]
ENTRYPOINT java -jar xxx.jar
# 暴露容器端口以供主机映射
EXPOSE 80
# 添加挂载点
VOLUME ["/root/dir"]
# 当以此镜像为基础镜像时执行命令
ONBUILD ADD dir2.tar.gz /root/dir
ONBUILD RUN rm -rf /root/dir

编写好 Dockerfile 文件后,在该目录中执行 docker build -t name . 构建镜像。

原文地址:https://www.cnblogs.com/lost-melody/p/11805035.html

时间: 2024-10-10 09:24:21

Docker 容器介绍的相关文章

Docker container 容器介绍

容器操作 使用 docker 命令行操作 docker 容器 启动容器 [email protected] ~ $ docker run Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -a, --attach=[] Attach to STDIN, STDOUT or STDERR. -c, --cpu-shares=0 CPU shares (relative weig

Docker容器技术介绍

本章节阅读 索引 一,容器的概念 二,LXC技术介绍 三,Docker技术介绍 四,Dcoker的基本配置与安装 一,容器的概念 什么是容器?在google中是这样定义的 容器是一种基础工具:泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于 容纳.储存.运输物品:物体可以被放置在容器中,而容器则可以保护内容物: 人类使用容器的历史至少有十万年,甚至可能有数百万年的历史: 而在计算机领域: 容器(container)是指是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜

Docker容器日志管理介绍

Docker容器日志分为2类: Docker引擎日志(Docker本身运行的日志). 容器日志,各个容器内产生的日志. Docker引擎日志Centos系统下Docker引擎log一般给systemd管理,可通过 journalctl -u docker.service 命令查看. 容器日志一.查看日志命令docker logs 容器ID 显示当前运行容器的log,输出Linux下的STDOUT(标准输出).STDERR(标准错误输出),docker logs 显示的内容包含STDOUT和STD

Docker容器基本知识

一.Docker 简介 1.1什么是Docker 简单的说Docker是一个构建在LXC之上的,基于进程容器(Processcontainer)的轻量级VM解决方案: 1.2为什么要用Docker而不是用虚拟机 在公司中的一个很大的用途就是可以保证线下的开发环境.测试环境和线上的生产环境一致.当年在 Baidu 经常碰到这样的事情,开发把东西做好了给测试去测,一般会给一坨代码和一个介绍上线步骤的上线单.结果代码在测试机跑不起来,开发就跑来跑去看问题,一会儿啊这个配置文件忘了提交了,一会儿啊这个上

Docker 网络之pipework 工具(3)单主机Docker容器VLAN划分

pipework不仅可以使用Linux bridge连接Docker容器,还可以与OpenVswitch结合,实现Docker容器的VLAN划分.下面,就来简单演示一下,在单机环境下,如何实现Docker容器间的二层隔离.为了演示隔离效果,我们将4个容器放在了同一个IP网段中.但实际他们是二层隔离的两个网络,有不同的广播域. 安装openvswitch 安装基础环境 [[email protected] ~]# yum -y install gcc make python-devel opens

通过Intellij IDEA 14.1将web应用部署到docker容器

2015年2月4日发布的IntelliJ IDEA 14.1宣布支持Docker,详情:Docker Support in IntelliJ IDEA 14.1 本文主要介绍IntelliJ IDEA 14.1中部署docker容器的方法. 1.下载安装IntelliJ IDEA 14.1() http://www.jetbrains.com/idea/ 2.下载安装插件Docker-plugin.jar 3. 配置远程docker 4.在web项目中新建目录docker-dir和文件Docke

搭建部署Docker容器详解实操

Docker 容器 :    容器是Docker又一核心的概念,简单来说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用. 接下来具体介绍如何管理一个容器,包括创建.启动和停止等. 启动容器有两种方式:          (1.) 第一种是基于镜像新建一个容器并启动.   所需要的命令主要为docker run    实例:            -t:让docker分配一个为终端(pase

docker容器从入门到实战0826

##docker容器安装和配置### #docker的git-hub网站(账号rshare,密rshare520):https://github.com/login #docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com #docker官网文档和镜像:https://docs.docker.com/samples/centos/ #docker官网的容器网络配置:https://docs.docker.com/engine/us

Docker 容器详解

容器是 Docker 又一核心概念,简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用. 本章将具体介绍如何来管理一个容器,包括创建.启动和停止等. 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动. 新建并启动 所需要的命令主要为docker run 下面的命令则启动一个 bash 终端,允许用户进行交互. -t 选项让 D