小沐标之 docker

本贴最后更新于 1361 天前,其中的信息可能已经渤澥桑田

docker

docker 简介

docker由来

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

docker 解决了不同环境下配置不同的问题,docker可以把运行环境(系统、代码、配置、数据、依赖等)都打包到一个沙盒中(容器),部署到任何流行的Linux机器上

docker vs 虚拟机

上图:

虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。

区别:虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱,但是docker不需要虚拟出整个操作系统,容器内的应用进程直接运行于宿主的内核。容器没有自己的内核,仅包含运行时的所需的runtime环境,所以占用资源少,启动快

docker 核心概念

上图

仓库(Repository)

存放镜像地址的远程仓库(github类似)

镜像(Image)

镜像轻量级可执行的软件包,相当于是一个模板,它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

容器(Container)

按镜像生成的实例,每个容器相互隔离,可以把容器看成一个精简版的linux环境

docker 安装

首先换源 (yum或者apt)

根据官网安装,略~

阿里云上下载docker安装环境命令

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

替换成

sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Docker安装时出现requires containerd.io >= 1.2.2-3错误

wget http://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm

yum -y install ./containerd.io-1.2.13-3.1.el7.x86_64.rpm

docker 常用命令

docker 帮助命令

  • docker version
  • docker info
  • docker --help

docker 镜像命令

docker images

列出所有本地镜像模板

docker search

查找镜像

docker search nginx --filter=stars=800

找出星星数大于800的镜像

docker pull

下载镜像

docker pull mysql:5.6

下载指定标签的镜像 默认:latest

docker rmi

删除镜像

docker rmi $(docker images -qa)

删除所有镜像

容器命令

docker run

启动容器,如果没有该镜像,会从远程仓库中拉取镜像,新建容器并启动

常用的options说明;

  • --name 容器名
  • -d 后台运行容器,即启动守护进程 全拼--detach
  • -i 已交互模式运行容器,通常与-t一起使用
  • -t 为容器重新分配一个伪输入终端
  • -p 指定端口映射
    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort
    • containerPort
  • -P(大写) 随机端口映射
  • -e 作用是指定容器内的环境变量
  • -rm 执行docker run命令带--rm命令选项,等价于在容器退出后,执行docker rm。
docker run -it --name myCentos  centos

启动centos 并打开交互终端

docker run centos -d

输入docker ps -a查看会发现容器已经退出了,

很重要的一点:docker容器后台运行,就必须有一个前台进程,这是docker机制, 最佳的解决方案是将你要运行的程序以前台进程的形式运行

docker run -d centos /bin/bash -c "while true;do echo hello zzyy;sleep 2;done"

/bin/bash:默认

docker run -d -p 8888:8080 tomcat

这是可以后台运行不退出的 ,因为tomcat执行不退出

docker ps

列出当前所有正在运行的容器

exit

容器停止退出

ctrl+P+Q

容器不停止退出

docker stop

关闭容器

docker kill

强制关闭容器

docker rm

删除已停止的容器

docker rm -f $(docker ps -aq)
docker ps -aq | xargs docker rm
  • xargs 可变参数
  • |管道符 把上一个命令参数传递给下个命令 删除所有容器

docker start

启动容器

docker restart

重启容器

docker logs

查看容器日志 options:

  • -t 是加入时间戳
  • -f 跟随最新的日志打印 一直输入不停止
  • tail 数字 显示最后多少条

docker top

查看容器内运行的进程

docker inspect

查看容器内部细节

docker exec

在容器中打开新的终端,并且可以启动新的进程,

docker exec -it centosContainer ls /tmp

执行完返回,不停留再交互终端

docker exec -it centosContainer /bin/bash

停留在交互终端 后面的/bin/bash的作用是表示载入容器后运行bash

docker attach

直接进入容器启动命令的终端,不会启动新的进程,停留在交互终端

docker cp

拷贝容器内的文件到宿主机中

docker cp centosContainer:/test/a.text /test

docker commit

提交容器副本 使之成为一个新的镜像

docker commit -a="zjjaxx" -m="fix init" dabceae191c9 zjjaxx/tomcat:1.1

-a表示作者 -m表示描述 zjjaxx/表示包名

docker build

生成一个新的镜像

docker build -f /mydocker/dockerfile -t zjj/centos .

-f指名dockerfile文件路径 -t表示包名+镜像名 .表示在当前目录下

docker 命令options说明

-a:表示列出本地所有 -q:只显示id -f:强制执行

docker 镜像相关概念

UnionFS(联合文件系统)

Union文件系统(UnionFS)是一种分层、轻量级并且高并发的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统时Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像

docker 镜像的加载原理

liunx 系统分为两个部分:

  • bootfs 主要包含bootloader和kernel,bootloader主要时引导加载kernel,linux刚启动时会加载bootfs文件系统,docker镜像的最底层是bootfs,镜像没有内核,所有镜像公用宿主机内核
  • rootfs 在bootfs之上,包含liunx系统中的/dev,/proc,/bin等标准目录,不同的Linux系统各不相同,所有每个容器为其提供不同的rootfs,对于一个精简的os,rootfs可以很小,所有docker比虚拟机小得多

镜像分层

镜像分层为了复用共享

数据卷

功能:实现容器数据持久化,容器之间共享数据

命令添加

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
 docker run -it -d -v /tomcatVolume:/containerVolume --name myTomcat -p 8888:8080 tomcat
 docker run -it -d -v /tomcatVolume:/containerVolume:ro --name myTomcat -p 8888:8080 tomcat

:rooptions 表示read-only,在容器中只读,只允许主机中修改

数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个实现数据共享,挂载数据卷的容器,称之为数据卷容器

实现不同容器数据的共享

docker run -it --name container2 --volumes-from container1 centos

Dockerfile

Dockerfile是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本

Dockerfile基本规则

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

Dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit 的操作提交一个新的镜像层
  4. docker在基于刚提交的镜像运行一个新的容器
  5. 执行Dockerfile中的下一条指令直到所有指令都执行完成

Dockerfile保留关键字

FROM

基础镜像,表示当前新镜像是基于哪个镜像的

MAINTAINER

镜像的维护人员的姓名+邮箱地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露出的端口

WORKDIR

指定在创建容器后,终端默认登入进来的工作目录

ENV

用来在构建镜像过程中设置的环境变量

ADD

将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY

只拷贝不解压

VOLUME

设置数据卷,用于数据保存和持久化工作

CMD

指定一个容器启动时要运行的命令,可以有多个CMD指令,但只有最后一个生效,会被docker run 之后的参数替换

ENTRYPOINT

和CMD不同的是 docker run 之后的参数会在ENTRYPOINT后面追加

ONBUILD

当构建一个被继承的Dockerfile时运行命令,父镜像在被继承后父镜像的ONBUILD被触发

Docker Compose

Compose是一个用于定义和运行多容器Docker应用程序的工具。

安装

官网链接

compose 配置参考

默认名称为docker-compose.yml

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    483 引用 • 906 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...