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,不支持以 docker run -d 启动的容器
  • bash就是给容器的命令,这里我们希望得到交互式shell,所以打开bash

其他参数:

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

列出镜像

1
2
docker image ls
docker images -a

image-20210519121316891

参数:

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

删除本地镜像

1
2
3
docker image rm [args] <image's id/reponame/>
docker rmi -f 镜像id
docker rmi -f $(docker images -aq) #删除全部镜像

参数:

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

配合docker image ls

1
docker image rm $(docker image ls -q redis) #删除所有仓库名为 redis 的镜像

搜索镜像

在docker hub中搜索镜像

1
docker search mysql

提交镜像

1
docker commit -m "xxx" -a="author" 镜像id 目标镜像名:TAG

保存在本地

容器

新建&启动

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

没有的镜像,会自动pull

守护态运行

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
2
3
docker container ls
docker ps # 查看正在运行的容器
docker ps -a # 查看历史运行过的容器

image-20210519130640053

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

查看容器的日志信息:

1
docker container logs [id or name]

终止&重启容器

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

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

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

image-20210519131228416

在容器内部

exit退出并终止容器

ctrl+p+q 退出但不终止容器

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

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

删除全部容器:

1
2
docker rm -f $(docker ps -aq)
docker ps -aq | xargs docker rm

进入容器

attach和exec都可以,更推荐exec

1
2
3
4
docker container ls

docker exec -it [shortid] /bin/bash # 进入容器后开启新的终端
docker attach [shortid] # 进入容器当前正在执行的终端

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

查看当前所有的网络配置

·

查看容器元数据

1
docker inspect 容器id

容器的加载

tar文件:容器的离线保存

container->image

将容器保存为镜像

1
docker commit [OPTIONS] CONTAINERID [REPO:VERSION]

OPTIONS:

  • -m: info
  • -a: author

container->tar

将容器保存为tar文件

1
docker export -o target.tar [ContainerID]

images<->tar

images<-tar

load:将tar加载为image

1
docker load -i target.tar

加载之后为同名image

image-> tar

save:将image保存为tar文件

1
docker save -o target.tar ImageID

image-20210930213709652

额外的备忘命令

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
30
31
32
33
34
# 查看当前运行的容器
docker ps

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

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

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

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

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

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

# 删除指定镜像
docker rmi image_id

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

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

--restart=always 容器启动时重新启动

# 一步到位
docker run -it nginx:latest /bin/bash

容器数据卷

容器之间数据共享的技术,将容器内部的目录,挂载到宿主机上

命令挂载

-v 主机目录:容器目录

数据映射

Dockerfile

docker的构建文件,本质为命令脚本

镜像多层,命令多行

1
docker build -f Dockerfile -t 镜像名:版本 .

常用命令

RUN

docker build时候执行

1
2
3
4
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

CMD docker run 时执行

1
2
CMD ["ls","-a"]
&& 拼接

参考

Docker-入门到实战

MacOS Docker安装和使用

Docker命令大全