Docker相关知识学习


在ArchLinux中安装/测试/保存Docker
##安装Docker并查看版本信息##
# pacman -S docker
# systemctl start docker
# systemctl enable docker

# docker version
# docker info
# docker images
##编辑Docker数据的存储路径##
# vim /lib/systemd/system/docker.service
# 或
# vim /lib64/systemd/system/docker.service

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS
LimitNOFILE=1048576
LimitNPROC=1048576

上面的 $OPTIONS 可以用来修改 docker 的家路径[默认是/var/lib/docker]

OPTIONS="--graph /mnt/docker-data --storage-driver btrfs"
##启动##
# systemctl start docker
##把指定(当前)用户加入docker组##
# gpasswd -a $USER docker
# newgrp docker  #使上面的修改立即生效
##搜索/下载镜像##
# docker search ubuntu
# docker search ubuntu -s 10

# docker pull ubuntu
# docker pull ubuntu:14.04
# docker pull ubuntu:latest
# docker pull dl.dockerpool.com:5000/ubuntu

# docker pull busybox
# docker pull centos
# docker pull base/archlinux
##查看已有镜像##
# docker images
# docker inspect container_id/image_id
##运行命令##
# docker run -it ubuntu:14.04 /bin/bash
# docker run ubuntu:14.04 /bin/echo 'Hello world'
##连接容器/管理容器数据##
# docker run -d -P training/webapp python app.py
# docker run -d -p 5000:5000 training/webapp python app.py
# docker run -d -P --name web -v /webapp training/webapp python app.py
# docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
# docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
##查看docker进程相关信息##
# docker ps             #查看所有容器
# docker top container_id    #查看指定容器的进程
# docker logs container_id   #显示指定容器的标准输出
# docker stop container_id   #停止正在运行的指定容器
##保存修改过的镜像/推送镜像到指定源##
# docker commit [OPTIONS] container_id [REPOSITORY[:TAG]]

# docker push 192.168.0.100:5000/ubuntu        # 推送镜像库到私有源
# docker push 192.168.0.100:5000/ubuntu:14.04    # 推送指定镜像到私有源
##删除容器/镜像##
# docker rm CONTAINER
# docker rmi IMAGE

# docker rmi ubuntu
# docker rmi dl.dockerpool.com:5000/ubuntu
##在Docker中运行SSH进程服务##

以下是用Dockerfile设置sshd服务容器,您可以使用连接并检查其他容器的卷,或者可以快速访问测试容器。

$ sudo cat Dockerfile
FROM     ubuntu:12.04
MAINTAINER ixyzero.com "[email protected]"
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

使用如下命令构建镜像:

$ sudo docker build --rm -t example_sshd .

然后运行它,并使用docker port命令将容器的22端口映射到主机的某一端口

$ sudo docker run -d -P --name test_sshd example_sshd
$ sudo docker port test_sshd 22
0.0.0.0:49154

现在你可以使用ssh登陆Docker进程的主机IP地址,端口是49154(IP地址可以使用ifconfig命令获取):

$ ssh [email protected] -p 49154
# The password is ``screencast``.
...

最后在测试完成时,停掉容器,并且删除容器,然后删除镜像:

$ sudo docker stop test_sshd
$ sudo docker rm test_sshd
$ sudo docker rmi example_sshd

==

Docker的一些参考资料
更多参考链接:

==

在使用docker pull命令安装的镜像/容器存在哪个地方(ArchLinux环境中)?
搜索关键字:
  • linux where docker file save
  • linux /lib/systemd/system/docker.service
参考链接:
, ,

