Docker基础

Posted dingwen_blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker基础相关的知识,希望对你有一定的参考价值。

一、基本概念

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

Docker组成

  • Repository(仓库)
  • Image(镜像)

UnionFS(联合文件系统):Union文件系统(``UnionFS`)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual file system)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

  • Container(容器) Docker 镜像创建的运行实例

二、工作原理

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。

三、基础命令

  • docker --version查看docker 版本

  • docker ps查看当前正在运行的容器

  • docker ps -a查看所有容器的状态

  • docker start/stop name/id通过id或者name启动或者停止某个容器

  • docker attach id进入某个容器(使用exit退出后容器也跟着停止运行)

  • docker exec -ti id启动一个伪终端以交互式的方式进入某个容器(使用exit退出容器不停止运行)

  • docker images查看本地镜像

  • docker rm id/name删除某一个容器

  • docker rmi id/name删除某个镜像

  • docker run -itd --name redis -p 6379:6379 redis

    ``-p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis `的服务(主机端口:容器端口)。

  • systemctl start docker启动docker服务

  • systemctl stop docker停止docker服务

  • systemctl restart docker重启docker服务

  • systemctl status docker查看docker状态

  • systemctl enable docker开机启动

  • systemctl info查看docker概要信息

四、帮助命令

  • docker version查看docker版本信息
  • docker info更详细的信息
  • docker --help帮助命令

五、镜像命令

  • docker images列出本地主机上面的镜像
  • -a 所有镜像(包括中间影像层)
  • -q 只显示镜像ID
  • –digests 显示镜像的摘要信息(注意是两条杠)
  • --no-trunc 显示完整的镜像信息
  • docker search去docker hub查找镜像
  • --no-trunc 显示完整的镜像描述
  • -s 列出收藏数不小于指定数目的镜像
  • –automated 只列出automated build类型的镜像
  • docker pull镜像名称
  • m默认是【镜像名称:latest 也可以指定tag标签 tomcat:9.8
  • docker rmi镜像名称
  • docker rmi -f 镜像ID删除单个
  • docker rmi -f 镜像名称:tag 镜像名称:tag删除多个
  • docker rmi -f $(docker images -qa)删除全部
  • commit

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

六、容器命令

  • 新建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • –name 给容器新取一个名称
  • -d 后台运行容器,并返回容器ID,即启动守护式容器
  • -i 以交互模式运行容器,通常与-t 同时使用
  • -t 给容器重新分配一个伪输入终端,通常与-t同时使用
  • -P 随机端口映射
  • -p 指定端口映射
//主机映射端口:容器启动端口
ip:hostPort:containerPort

ip::containerPort     

hostPort:containerPort   

containerPort
  • 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。docker run -it centos /bin/bash
  • 列出当前所有正在运行的容器 docker ps [options]
  • -a 列出当前所有正在运行的容器包括历史上运行过的
  • -l 显示最近创建过的容器
  • -n 2 显示最近创建过的第 2 个容器
  • -q 静默模式,只显示容器编号
  • --no-trunc 不截断输出显示容器详细信息
  • 退出容器
  • exit容器停止退出
  • ctrl + P + Q 容器不停止退出
  • 启动容器 docker start 容器ID或者容器名称
  • 重启容器 docker restart 容器ID或者容器名称
  • 停止容器 docker stop 容器ID或者容器名称
  • 强制停止容器 docker kill 容器ID或者容器名称
  • 删除容器docker rm 容器ID

一次性删除多个容器

docker rm -f $(docker ps -a -q)

docker ps -a -q | xargs docker rm
  • 启动守护式容器 docker run -d 容器名

使用镜像centos:latest以后台模式启动一个容器docker run -d centos 问题:然后docker ps -a 进行查看, 会发现容器已经退出很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。 这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行

  • 查看容器日志```docker logs -f -t --tail 容器ID
  • -f 跟随最新的日志打印
  • -t 加入时间戳
  • –tail 数字 显示最后多少条数据
  • 查看容器内运行的进程docker top 容器ID
  • 查看容器内部细节docker inspect 容器ID
  • 进入正在运行的容器并以命令行交互
  • docker exec -it 容器ID /bin/bash (默认有 /bin/bash)
  • docker attach 容器ID

attach直接进入容器启动命令的终端,不会启动新的进程

exec是在容器中打开新的终端,并且可以启动新的进程 ```docker exec -it 容器ID /bin/bash

  • 从容器内拷贝文件到主机上 docker cp 容器ID:容器内路径 目的主机路径
docker cp  6011820691f1:/usr/local/tomcat/logs/localhost_access_log.2020-10-18.txt /dw

六、docker 数据容器卷

1.命令方式添加

docker run -it -v /home/dw/Documents/container-share-data:/share-data tomcat /bin/bash

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名  //ro read only  权限

2.DockerFile添加

  • 新建并编写DockerFile文件
# current images base 
FORM centos
# container data volume
VOLUME ["/dataVolumeContainer1","/dataVolume2Container2"]
# command
CMD echo "finished ---------------success!"
CMD /bin/bash
  • 构建镜像docker build [OPTIONS] PATH | URL | -
// . 表示当前目录的Dockerfile文件,注意名称必须完全一致,大小写敏感
docker build -t dw/centos --no-cache .

OPTIONS说明:

--build-arg=[] :设置镜像创建时的变量;

--cpu-shares :设置 cpu 使用权重;

--cpu-period :限制 CPU CFS周期;

--cpu-quota :限制 CPU CFS配额;

--cpuset-cpus :指定使用的CPU id;

--cpuset-mems :指定使用的内存 id;

--disable-content-trust :忽略校验,默认开启;

-f :指定要使用的Dockerfile路径;

--force-rm :设置镜像过程中删除中间容器;

--isolation :使用容器隔离技术;

--label=[] :设置镜像使用的元数据;

-m :设置内存最大值;

--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;

--no-cache :创建镜像的过程不使用缓存;

--pull :尝试去更新镜像的新版本;

--quiet, -q :安静模式,成功后只输出镜像 ID;

--rm :设置镜像成功后删除中间容器;

--shm-size :设置/dev/shm的大小,默认值是64M;

--ulimit :Ulimit配置。

--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

--network: 默认 default。在构建期间设置RUN指令的网络模式


  • 使用当前目录的 Dockerfile创建镜像,标签为runoob/ubuntu:v1
docker build -t runoob/ubuntu:v1 . 
  • 使用URLgithub.com/creack/docker-firefoxDockerfile创建镜像。
docker build github.com/creack/docker-firefox
  • 也可以通过 -f Dockerfile文件的位置。
docker build -f /path/to/a/Dockerfile .
  • 运行
//容器运行不退出
docker run -d centos /bin/bash -c “while true;do echo hello docker;sleep 1;done”

//前台交互形式运行
docker run -it 容器ID /bin/bash

  • 镜像构建完成、容器启动成功后使用容器ID查看本机挂载目录(可先在容器对应挂载点新增文件方便对比)
docker inspect 容器ID

在这里插入图片描述

  • 注意

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可

七、数据卷容器

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

容器间传递共享(–volumes-from

docker run -it --name doc03 --volumes-from doc01 dw/centos

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止.即使把父容器删了也依然存在。

八、Dokcerfile

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

1.镜像构建三部

  • 编写Dockerfile文件
  • docker build
  • docker run

2.Dokerfile规范

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

3.·执行Dockerfile的大致流程

  • docker从基础镜像运行一个容器
  • 执行一条指令并对镜像进行修改
  • 提交一个新的镜像层
  • docker运行新的镜像运行一个容器
  • 执行下一条指令,直到所有指令都完成

4.关键字

  • From 当前镜像基于的基础镜像
  • MAINTAINER 镜像维护者的姓名和邮箱地址
  • RUN 容器构建时需要执行的命令
  • EXPOSE当前容器对外暴露出的端口
  • WORKDIR指定在创建容器后,终端默认登录的一个目录,落脚点
  • ENV用来在构建镜像过程中设置环境变量
  • ADD将宿主机目录下的文件拷贝进镜像且自动处理URL和解压tar压缩包
  • COPYDockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 COPY src dest / COPY ["src", "dest"]
    +VOLUME容器数据卷,用于数据保存和持久化工作
  • CMD 制定一个容器启动时要运行的命令

Dockerfile中可以有多个 CMD指令,但只有最后一个生效,CMD会被 docker run 之后的参数替换 覆盖

  • ENTRYPOINT指定一个容器启动的时候要运行的命令 追加
  • ONBUILD当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

5.BASE镜像 scratch

Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的

6.案例一:自定义镜像mycentos(登录后的默认目录、vim编辑器、查看网络配置)

  • 编写Dockerfile文件
FROM centos
MAINTAINER dw<dingwenemail@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success---------------ok"
CMD /bin/bash

  • 构建镜像docker build -t mycentos:1.0 .

  • 运行镜像docker run -it --name mycentos mycentos:1.0

  • 列出镜像的变更历史docker history 镜像名称

6.案例二:CMD 和 ENTRYPOINT

Dockerfile中可以有多个 CMD指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换.docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合.

7.案例三:制作CMD版可以查询IP信息的容器

  • DockerfileCMD
FROM centos
MAINTAINER dw<dwemail@qq.com>
RUN yum -y install curl
CMD ["curl","-s","http://ip.cn"]

  • 构建镜像docker build -t ipcmd -f /home/dw/Documents/DockerFiles/ip/DockerfileCMD .
  • 后台运行docker run --name ipcmd -d ipcmd /bin/bash -c "while true;do echo hello docker;sleep 1;done;"

8.案例四:制作ENTRYPOINT版本容器

  • DockerfileENTRYPOINT
FROM centos
MAINTAINER dw<dwemail@qq.com>
RUN yum -y install curl
ENTRYPOINT  ["curl","-s","http://ip.cn"]
  • 构建镜像docker build -t ipentrypoint -f home/dw/Documents/DockerFiles/ip/DockerfileENTRYPOINT .

  • 运行docker run ipentrypoint -i

9.案例五:自定义tomcat9

  • 准备tomcat、jdk
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YdEpVbJR-1622904811561)(docker 基础.assets/4408)]
  • 编写Dokcerfile文件
# 来自哪一个基础镜像
FROM centos
# 作者加邮箱
MAINTAINER dw<dingwenemail@qq.com>
# 把宿主机当前上下文的touch.txt拷贝到/usr/local路径下
COPY touch.txt /usr/local/ctouch.txt
#把jdk和comcat添加到容器中
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.39.tar.gz /usr/local/
# 安装vim编辑器
RUN yum -y install vim
# 设置登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置jdk和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.39
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.39
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
#启动时候运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.39/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.39/bin/logs/catalina.out

  • 生成镜像
docker build -t tomcat9 .
  • 运行
  docker run -d -p 8080:8080 --name tomcat9 -v /home/dw/Documents/DockerFiles/tomcat9/test:/usr/local/apache-tomcat-9.0.39/webapps/test -v /home/dw/Documents/DockerFiles/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.39/logs --privileged=true tomcat9
  • 添加web测试

在这里插入图片描述

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

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

markdown docker-compose片段

sh Docker片段

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

《Docker 源码分析》全球首发啦!

201555332盛照宗—网络对抗实验1—逆向与bof基础