镜像文件
Image
:
提供应用程序运行所需环境的只读模板,相当于虚拟机系统的 iso 文件
容器Container
:
镜像上层的可写层,是一个简单且完整的系统
相当于 VMware 中的虚拟机
镜像仓库Repository
:
用来集中存放镜像文件的地方,有自己的专门地址,类似网址
相当于 GitHub 仓库,需要托管在某个 Registry
登记处Registry
:
登记处有多个,它是存放镜像仓库的地方,相当于 GitHub 网站
一、容器
1.1、info
选项查看系统信息:
docker info
或者
docker system info
1.2、--help
查看帮助:
docker --help
1.3、version
查看 docker 版本:
docker version
1.4、ls
查看正在运行的容器列表:
docker container ls
1.5、ls -a
查看正在运行的、曾经运行过的、已经创建的容器列表:
docker container ls -a
# -q 只显示容器 ID ;-s 显示文件大小
1.6、run
运行容器(运行完就自动退出):
docker run [参数] <镜像> [命令]
或者
docker container run [参数] <镜像> [命令]
1.7、run -it
运行容器且保持其运行,需要执行一个保持运行的命令:
docker container run -it <镜像> <命令>
1.8、create
创建容器:
参数说明:
-
--name
指定一个容器名称,未指定时,会随机产生一个名字 -
--hostname
设置容器的主机名 -
--mac-address
设置 MAC 地址 -
--ulimit
设置 Ulimit 选项
举个例子:
docker container create --name shiyanlou --hostname shiyanlou
--mac-address 00:01:02:03:04:05 --ulimit nproc=1024:2048 -it ubuntu /bin/bash
1.9、start
运行容器;restart
重启容器:
docker container start <容器名>
docker container restart <容器名>
1.10、创建并运行容器:
这个命令把上面俩命令合起来了,即把命令 8 中 create
改为 run
:
docker container run --name shiyanlou --hostname shiyanlou
--mac-address 00:01:02:03:04:05 --ulimit nproc=1024:2048 -it ubuntu /bin/bash
1.11、attach
连接到容器(即进入容器):
上面运行容器的命令,是在后台启动容器,执行 docker container ls
可见
此命令可在终端进入容器:
docker container attach <容器名>
- 断开连接(即离开容器)须按键
Ctrl + p
加Ctrl + q
,这不会导致容器停止运行 - 使用 exit 命令会导致容器停止运行
1.12、stop
停止后台运行的容器:
docker container stop <容器名>
1.13、logs
查看容器运行日志:
docker container logs <容器名>
1.14、top
查看容器正在运行时的进程信息:
docker container top <容器名>
1.15、diff
查看容器相对于镜像文件做了哪些修改:
docker container diff <容器名>
1.16、exec
可在容器外控制容器:
容器处于后台运行状态,执行此命令可控制容器:
docker container exec <容器名> <命令>
1.17、rm
删除容器:
- 注意:正在运行的容器无法被删除
docker container rm <容器名>
# 暂停所有运行中的容器
docker container ls -q | xargs docker container stop
# 删除所有的容器
docker container ls -aq | xargs docker container rm
二、镜像
Docker 镜像是分层存储的
每一个镜像都由多层组成,每一层就是一个只读文件系统
镜像之间会共享一些相同的层,从而减少众多镜像占用的存储空间
当我们启动一个容器的时候,Docker 会加载只读镜像层并在其上添加一个读写层
如果运行中的容器修改了现有的一个已经存在的文件
那该文件将会从读写层下面的只读层复制到读写层
该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏
当删除 Docker 容器,并通过该镜像重新启动时,之前的更改将会丢失
在 Docker 中
只读层及在顶部的读写层的组合被称为 Union File System(联合文件系统)
对于实验环境中的 Docker 来说,其使用的存储驱动是aufs
2.1、ls
查看镜像信息:
docker image ls # 查看全部镜像
docker image ls <镜像名> # 查看指定镜像
-
REPOSITORY
镜像仓库名 -
TAG
标签 / 版本号 -
IMAGE ID
镜像 ID -
CREATED
创建时间 -
SIZE
大小
2.2、inspect
查看镜像的详细信息:
docker image inspect <镜像名>
2.3、pull
拉取镜像:
-
<哈哈>
的格式为镜像名:镜像版本
,不写镜像版本则默认为latest
docker image pull <哈哈>
举个例子:
shiyanlou:~/ $ docker image pull ubuntu:14.04
14.04: Pulling from library/ubuntu
72c01b436656: Pull complete
65584f5f70ee: Pull complete
dc9874b52952: Pull complete
86656bbaa6fd: Pull complete
7fe6916ab382: Pull complete
Digest: sha256:cb96ec8eb632c873d5130053cf5e2548234e5275d8115a39394289d96c9963a6
Status: Downloaded newer image for ubuntu:14.04
2.4、commit
将容器的修改保存为新的镜像版本,注意这是一个容器命令:
docker container commit <容器名> <哈哈>
2.5、build
创建镜像:
上面的容器命令可以创建一个新的镜像版本,这种做法不被推荐
我们还可以从一个 Dockerfile
中读取指令来构建镜像
注意 Dockerfile
的文件名就叫 Dockerfile ,不能改
Dockerfile
是一个包含用户构建镜像所需命令的文本文件,文件中使用 #
注释
在创建好该文件后,我们可以使用如下命令来构建镜像:
# -t 参数指定新的镜像
docker image built -t <哈哈> <Dockerfile 的路径>
2.6、rm
删除镜像:
- 注意:删除镜像须指定版本,不指定的话会默认删除 latest 版本
docker image rm <哈哈>
三、卷 (volume
)
由上文可知,我们打开一个容器,对其进行修改后,不能保存修改
第二部分用了容器的commit
方法将修改后的容器保存为一个新的镜像
难道每次修改都要保存一个新的镜像?显然这并不是一个好办法
另外还有个问题,如何实现容器与宿主系统、各个容器之间的数据传输 / 迁移?
为了解决上述问题,Docker 提出了
volume
概念
volume
被认为是容器目录系统的目录或文件,完全由 Docker 控制
它可以绕过默认的联合文件系统,以正常的文件或目录的形式存在于宿主系统上
3.1、ls
查看卷列表:
所有卷都以目录的形式存储在 /var/lib/docker/volume
目录下
docker volume ls
3.2、create
创建卷:
docker volume create # 不写卷名,会随机生成一个 16 进制字符串作为卷名,叫做匿名卷
docker volume create <卷名>
3.3、-v
或 --mount
选项可以实现用卷启动容器:
-
-v
/--volume
此选项的参数由三段组成,用:
隔开- 格式为
卷名:容器目录:配置项
- 格式为
-
--mount
此选项的参数由多个键值对组成,用,
隔开-
type
指定类型,可以指定为 bind、volume、tmpfs,用卷自然选 volume -
source
可以使用缩写 src
当类型为 volume 时,指定卷名称,省略该字段会新建一个卷
当类型为 bind 时,指定路径 -
destination
容器目录,挂载到容器中的路径,可以使用缩写 dst 或 target -
readonly
读写配置项,可以使用缩写 ro
-
举个例子:
# run -it 运行容器且保持其处于运行状态
# --name 后接容器名
# --rm 自动清理容器内的文件系统,具体怎么个清理法,暂不清楚
docker container run -it --name cool -v one:/one --rm ubuntu bash
docker container run -it --name cool
--mount type=volume,src=one,target=/ok --rm ubuntu bash
这个容器目录,上面命令中的 /one
和 /ok
就是用来在容器之间、容器和宿主系统之间传数据的
如果该目录不存在,会自动创建
如果将 -v
的卷名改成宿主系统的绝对目录,或将 --mount
的 type 改为 bind
就可以将宿主系统的目录挂载到容器,使得容器可以对宿主系统进行修改
docker container run -it --name cool
-v /home/shiyanlou:/home/shiyanlou --rm ubuntu bash
docker container run -it --name cool
--mount type=bind,src=/home/shiyanlou,target=/home/shiyanlou --rm ubuntu bash
四、网络
安装 Docker 后,会自动创建 3 个网络:
bridge
、host
、none
默认情况下,我们创建的容器都会连接到bridge
网络
4.1、ls
查看全部网络:
docker network ls
4.2、inspect
查看网络详情:
docker network inspect <网络名>
4.3、--network
指定容器连接的网络(这是容器命令的选项):
默认运行容器会连接 bridge
网络,即 --network bridge
可以不写
举例:
# -d 启动守护进程,即该容器会在后台运行
docker container run -itd --name shiyanlou002 --network bridge ubuntu /bin/bash
4.4、iptables
命令实现端口映射:
在同一 Docker 网络的容器之间的网络是通过内网连通的
如果需要从主机外部访问容器内的服务,则需要配置端口映射
也就是将容器内的端口映射为主机的端口,然后通过主机 IP + 端口来访问
端口映射通过 iptables
来实现
- 查看
nat
表的转发规则:
网友评论