Docker学习笔记

[TOC]

简介

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

我的理解就是,他是一个大环境,然后在docker里可以自己搭建许多小环境,并且非常灵活,想要的环境也可以从镜像库中拉取,这就解决了我们很多时候的环境问题、

安装docker

在kali2020版本中我使用两条命令即安装了docker

sudo apt update

sudo apt install -y docker.io

1.

​ 更新软件包可以让我们安装的软件版本更新

2.

​ 使用命令 sudo apt install -y docker.io进行安装,出现如下,选确定即可

3.

​ 安装完成,通过命令 docker -v 查看版本

​ 可以看到安装完毕

docker常用命令

ps:这里使用自己vps上的docker服务来进行测试

常用命令

  • 启动docker

    systemctl start docker

  • 关闭docker

    systemctl stop docker

  • 重启docker

    systemctl restart docker

  • 查看docker信息

    docker info

  • 列出本地镜像

    docker images

  • 查找镜像

    docker search < >

  • 列出已启动的容器

    docker ps (docker ps -a 表示显示已存在的所有容器)

  • 拉取镜像

    docker pull

  • 容器状态

    打开: docker start id

    关闭: docker stop id

  • 删除操作

    删除镜像:docker rmi id

    删除容器:docker rm id

    ps:一般都是先停止容器,然后删除容器,最后删除镜像

镜像与容器

一句话讲清容器与镜像的关系:容器 = 镜像image + 读写层

可以看到容器与镜像是包含的关系,镜像运行起来就是容器,通过镜像才能运行容器,所以这两个是完全不同的东西,也是docker最重要的两个部分

docker镜像实际上是由一层一层的系统文件组成,这种层级的文件系统被称为UnionFS( Union file system 统一文件系统),镜像可以基于dockerfile构建,dockerfile是一个描述文件,里面包含了若干条密令,每条命令都会对基础文件系统创建新的层次结构。

镜像常用命令

查看镜像

命令:docker images 可查看本地所有的镜像

列表 意思
TAG 镜像的标签(版本)同一个仓库有多个TAG的镜像,多个版本,用REPOSITORY:TAG来定义不同的镜像;TAG来定义不同的镜像;
IMAGE ID 镜像ID,镜像的唯一标识
CREATE 镜像创建时间
SIZE 镜像大小
OPTIONS 可选参数:-a 显示所有镜像(包括中间层)-q 只显示镜像 ID-qa可以组合–digests 显示镜像的摘要信息 –no-trunc 示完整的镜像信息
REPOSITORY 镜像的仓库源

搜索镜像

命令:docker search

Docker Hub 上检索镜像的详细信息。如:docker search java

例:搜索所有镜像名包含 java 的

拉取镜像

命令:docker pull 镜像名称:[TAG]

例:这里拉取一个shiro反序列化的镜像,用来复现

命令: docker pull medicean/vulapps:s_shiro_1

如上图拉取镜像即会下载一些东西

删除镜像

命令: docker rmi id

构建镜像

命令:docker build [OPTIONS] PATH

如果想要构建镜像得有dockerfile,通过dockerfile来构建

例如:

命令: docker build -t ezphp .

容器常用命令

创建容器与端口映射

命令:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

参数 解释
–name “容器新名字”:为容器指定一个名称;
-i 以交互模式运行容器,通常与-t或者-d同时使用;
-t 为容器重新分配一个伪输入终端,通常与-i同时使用;
-d 后台运行容器,并返回容器ID;
-P 随机端口映射,容器内部端口随机映射到主机的端口
-p 指定端口映射,格式为:主机(宿主)端口:容器端口

一般常用的命令即是 docker run -d -p 端口号:80 name

启动交互式容器docker run -it -d -p name

举个栗子(还是用到上面的shiro例子):

命令:docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1(映射在8080端口)

返回一串数字,这个容器id

这时代表容器创建完成,我们打开ip对应的端口号

如图所示,这就是一个容器,里面配备所有环境,成功访问

列出容器

命令:docker ps [OPTIONS]

参数 解释
-a 显示所有的容器,包括未运行的。
-f 根据条件过滤显示的内容。
-format 指定返回值的模板文件。
-l 显示最近创建的容器。
-n 列出最近创建的n个容器。
–no-trunc 不截断输出。
-q 静默模式,只显示容器编号。
-s 显示总的文件大小。

启动与停止

启动命令:docker start id

停止命令:docker stop id

重启命令:docker restart id

删除容器

命令: docker rm id

与镜像不同的是 这里删除命令是rm ,镜像是rmi(images)

进入容器

命令:docker exec -it id 执行命令

这时就进入到docker里面了,可以查看docker里面的代码、环境等,也可以更改里面的东西。

ps:进入docker里面,更改或者删掉里面的任何东西后,如果重启docker,都会恢复的。所以如果需要docker里面的某些东西做些永久性的改变,就需要docker commit

容器文件拷贝

#从容器内拷贝
docker cp 容器ID/名称: 容器内路径 容器外路径

#从容器外拷贝
docker cp 容器外路径 容器ID/名称: 容器内路径

Dockerfiles

Dockerfile 包含创建镜像所需要的全部指令。基于在 Dockerfile 中的指令,我们可以使用 Docker build 命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。

FROM

所有 Dockerfile 都必须以 FROM 命令开始。FROM 命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(注:CentOS 和 Ubuntu 有些命令可是不一样的)。FROM 命令可以多次使用,表示会创建多个镜像。具体语法如下:

FROM <image name>

MAINTAINER

设置该镜像的作者,可以写自己名字

MAINTAINER <author name>

RUN

在 shell 或者 exec 的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:

RUN <command>

简单的说就是可以执行命令行的指令,在镜像开始的时候进行运行

例:RUN yum install wget

EXPOSE

指定容器在运行时监听的端口。

EXPOSE <port>

WORKDIR

指定RUNCMDENTRYPOINT命令的工作目录。类似cd,语法如下

WORKDIR /var/www/html

表示建立在网址根目录之下

CMD

ADD&COPY

这里把ADD和COPY两个指令放一起,说明它们两个功能很类似。有时候,随便使用哪一个都行,它们的作用都是把本地的文件添加到Docker image里面。两者唯一的区别是,ADD的功能更强大一些,ADD会拷贝文件并且解压文件,COPY只能拷贝文件。

ADD <source> <destination>

例如第一个指令的意思就是将hello复制到接下来要build的docker image的根目录(hello为本地文件)

ENV

设置环境变量

这里用一张趣味的图

创建简单的apache服务器

  • 首先创建一个文件夹,存放dockerfile和index.html

  • 编写index.html

    很简单的显示页面,完成后保存

  • 编写dockerfile

    大致意思就是选自apache2-php7的镜像,并将index.html页面复制到目录下,使它显示在根目录,用80端口也就是将他们以网页的形式显示出来

  • 进行创建镜像

    命令:docker build -t test .

  • 将端口映射出去

    命令:docker run -i -d -p 30002:80 test

  • 打开网页

​ 完成一个简单的apache服务器

Portainer 安装与配置

简介

Portainer 是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

安装步骤

  • 搜索镜像

    docker search portainer/portainer

  • 拉取镜像

    docker pull portainer/portainer

  • 运行镜像

    docker run -d -p 9000:9000 -v /root/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock --name dev-portainer portainer/portainer

本机访问

访问端口9000即可

首次登陆设置密码即可

这里选择local即可,remote是集群,反正也不知道啥意思,用着先

成功后即可看到本机上的容器情况

那我觉得还是命令行的好用一些,更快捷,图形化更形象