《 “Docker相关知识学习” 》 有 31 条评论

  1. 科普|云计算的四种服务模式介绍
    http://answerywj.com/2017/03/23/Introduction-to-four-service-of-cloud-computing/
    `
    本文将介绍:
    SaaS(Software as a Service):软件即服务;
    BaaS(Backend as a Service):后端即服务;
    PaaS(Platform as a Service):平台即服务,也被叫做中间件;
    IaaS(Infrastructure as a Service):基础设施即服务;
    这四种云计算服务模式,并分析之间的联系和区别。
    `

  2. 为容器安全苦恼?这份清单整理了27种容器安全工具
    https://mp.weixin.qq.com/s/LdXRLftjeh2UgKxncKzCaw
    `
    Docker 的安全工具可以分为以下几类:

    · 内核安全工具:
    这些工具源于Linux开源社区,它们已经被docker等容器系统吸纳成为内核级别的基础安全工具。

    · 镜像扫描工具:
    Docker Hub是最受欢迎的容器镜像仓库,但除Docker Hub之外也有很多其他镜像仓库可供选择。大多数镜像仓库现在都有针对已知漏洞扫描容器镜像的解决方案。

    · 编排安全工具:
    Kubernetes和Docker Swarm 是两个被普遍使用的编排工具。并且它们的安全功能在过去一年已经得到加强。

    · 网络安全工具:
    在容器驱动的分布式系统中,网络比以往更为重要。基于策略的网络安全在基于外围的防火墙上的重要性越来越突出。

    · 安全基准测试工具:
    互联网安全中心(CIS)为容器安全提供了指导方针,这一方针已被Docker Bench和类似的安全基准工具所采用。

    · CaaS平台的安全性:
    AWS ECS,、GKE和其他CaaS平台通常是基于其母公司的laaS平台来构建其安全功能。然后添加容器专用功能或者借用Docker、Kubernetes的安全功能。

    · 容器专用安全工具:
    对于容器安全来说,这是一个最优选择。其中,机器学习是中心阶段,因为这类工具能够为容器安全构建智能的解决方案。
    `

  3. 可能是把Docker的概念讲的最清楚的一篇文章
    https://mp.weixin.qq.com/s/xSbYTJmLuqsyYEDEIsndZw
    `
    阅读本文大概需要15分钟,通过阅读本文你将知道一下概念:
    · 容器
    · 什么是Docker?
    · Docker思想、特点
    · Docker容器主要解决什么问题
    · 容器 VS 虚拟机
    · Docker基本概念: 镜像(Image),容器(Container),仓库(Repository)
    `

  4. Dockerfile 最佳实践
    https://blog.qikqiak.com/post/dockerfile-best-practice/
    https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
    `
    一般准则和建议
      容器应该是短暂的
      建立上下文
      使用.dockerignore文件
      使用多阶段构建
      避免安装不必要的包
      一个容器只专注做一件事情
      最小化镜像层数
      对多行参数排序
      构建缓存
    Dockerfile 指令
      FROM
      LABEL
      RUN
      CMD
      EXPOSE
      ENV
      ADD 和 COPY
      ENTRYPOINT
      VOLUME
      USER
      WORKDIR
      ONBUILD
    官方仓库示例
    推荐
    `

  5. gVisor是什么?可以解决什么问题?
    https://mp.weixin.qq.com/s/tsG-opTRZCCnykb0z68XJA
    `
    传统的Container由于隔离性差而不适合作为Sandbox运行不受信工作负载,VM可以提供很好隔离但却额外消耗较多的内存。Google开源的gVisor为我们提供另外一种选择:在牺牲掉一定性能的情况下,它只额外消耗非常少量的内存,却可以提供了类似等级的隔离性。在本文里我们深入gVisor,最后了解一下我们增强gVisor以支持资源控制的方案。
    `

    谷歌新作gVisor:VM容器融合技术已经到来
    https://mp.weixin.qq.com/s/nm3nDMEnF7LaMtZv01LAvw

  6. Docker容器时代安全实践
    https://mp.weixin.qq.com/s/dgnoD2LG0kxKW-HkBYVuoQ
    `
    (1)Docker自身安全问题
    no.1 Docker容器相关概念
    no.2 Daemon安全问题
    no.3 镜像安全问题
    no.4 运行时安全问题
    no.5 生态安全问题
    (2)给安全防御体系带来的挑战
    no.1 安全策略的精细化管理
    no.2 内核安全机制的深入理解
    (3)安全防御体系的应对
    no.1 主机入侵检测系统
    no.2 安全态势感知
    no.3 DDoS防御系统
    no.4 防火墙管理
    (4)Docker安全生态发展方向
    Docker 和容器技术的发展可谓是日新月异,对传统的安全方案带来很多挑战。当下的安全方案也都是处于萌芽状态,基本都是靠外部辅助工具(方案)做为安全手段,而docker本身对安全的支持会比较薄弱,这种做法只能暂时把一些安全漏洞从外部补上,而无法从根本上解决。
    后续Docker安全可以从下面几块内容开展:
    1. 沿着Docker本身,在Docker内部提供原生态的安全机制,让Docker发展和成长都是直接在自身的安全体系下成长;
    2. 对于相关生态圈内(例如kubernetes),直接集成安全方案;
    3. 在Docker的libnetwork层定制安全专用的安全通信机制。
    `

  7. 29 Docker security tools compared
    https://sysdig.com/blog/20-docker-security-tools/
    `
    Anchore Engine
    Aporeto
    AppArmor
    AquaSec
    BlackDuck Docker security
    Calico
    Capsule 8
    Cavirin
    Cilium
    CoreOS Clair
    Docker capabilities and resource quotas
    Docker-bench security
    Dockscan
    Falco
    Google Cloud Security Command Center
    HashiCorp Vault
    Layered Insight
    NeuVector
    Notary
    OpenSCAP
    Open Policy agent
    REMnux
    SELinux
    Seccomp
    StackRox
    Sysdig Secure
    Sysdig
    Tenable Flawcheck
    Twistlock
    `

  8. CVE-2019-5736:runc容器逃逸漏洞预警
    https://mp.weixin.qq.com/s/b7mJ2ysTREgmWsZeJo3kBA

    新近爆出的runc容器逃逸漏洞,用户如何面对?
    https://mp.weixin.qq.com/s/fJyrLxR4EtPuqOt18LAINA
    `
    runc是一个根据OCI(Open Container Initiative)标准创建并运行容器的CLI工具,目前Docker引擎内部也是基于runc构建的。 2019年2月11日,研究人员通过oss-security邮件列表(https://www.openwall.com/lists/oss-security/2019/02/11/2)披露了runc容器逃逸漏洞的详情,根据OpenWall的规定EXP会在7天后也就是2019年2月18日公开。

    此漏洞允许以root身份运行的容器以特权用户身份在主机上执行任意代码。实际上,这意味着容器可能会破坏Docker主机(覆盖Runc CLI),而所需要的只是能够使用root来运行容器。攻击者可以使用受感染的Docker镜像或对未受感染的正在运行的容器运行exec命令。针对此问题的已知缓解措施包括:
    使用只读主机文件系统运行
    运行用户命名空间
    不在容器中运行root
    正确配置的AppArmor / SELinux策略(当前的默认策略不够)

    漏洞披露后,Docker在第一时间发布了18.09.2,用户可升级到此版本以修复该漏洞。但是,通常由于各种因素,很多用户的生产环境并不容易升级太新的Docker版本……
    `

    runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
    https://mp.weixin.qq.com/s/MhKQJCgdWg_NcxgpCfTviA

  9. Docker容器安全性分析
    https://www.freebuf.com/articles/system/221319.html
    `
    Docker是目前最具代表性的容器技术之一,对云计算及虚拟化技术产生了颠覆性的影响。本文对Docker容器在应用中可能面临的安全问题和风险进行了研究,并将Docker容器应用环境中的安全机制与相关解决方案分为容器虚拟化安全、容器安全管理、容器网络安全三部分进行分析。

    一、从虚拟化安全到容器安全
    1、传统虚拟化技术
    2、容器技术
    3、安全性

    二、Docker容器安全风险分析
    1、镜像安全风险
    2、容器虚拟化安全风险
    3、网络安全风险

    三、Docker容器安全机制与解决方案
    1、容器虚拟化安全
    2、容器安全管理
    3、容器网络安全

    四、总结
    与虚拟化技术相比,Docker容器技术具有敏捷化、轻量化等特点,在推进云原生应用方面具有不可替代性。与此同时,容器技术对于高效性的追求也牺牲了隔离性等安全要求,在安全性方面与虚拟化技术相比还存在较大差距,且所涉及的面较广,涉及到容器的镜像安全、内核安全、网络安全、虚拟化安全、运行时安全等各个层面。

    在应用容器技术进行系统部署时,应充分评估安全风险,根据应用场景制定相应安全需求,并整合相关安全解决方案,形成容器安全应用最佳实践。
    `

  10. seccomp学习笔记
    https://veritas501.space/2018/05/05/seccomp%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
    `
    seccomp (short for secure computing mode) is a computer security facility in the Linux kernel. It was merged into the Linux kernel mainline in kernel version 2.6.12, which was released on March 8, 2005. seccomp allows a process to make a one-way transition into a “secure” state where it cannot make any system calls except exit(), sigreturn(), read() and write() to already-open file descriptors. Should it attempt any other system calls, the kernel will terminate the process with SIGKILL or SIGSYS. In this sense, it does not virtualize the system’s resources but isolates the process from them entirely.

    seccomp 是一种内核中的安全机制,正常情况下,程序可以使用所有的syscall,这是不安全的,比如劫持程序流后通过execve的syscall来getshell。通过seccomp我们可以在程序中禁用掉某些syscall,这样就算劫持了程序流也只能调用部分的syscall了。
    `

    https://outflux.net/teach-seccomp/
    https://github.com/gebi/teach-seccomp

  11. seccomp介绍
    https://blog.csdn.net/mashimiao/article/details/73607485

    https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt

    http://man7.org/linux/man-pages/man2/prctl.2.html
    http://man7.org/linux/man-pages/man2/seccomp.2.html

    Introduction to seccomp: BPF linux syscall filter
    https://blog.yadutaf.fr/2014/05/29/introduction-to-seccomp-bpf-linux-syscall-filter/
    `
    Seccomp是Secure computing mode的缩写,Linux kernel 所支持的一种安全机制,用于限制系统调用的使用范围。当然,需要有一个配置文件来指明进程是否有权使用当前系统调用(system call)。如果在容器中使用该特性,可以限制容器内进程能使用的系统调用范围。

    在Linux系统里,大量的系统调用直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的代码滥用系统调用会对系统造成安全威胁。通过Seccomp特性限制系统调用的使用范围,使程序进入一种『安全』的状态。当进程使用系统调用时,kernel都会检查对应白名单以确认该进程是否有权使用当前系统调用。如果黑客获得系统的访问权限,seccomp将阻止他们使用任何未允许的系统调用。
    `

  12. 浅谈如何打造对容器友好的应用
    https://blog.dteam.top/posts/2019-11/%E6%B5%85%E8%B0%88%E5%A6%82%E4%BD%95%E6%89%93%E9%80%A0%E5%AF%B9%E5%AE%B9%E5%99%A8%E5%8F%8B%E5%A5%BD%E7%9A%84%E5%BA%94%E7%94%A8.html
    `
    # 前言
    容器化是一种全新的产品交付方式,几乎是颠覆了传统的软件交付方式和交付流程,并且在各大公司都已经有了成熟的应用,自从k8s问世之后,容器化的交付方式得到了前所未有的高速发展。k8s的资源调度有效提高了资源率利用率,充分利用每台Node节点的计算能力,大大降低了运维压力,以及降低了基础设施的总体成本。

    本文就来谈谈如何打造对容器友好的应用,以便现有的应用可以很容易逐步迁移到容器中,实现容器化的交付,方便未来逐步向k8s迁移。

    # 如何让应用程序对容器友好
    * 依赖轻量化
    * 独立运行
    * 支持环境变量注入
    * 状态分离
    * 处理多时区问题

    本篇文章浅谈了如何打造对容器友好的应用需要注意的一些地方。只是想将应用迁移到容器运行的话还是比较容易的,差不多以上几点注意到之后就可以简单在容器环境启动一个单实例容器镜像跑起来了。如果想做到更加适配容器集群环境的话,通常还需要考虑到以下一些问题:

    * 日志打印到终端,而不是存储日志文件
    * 多实例如何协调一致。如接口幂等,防止用户请求分配到不同实例造成数据处理异常,多实例负载均衡,而不是互相冲突等等
    * 容器探针。需要应用程序自己实现一个活性探测接口(如http, tcp, 脚本探测等)
    * ……

    容器的出现带来了一种全新的交付方式,k8s的出现将容器的热度大幅度拉升,基于容器和k8s的交付方案层出不穷。为了赶上这波热度,我本人也做了很多实际的体验与调研,特此总结此篇文章,以供其他对容器化有兴趣的技术人员参阅。
    `

  13. 一文搞懂 Docker、Containerd、RunC 间的联系和区别
    https://mp.weixin.qq.com/s/kVh_EXGeMy_UI6qIgbmsGQ
    `
    现在创建一个docker容器的时候,Docker Daemon 并不能直接帮我们创建了,而是请求 containerd 来创建一个容器。当containerd 收到请求后,也不会直接去操作容器,而是创建一个叫做 containerd-shim 的进程。让这个进程去操作容器,我们指定容器进程是需要一个父进程来做状态收集、维持 stdin 等 fd 打开等工作的,假如这个父进程就是 containerd,那如果 containerd 挂掉的话,整个宿主机上所有的容器都得退出了,而引入 containerd-shim 这个垫片就可以来规避这个问题了,就是提供的live-restore的功能。这里需要注意systemd的 MountFlags=slave。

    然后创建容器需要做一些 namespaces 和 cgroups 的配置,以及挂载 root 文件系统等操作。runc 就可以按照这个 OCI 文档来创建一个符合规范的容器。

    真正启动容器是通过 containerd-shim 去调用 runc 来启动容器的,runc 启动完容器后本身会直接退出,containerd-shim 则会成为容器进程的父进程, 负责收集容器进程的状态, 上报给 containerd, 并在容器中 pid 为 1 的进程退出后接管容器中的子进程进行清理, 确保不会出现僵尸进程。containerd,containerd-shim和容器进程(即容器主进程)三个进程,是有依赖关系的。
    `
    Docker、Containerd、RunC分别是什么
    https://mp.weixin.qq.com/s/sfOXxBoppV6QZSpblMsMJQ

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注