Docker入门

Docker入门

Scroll Down

Docker入门

一开始是使用docker跑几个靶场,觉得大材小用,所以花时间整个学习一下
这篇只是简单学习了一下用法,之后会再探究探究的

什么是Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。

以上是百度百科的

几个概念

镜像

Linux是基于文件的,所以镜像也就相当于是一个root文件系统
Docker镜像是一个特殊的文件系统,提供运行时所需的程序、库、资源、配置等,还包含为运行时准备的配置参数

分层存储:构建镜像时会根据前一层,来构建后一层,每一层构建完后不会再发生变化,新一层的改变只会发生在该层,不影响前一层。所以构建时也需要注意内容,这一特点使得镜像的复用和定制更任意。

容器

容器是镜像运行时的实体,可以被创建、启动、停止、删除、暂停等。实质是进程,运行于属于自己的独立的命名空间

云服务器上安装docker

先略

镜像的使用

获取DockerHub的镜像

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

docker pull ubuntu:18.04

容器基本命令

查看容器

查看容器

docker ps

查看所有容器

docker ps -a

查看最新创建的容器

docker ps -l

查看最新创建的2个容器

docker ps -n=2
参数含义
CONTANER ID容器id,唯一标识符,64位的十六进制整数
IMAGE创建容器时使用的镜像
COMMAND容器最后运行的命令
CREATED创建容器的时间
STATUS容器的状态
PORTS容器对外开放的端口
NAMES容器的名字,有默认值

创建容器

先创建再启动

docker create xxx

docker create [--name=xxx] xxx

创建+启动

后台型容器

docker run --name name -d -p [宿主机端口]:[容器端口] xxx

docker run --name nginx1 -d -p 8080:80 nginx

name: 创建容器的名字
-d 容器在后台运行
-p 将容器的端口[port2]映射到宿主机的端口[port1]

交互型容器

docker run --name xxx -it xxx /bin/bash

docker run --name=ubuntu1 -it ubuntu /bin/bash

-i 开发容器的标准输入(STDIN)
-t 为容器创建应该命令行终端
exit 可以退出终端

启动容器和终止容器

启动容器

docker start xxx

终止容器

docker stop xxx

注:xxx代表name/id

docker默认不会自动重启,所以可以利用--restart命令来重启容器

docker run --restart=always --name nginx1 -d  -p 8080:80 nginx 
标志结果
no默认,不自动重启容器
on:failue[:max-retries]非正常退出,可选参数:最大重启次数
always始终重启容器,无论容器当时状态为何都会尝试重启
ubless-stopped始终重启容器,docker守护进程启动时,若容器停止运行则不会去重启它

重启

docker restart [OPTIONS] CONTAINER XXX

删除容器

单个删除

docker rm xxx

批量删除

docker rm $(docker ps -a -q)

删除已经退出的孤立容器

docker container prune

依附容器

主要用于交互型容器

docker attach xxx

该容器退出,致容器停止

容器内部运行进程

docker exec -it xxx /bin/bash

-i:交互式操作
-t:终端
-d:让容器在后台运行
-p:将容器内部使用的网络端口映射到我们使用的主机上
指定端口映射

ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort

该容器退出,不会导致容器停止

查看容器信息

查看容器内部进程

docker top xxx

查看容器信息

docker inspect xxx

查看容器详细信息包括:id、容器名、环境变量、运行命令、主机配置、数据卷配置等

通过-f或--format标志选定查看结果

查看容器运行状态
docker inspect -f='{{.State.Running}}' xxx

查看容器ip地址
docker inspect -f='{{.NetworkSettings.IPAddress}}' xxx

查看容器名、容器id
docker inspect -f='{{.Name}} {{.ID}}' xxx

查看容器主机信息
docker inspect -f='{{.HostConfig}} {{.ID}}' xxx

查看容器日志

docker logs xxx

docker logs -f --tail=3 -t xxx

-f参数:跟踪日志输出
-t参数:显示时间戳
--tail:仅列出最新N条容器日志

docker run -d --name ubuntu1 ubuntu /bin/bash -c 'for((i=0;1;i++));do echo $1;sleep 1;done'

容器的导入导出

docker export把容器的文件系统以tar的格式导出到标准输出,使用>命令将其定位到目标文件 xxx.tar,将容器保存到本地后就可以通过网络等方法将tar包分享给他人

docker export xxx > xxx.tar

docker import 导入一个本地的tar包作为镜像,res:生成的镜像,tag标记

cat xxx.tar | docker import - xxx/ubuntu:v1.0


docker import url res:tag

本地镜像管理

创建容器

根据镜像创建容器

docker images

docker run -itd --name [name] -p 8080:80 [containerId]

镜像

搜索镜像

docker search xxx

docker search java

下载镜像

docker pull xxx

可以指定想要下载的镜像标签以及Docker Registry地址

docker pull reg.itmuch.com/java:7

列出镜像

docker images

删除本地镜像

docker rmi xxx

删除所有镜像

使用Dockerfile定制镜像

FROM 指定基础镜像

DockerHub中有许多可以直接使用的官方镜像
FROM scratch 不以任何镜像为基础,接下来所写的指令就是镜像的第一层

RUN 执行命令

shell格式 RUN<命令>

RUN echo '<h1>Hello</h1>' > /usr/share/nginx/html/index.html

exec格式 RUN["可执行文件", "参数1", "参数2"]
&&将各个命令串联、在行尾添加 \ 进行换行,行首 # 进行注释

RUN buildDeps = 'gcc libc6-dev make wget' \
            &&apt-get install xxx
            &&RUN wget xxxx

构建镜像

docker build [OPTIONS] <上下文路径/url/->

docker build -t nginx:v1 .

搭靶场

docker pull webgoat/webgoat-8.0
docker run -tp 8080:8080 webgoat/webgoat-9.0

docker pull acgpiano/sqli-labs
docker run -dt --name sqli-lab -p [你要映射的端口]:80 acgpiano/sqli-labs:latest