0%

Docker学习笔记

序言

欲穷千里目,更上一层楼。

我在调试漏洞的过程中会密切地和Docker打交道,今天来总结一下Docker的基本操作。

基本概念

Docker包括三个基本概念:

  • 镜像Image
  • 容器Container
  • 仓库Repository

镜像就像类,容器就像实例。

容器的实质是进程,容器进程属于自己独立的命名空间,也就是进程隔离

仓库是容器的存储分发,默认仓库内的镜像是<仓库名>:<Tag>,默认tag是latest

对于一个ubuntu仓库来说:

ubuntu是仓库的名字,ubuntu:16.04ubuntu:18.04则是两个不同标签代表不同版本。

仓库通常是两段式命名,例如ownername/nginx

前者是用户名,后者是软件名。

镜像

获取镜像

1
docker pull [args] [域名[:端口号] /] 仓库名[:标签]

docker pull --help看细节

  • docker仓库地址:<域名/IP>[:端口号] 默认地址是docker.io
  • 仓库名:<仓库名/软件名> 仓库名不写默认是library,也就是官方镜像

比如:docker pull ubuntu:18.04

完整仓库名就是:docker.io/library/ubuntu:18.04

运行镜像

1
docker run -i -t --rm ubuntu:18.04 /bin/bash

解读:

  • -i参数是启动容器内交互式操作模式
  • -t参数是在容器内开启一个终端
  • --rm代表容器退出后随之将该容器删除,不必再手动rm
  • bash就是给容器的命令,这里我们希望得到交互式shell,所以打开bash

其他参数:

  • -d可以让容器在后台运行
  • -p
  • exit退出容器

列出镜像

1
docker image ls

image-20210519121316891

参数:

  • docker image ls -q只显示image的id
  • docker image ls ubuntu只显示仓库名是ubuntu的image

删除本地镜像

1
docker image rm [args] <image's id/reponame/>

参数:

  • 这里面的image's id通常可以是长ID12位,也可以仅仅是前3位短id

配合docker image ls

1
2
我们需要删除所有仓库名为 redis 的镜像:
docker image rm ${docker image ls -q redis}

容器

新建&启动

1
docker run ubuntu:18.04 /bin/echo "helloworld"

守护态运行

1
docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

image-20210519122754667

会将结果打印在本地终端,这里需要启动-d参数,来让容器在后台运行:

1
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

image-20210519122959476

就不再会打印到本地终端。

使用docker logs 86d4eab113a908ce2ee49fa46145623d62a290a76ab3807429588f7c2868bd6来查看

image-20210519123132506

输出内容会在日子里体现出来,

查看运行中的容器

1
docker container ls

image-20210519130640053

对比可以发现,刚才那一长串才是完整ID

查看自动容器的日志:

1
docker container logs [id or name]

终止&重启容器

首先,当容器内的程序结束时,容器也将自动终止。

对于一般情况,可以使用docker container stop [id or name]来终止

终止状态的docker信息可以docker container ls -a来查看

image-20210519131228416

当然

对于已经停掉的容器,重新启动可以docker container start [id or name]

对于正在运行的容器,强制重新启动可以docker container restart [id or name]

进入容器

attach和exec都可以,更推荐exec

1
2
3
docker container ls

docker exec -it [shortid] /bin/bash

image-20210519132015322

原因:

  • -it一起使用时,可以进入交互模式,并且可以看到熟悉的linux命令提示符

容器的导出&导入

导出

1
docker export id > ubuntu.tar

image-20210519132819881

导入

1
2
3
4
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB

也可以通过网址来import:

1
$ docker import http://example.com/exampleimage.tgz example/imagerepo

删除容器

删除正在运行的容器

1
docker container rm -f [id or name]

删除所有容器

1
docker container prune

外部网络访问容器

1
docker run -d -P nginx

-P参数的意思就是随机打开一个本地端口

查看访问日志;

1
docker logs id

-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

1
-p 55500:80

意思就是本机的55500端口映射给80端口

1
-p 80:80

的意思就是映射全部端口

比较:

1
2
3
-p 80:80 绑定对应所有端口
-p 127.0.0.1:80:80 指定映射使用一个特定地址
-p 127.0.0.1::80 绑定本地的任意端口给容器的80端口

查看端口映射的配置

1
docker port id 80

查看当前所有的网络配置

查看docker内部网络地址

1
docker inspect id

额外的备忘命令

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
29
# 查看当前运行的容器
docker ps

# 查看所有容器,包括停止的
docker ps -a

# 查看最新创建的容器,只列出最后创建的
docker ps -l

# 查看网络端口
docker port [容器ID|容器名]

# 查看容器内部的标准输出
docker logs [容器ID|容器名]

# 查看容器内部运行的进程
docker top [容器ID|容器名]

# 查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息
docker inspect [容器ID|容器名]

# 删除指定image
docker rmi image_id

# 删除容器,删除容器时,容器必须是停止状态
docker rm [容器ID|容器名]

# 删除所有的容器
docker rm $(docker ps -aq)

参考

Docker-入门到实战

MacOS Docker安装和使用