Docker学习

Docker学习

最近网安实践花式安装各种运算库真的麻烦,Docker可以对应用组件进行封装、部署、运行等生命周期管理,是用户的应用及其运行环境能够做到“一次封装,到处运行”。That sounds good,和Java似的,那就学学吧~

说在前面 : )

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置,比如我们的Linux内核为第0层,这是一个只读的镜像,但是我们能够在外加层,由此我们就能得到centos、ubuntu等等其他镜像。

容器的定义和镜像几乎一摸一样,也是一层一层的,区别在于容器在镜像的基础上增加了一个可写层,我们对容器的更改是写到容器的文件系统中的,所以说运行态容器为由一个可读写的文件系统「静态容器」+ 隔离的进程空间和其中的进程构成,如下图所示。

BeNMPx.png

1. 安装docker

这里演示了win10下安装docker,其他操作系统可以参考官方文档

在开始图标处找到应用程序和功能

BEuUw4.png

然后开启Hyper-V

BEliB8.png

下载windows安装包(大概400+M,官网下载挺快的~),直接一路next完成安装,然后重启电脑即可 : )

BEGdRH.png

镜像加速

外网下载docker镜像太慢了,所以我们需要添加国内镜像,这里使用的阿里云镜像加速。

进入阿里云官网,找到镜像容器服务。

BE8s5F.png

然后找到镜像加速器,下面就有各种系统的配置方法

BE8IUO.png

将镜像加速器地址在docker客户端setting中设置好即可~

BEGuiF.png

2. hello-world

首先从hello-world开始,直接运行如下命令

1
docker run hello-world

然后就会提示不能再本地找到hello-world镜像,于是就从远程(阿里云)pull下来了,于是我们就成功运行了hello-world,虽然啥也没干 : (

BEJBhF.png


后面部分主要是一些命令的介绍,主要列举了一些比较常用的命令,当然更加详细的命令可以通过docker —help获得

3. docker镜像命令

3.1 镜像列表

使用docker images命令查看当前主机上的镜像,REPOSITORY表示镜像仓库源,TAG表示镜像的标签,IMAGE ID表示镜像ID号(仅显示了前12位),CREATED表示创建的时间,SIZE表示存储的大小

命令说明

1
2
3
4
5
6
7
8
Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
Options:
-a, --all Show all images (default hides intermediate images)
--digests 显示摘要(也就是镜像说明)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc 不要截断输出
-q, --quiet Only show numeric IDs

BEUeC8.png

3.2 镜像查询

使用docker search在docker hub上查找我们所需的镜像(配合可选参数能对镜像做一些筛选)

命令详细说明:

1
2
3
4
5
6
7
8
9
Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output

BVDkTJ.png

3.3 镜像提交

有时我们创建好容器后,对容器进行了一些修改,我们想要固化这些修改,我们可以将当前容器又重新生成镜像,使用docker commit命令。

1
2
3
4
5
6
7
8
9
10
Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
-a, --author string Author (e.g., "John Hannibal Smith
<hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)

举个栗子

BZ4Dot.png

3.4 镜像删除

使用docker rmi删除一个或多个镜像(多个镜像只需要用空格隔开即可)

1
2
3
4
5
6
7
Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Options:
-f, --force Force removal of the image
--no-prune Do not delete untagged parents

如果需要删除的镜像还有容器存在使用使用强制删除

BZI38K.png

4. docker容器命令

4.1 创建容器

有了镜像文件,我们就能在镜像文件的基础上创建容器,使用docker run命令,关于该命令的一些一些细节可以通过docker run --help查看(帮助文档太长我就不搬上来了)

举个栗子,使用如下命令创建一个kali容器,-i交互式操作,-t终端,-v添加volume(/宿主机目录:/容器内目录:rw/ro,默认为rw(可读可写),也可以使用—volume-from从其他容器继承volume,其实和手动添加没区别),--name容器名字,-p指定端口号(宿主机端口:容器端口)

1
docker run -it -v /DataVolume:/DataVolume --name kali booyaabes/kali-linux-full

Be5hQS.png

4.2 删除容器

使用docker rm命令删除容器

1
2
3
4
5
6
7
8
Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]

Remove one or more containers

Options:
-f, --force Force the removal of a running container (uses SIGKILL)
-l, --link Remove the specified link
-v, --volumes Remove anonymous volumes associated with the container

BeEJbQ.png

4.3 启动容器

使用docker start来启动容器

1
2
3
4
5
6
7
8
9
10
11
Usage:  docker start [OPTIONS] CONTAINER [CONTAINER...]

Start one or more stopped containers

Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--checkpoint string Restore from this checkpoint
--checkpoint-dir string Use a custom checkpoint storage directory
--detach-keys string Override the key sequence for detaching a
container
-i, --interactive Attach container's STDIN

BeGRgg.png

4.4 停止容器

停止容器有两种方式:

  • 使用docker stop来停止容器(同样的还有重启容器命令docker restart
  • 还可以使用docker kill强制停止容器

下面是两个命令是使用帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
-t, --time int Seconds to wait for stop before killing it (default 10)

Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]

Kill one or more running containers

Options:
-s, --signal string Signal to send to the container (default "KILL")

BeGbCT.png

4.5 退出容器

退出容器主要有两种方式:

  • exit:容器退出并停止
  • ctrl+P+Q:容器不停止退出

4.6 进入容器

进入容器也有两种方式:

  • docker attach:直接进入容器
  • docker exec:在一个容器上执行命令,可以选择不进入容器而仅执行命令,当然也可以选择-it选项进入容器,并且使用exit退出时容器并不会停止

以下是两个命令的详细说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Usage:  docker attach [OPTIONS] CONTAINER

Attach local standard input, output, and error streams to a running container

Options:
--detach-keys string Override the key sequence for detaching a
container
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process
(default true)



Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a
container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format:
<name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the container

使用docker attch进入容器

BeU5tI.png

使用docker exec执行命令,也可以选择打开TTY终端

BeaVE9.png

4.7 拷贝容器数据

有时需要将容器中的数据拷贝到宿主机上,但是又没有使用容器数据卷,这时候我们可以使用一个简单的docker cp命令拷贝出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Copy files/folders between a container and the local filesystem

Use '-' as the source to read a tar archive from stdin
and extract it to a directory destination in a container.
Use '-' as the destination to stream a tar archive of a
container source to stdout.

Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH

比如我们将Linux容器中的一个文本文件拷贝到windows宿主机目录下

Bewel6.png

4.8 查看容器信息

使用docker inspect查看容器的详细信息,返回一个类似于json串的描述

1
2
3
4
5
6
7
8
Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Return low-level information on Docker objects

Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type

BeNlRK.png


docker还有许多内容鸭,docker file, docker compose之类的,感觉目前用不到~有机会再去学吧^_^