- docker常用命令
-
搜索
镜像:docker search [OPTIONS] [镜像名]
命令参数(OPTIONS):
-f, --filter filter 根据提供的格式筛选结果,如 -f is-official=true
–format string 利用Go语言的format格式化输出结果
–limit int 展示最大的结果数,默认25个,优先级高于其他参数
–no-trunc 描述全部显示 -
查看
镜像:docker image ls \ docker images
命令参数(OPTIONS):
-a, --all 展示所有镜像 (默认隐藏底层的镜像)
–no-trunc 不缩略显示
-q, --quiet 只显示镜像ID
可以使用正则,但是当匹配出两个一样NAME的镜像时会不显示此时需要加上版本号匹配
如:docker images cent*:latest -
拉取
镜像:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
命令参数(OPTIONS):
-a, --all-tags 下载所有符合给定tag的镜像- 没有指定下载版本时默认下载最新的版本
- 通过Image ID判断是否下载(如当指定的镜像Image ID已存在,则不做拉取,如名称不一样则只是新增引用)
-
删除
镜像:docker rmi / docker image rm [参数] 镜像名 [镜像名2…]
命令参数(OPTIONS):
-f, --force 强制删除,谨慎使用 -
导出
镜像:docker save [参数] 镜像名 [镜像名2…]
命令参数(OPTIONS):
-o, --output string 指定写入的文件名和路径
举栗:docker save hello-world fce2 hello-world:latest -o helloWorld.tar
注意:在导出的时候一定要指定版本号,否则在导入的时候REPOSITORY和TAG会显示NONE -
备份
导入
:docker load [参数]
命令参数(OPTIONS):
-i, --input string 指定要打入的文件,如没有指定,默认是STDIN
-q, --quiet 不打印导入过程信息 -
镜像
重命名
(相当于增加一个引用):docker tag 源镜像名[:版本号] 新镜像名[:版本号]
饭粒:docker tag hello-world:latest hello:latest -
镜像
详细信息
:docker image inspect [OPTIONS] IMAGE [IMAGE…]
或 docker inspect [OPTIONS] IMAGE [IMAGE…]
命令参数(OPTIONS):
-f, --format string 利用特定Go语言的format格式输出结果
饭粒:docker inspect hello -f “{{json .ContainerConfig.Env}}” -
镜像
历史信息
(可以查看镜像是由哪个镜像构建出来的):docker history [OPTIONS] IMAGE
命令参数(OPTIONS):
-H, --human 将创建时间、大小进行优化打印(默认为true)
-q, --quiet 只显示镜像ID
–no-trunc 不缩略显示
- docker 容器生命周期
-
容器
创建
:docker create [OPTIONS] IMAGE [COMMAND] [ARG…]
命令参数(OPTIONS):
-t, --tty 分配一个伪TTY,也就是分配虚拟终端
-i, --interactive 即使没有连接,也要保持STDIN打开
–name 为容器起名,如果没有指定将会随机产生一个名称
待执行命令 / 参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
饭粒:docker create --name centos-test centos ls -a -
删除
容器:docker rm [OPTIONS] CONTAINER [CONTAINER…]
命令参数(OPTIONS):
-f, --force 强制删除,在running、paused状态下适用 -
容器
启动
:docker start [OPTIONS] CONTAINER [CONTAINER…]
命令参数(OPTIONS):
-a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上
-i, --interactive 将当前shell的 STDIN连接到容器上
注意:当运行的容器有长连接等待输入的时候(如执行python)需要在容器创建的时候就加上-ti参数,启动的时候加上-ai参数
饭粒:docker create --name python2 -ti centos python
docker start -ai python2 -
容器
创建并启动
:docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
命令参数(OPTIONS):
-t, --tty:分配一个伪TTY,也就是分配虚拟终端
-i, --interactive:即使没有连接,也要保持STDIN打开
–name:为容器起名,如果没有指定将会随机产生一个名称
-d, --detach:在后台运行容器并打印出容器ID
–rm:当容器退出运行后,自动删除容器
待执行命令/参数(COMMAND\ARG):
COMMAND:表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG:表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
docker run 相当于 docker create + docker start –a 前台模式
docker run -d 相当于 docker create + docker start 后台模式 -
停止
容器:docker stop [OPTIONS] CONTAINER [CONTAINER…]
命令参数(OPTIONS):
-t, --time int:停止容器等待时间,单位秒(默认 10s)(尽管在这段时间内执行Ctrl + C 也无法中止stop命令)
stop命令是先发送SIGTERM信号,一段时间后再发送SIGKILL信号 -
容器
终止
:docker kill [OPTIONS] CONTAINER [CONTAINER…]
命令参数(OPTIONS):
-s, --signal string:指定发送给容器的关闭信号 (默认“KILL”信号)
kill命令直接发送SIGKILL信号 -
容器
暂停
:docker pause CONTAINER [CONTAINER…]
-
容器
取消暂停
(恢复运行):docker unpause CONTAINER [CONTAINER…] -
容器
重启
:docker restart [OPTIONS] CONTAINER [CONTAINER…]
命令参数(OPTIONS):
-t, --time int :重启前,等待的时间,单位秒(默认 10s) 即关闭前等待的时间 -
容器
详细信息
:docker container inspect [OPTIONS] CONTAINER [CONTAINER…]
或者 docker inspect [OPTIONS] CONTAINER [CONTAINER…]
命令参数(OPTIONS):
-f, --format string:利用特定Go语言的format格式输出结果
-s, --size:显示总大小 -
容器
日志
信息:docker logs [OPTIONS] CONTAINER
命令参数(OPTIONS):
–details:显示日志的额外信息
-f, --follow:动态跟踪显示日志信息
–since string:只显示某事时间节点之后的
–tail string:显示倒数的行数(默认全部)
-t, --timestamps:显示timestamps时间
–until string:只显示某事时间节点之前的
注意:容器日志中记录的是容器主进程的输出STDOUT\STDERR -
容器
重命名
:docker rename CONTAINER NEW_NAME -
容器
连接
:docker attach [OPTIONS] CONTAINER
将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程
上实现连接(退出以后容器也跟着停止)
命令参数(OPTIONS):
–no-stdin:不绑定STDIN -
容器中
执行新命令
:docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
命令参数(OPTIONS):
-d, --detach:后台运行命令
-i, --interactive:即使没连接容器,也将当前的STDIN绑定上
-t, --tty:分配一个虚拟终端
-w, --workdir string:指定在容器中的工作目录
-e, --env list:设置容器中运行时的环境变量
执行的命令(子进程)不影响主进程运行,其中的标准输出不会记录到logs中(即docker logs无法查看exec的输出) -
查看容器资源使用情况:docker stats [OPTIONS] [CONTAINER…]
- Docker 容器与镜像之间的关系
-
根据容器生成一个新的镜像
:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
命令参数(OPTIONS):
-a, --author string:作者
-c, --change list:为创建的镜像加入Dockerfile命令
-m, --message string:提交信息,类似git commit -m
-p, --pause:提交时暂停容器 (default true) -
容器
导出
:docker export [OPTIONS] CONTAINER
命令参数(OPTIONS):
-o, --output string:指定写入的文件,默认是STDOUT -
容器包的
导入
:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
命令参数(OPTIONS):
-c, --change list:为创建的镜像加入Dockerfile命令
-m, --message string:导入时,添加提交信息 -
commit与import的区别
- commit生成的镜像通过history可以看到
继承
关系,而import生成的镜像是独立生成一个新的镜像(没有继承关系)
- commit生成的镜像会保留所有父镜像的数据,利用import方法会丢失所有父镜像的元数据(docker inspect查看Config信息)
- commit生成的镜像通过history可以看到
- Docker镜像的底层实现(联合文件系统)
- docker inspect -f “{{json .RootFS.Layers}}” IMAGE查看Layer继承镜像信息
- 只读文件系统,只能看到最后一层。
- Docker 网络管理
-
查看网络
:docker network ls [OPTIONS]
命令参数(OPTIONS):
-f, --filter filter 过滤条件(如 'driver=bridge’)
–format string 格式化打印结果
–no-trunc 不缩略显示
-q, --quiet 只显示网络对象的ID
注意:默认情况下,docker安装完成后,会自动创建bridge、host、none三种网络驱动 -
创建
网络:docker network create [OPTIONS] NETWORK
命令参数(OPTIONS):
-d, --driver string:指定网络的驱动(默认 “bridge”)
–subnet strings:指定子网网段(如192.168.0.0/16、172.88.0.0/24)
–ip-range strings:执行容器的IP范围,格式同subnet参数
–gateway strings:子网的IPv4 or IPv6网关,如(192.168.0.1)
注意:- host和none模式网络只能存在一个
- docker自带的overlay 网络创建依赖于docker swarm(集群负载均衡)服务
- 192.168.0.0/16 等于 192.168.0.0~192.168.255.255 192.168.8.0/24
- 172.88.0.0/24 等于 172.88.0.0~172.88.0.255
- host和bridge都可以链接外网,none无法链接外网
-
网络
删除
:docker network rm NETWORK [NETWORK…] -
网络
详细信息
:docker network inspect [OPTIONS] NETWORK [NETWORK…]
或者 docker inspect [OPTIONS] NETWORK [NETWORK…]
命令参数(OPTIONS):
-f, --format string:根据format输出结果 -
使用
网络:docker run/create --network NETWORK
注意:默认情况下,docker创建或启动容器时,会默认使用名为bridge的网络 -
网络连接与断开:docker network connect [OPTIONS] NETWORK CONTAINER
docker network disconnect [OPTIONS] NETWORK CONTAINER
命令参数(OPTIONS):
-f, --force 强制断开连接(用于disconnect)
注意:- host模式不能使用该命令
- 同一容器不能同时存在两种及以上网络模式
- 同一容器可以拥有多个bridge网络
- docker 网络模式
bridge
模式(基于IP做转发):- 特点:
- 宿主机上需要单独的bridge网卡,如默认docker默认创建的docker0。
- 容器之间、容器与主机之间的网络通信,是借助为每一个容器生成的一对veth pair虚拟网络设备对,进行通信的。一个在容器上,另一个在宿主机上。
- 每创建一个基于bridge网络的容器,都会自动在宿主机上创建一个veth**虚拟网络设备。
- 外部无法直接访问容器。需要建立
端口映射
才能访问。 - 容器借由veth虚拟设备通过如docker0这种bridge网络设备进行通信。
- 每一容器具有单独的IP
端口映射
:在容器创建或启动时指定端口映射
docker run/create -P …或者 docker run/create –p …
命令参数(OPTIONS):
-P, --publish-all:将容器内部所有暴露端口进行随机映射
-p, --publish list:手动指定端口映射
饭粒:-p [HOST_IP]:[HOST_PORT]:CONTAINER_PORT
如:-p ::80 将容器的80端口随机(端口)映射到宿主机任意IP
-p :8000:6379 将容器的6379端口映射到宿主机任意IP的8000端口
-p 192.168.5.1::3306 将容器的3306端口随机(端口)映射到宿主机的192.168.5.1 IP上
host
模式:网络性能最佳
特点:
- 容器完全共享宿主机的网络。网络没有隔离。宿主机的网络就是容器的网络。
- 容器、主机上的应用所使用的端口不能重复。例如:如果宿主机已经占用了8090端口,那么任何一个host模式的容器都不可以使用8090端口了;反之同理。
- 外部可以直接访问容器,不需要端口映射。
- 容器的IP就是宿主机的IP
-
Container
模式:一个容器共享其他容器的网络
相当于该容器在网络层面上,将其他容器作为“主机”。它们之间的网络没有隔离。这些容器之间的特性同host模式。
使用方法:
Docker run/create --network container:CONTAINER …
举栗:docker run -itd --rm --network container:5e28 mongo
-
none模式:
特点:容器上没有网络,也无任何网络设备。如果需要使用网络,需要用户自行安装与配置。
应用场景:该模式适合需要高度定制(隔离
)网络的用户使用。 -
overlay模式:也称为覆盖网络
- Overlay 网络的实现方式和方案有多种。Docker自身集成了一种,基于
VXLAN隧道技术
实现。
Overlay 网络主要用于实现跨主机容器之间的通信。 - 应用场景:需要管理成百上千个跨主机的容器集群的网络时。
- TCP/IP协议工作流程:
- IP隧道网络原理(数据包从c1到c2)
- macvlan 网络模式:
最主要的特征就是他们的通信会直接基于mac地址进行转发
。
- 这时宿主机其实充当一个二层交换机。Docker会维护着一个MAC地址表,当宿主机网络收到一个数据包后,直接根据mac地址找到对应的容器,再把数据交给对应的容器。
- 容器之间可以直接通过IP互通,通过宿主机上内建的虚拟网络设备(创建macvlan网络时自动创建),但与主机无法直接利用IP互通。
- 应用场景:由于每个外来的数据包的目的mac地址就是容器的mac地址,这时每个容器对于外面网络来说就相当于一个真实的物理网络设备。因此当需要让容器来的网络看起来是一个真实的物理机时,使用macvlan模式
-
docker数据卷
- 容器数据弊端:
- 宿主机无法直接访问容器中的文件
- 容器中的文件没有持久化,导致容器删除后,文件数据也随之消失
- 容器之间也无法直接访问互相的文件
- 为解决以上问题,docker加入了数据卷(volumes)机制,以实现:
- 容器与主机之间、容器与容器之间
共享
文件 - 容器中数据的
持久化
- 将容器中的
数据备份、迁移、恢复
等
- 数据卷的特点
- 数据卷存在于宿主机的文件系统中,
独立于容器
,和容器的生命周期是分离的。 - 数据卷可以目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。
- 容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
- 容器对数据卷的修改是实时进行的。
- 数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
- Docker挂载容器数据卷的三种方式
- bind mounts:将宿主机上的一个文件或目录被挂载到容器上。
- volumes:由Docker创建和管理。使用docker volume命令管理
- tmpfs mounts:tmpfs 是一种基于内存的临时文件系统。tmpfs mounts 数据不会存储在磁盘上
bind
mounts方式挂载数据卷:挂载数据卷都是利用docker run/create的参数为容器挂载数据卷
- 方式一: -v, --volume参数
-v 宿主机文件或文件夹路径:容器中的文件或者文件夹路径
饭粒:docker run -itd -v /root/volume_dir:/root/v1_dir centos - 方式二:–mount参数
–mount type=bind,src=宿主机文件或文件夹路径,dst=容器中的文件或者文件夹路径
注意:src指定的文件和路径必须提前创建或存在;type/src/dst之间不能存在空格
饭粒:docker run -itd --mount type=bind,src=/root/mount_dir,dst=/root/v2_dir centos
volumes
方式挂载数据卷
- 方式一: -v, --volume参数
-v [VOLUME-NAME:]容器中的文件或者文件夹路径 - 方式二:–mount 参数
–mount type=volume,src=VOLUME-NAME,dst=容器中的文件或者文件夹路径 volume对象管理
:
docker volume:命令管理volume数据卷对象
docker volume create:创建数据卷对象
docker volume inspect:查看数据卷详细信息
docker volume ls:查看已创建的数据卷对象
docker volume prune:删除未被使用的数据卷对象
docker volume rm:删除一个或多个数据卷对象
-
tmpfs mount方式挂载数据卷:挂载/存到内存
用法:
–mount type=tmpfs, dst=PATH
饭粒:docker run -itd --mount type=tmpfs,dst=/root/mount_dir centos -
共享其他容器的数据卷
用法:docker run/create --volumes-from CONTAINER
饭粒:docker run -itd --volumes-from ce3a centos -
Docker的数据卷更多会是使用volumes方式来进行使用。使用时需
注意
:
- 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
- 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。
- 这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。
- docker私有仓库(应用比较小众,目前都在云端创建仓库)
- Docker仓库就是存放docker镜像并有docker pull方法下载的云环境
- Docker仓库分为公有仓库和私有仓库
- 公有仓库指Docker Hub(官方)等开放给用户使用、允许用户管理镜像。
- 私有仓库指由用户自行搭建的存放镜像的云环境。
- 搭建
无认证
私有仓库
- 第一步:在需要搭建仓库的服务器上安装docker。
- 第二步:在服务器上,从docker hub下载registry仓库
docker pull registry
- 第三步:在服务器上,启动仓库
docker run -d -ti --restart always --name my-registry -p 8000:5000 -v /my-registry/registry:/var/lib/registry registry
注意:registry内部对外开放端口是5000。默认情况下,镜像会存放于容器内的/var/lib/registry(官网Dockerfile中查看)目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失。 - 本地(或浏览器)利用curl 服务器IP:8000/v2/_catalog 查看当前仓库中的存放的镜像列表。(注意防火墙打开8000端口访问)
- 上传私有镜像到无认证私有仓库
- 第一步:利用docker tag重命名需要上传的镜像
docker tag IMAGE 服务器IP:端口/IMAGE_NAME
饭粒:docker tag centos-net 192.168.33.6:8000/centos-net - 第二步:利用docker push上传刚刚重命名的镜像
docker push 服务器IP:端口/centos
饭粒:docker push 192.168.33.6:8000/centos-net - 注意:
必须重命名为 服务器IP:端口/IMAGE_NAME
如果push出现了类似https的错误,那么需要往配置文件/etc/docker/daemon.json里添加:“insecure-registries”:[“服务器IP:端口”]
然后重启docker再上传镜像即可。 - 查看镜像是否上传成功:curl 服务器IP:端口/v2/_catalog
-
无认证私有仓库镜像下载:docker pull 服务器IP:端口/IMAGE_NAME
-
搭建
带认证
的私有仓库
- 第一步:删除先前创建的无认证的仓库容器(这步可省略)
docker rm -f my-registry - 第二步:创建存放认证用户名和密码的文件:
mkdir /auth-registry/auth -p - 第三步:创建密码验证文件。注意将USERNAME和PASSWORD替换为设置的用户名和密码
docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > /auth-registry/auth/htpasswd - 第四步:重新启动仓库镜像
docker run -d -p 8000:5000 --restart=always --name docker-registry
-v /auth-registry/registry:/var/lib/registry
-v /auth-registry/auth:/auth
-e “REGISTRY_AUTH=htpasswd”
-e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm”
-e “REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd”
registry
- 带认证的私有仓库上传、下载镜像
在认证仓库机器上:
- 第一步:首先登录到服务器
docker login -u username -p password 仓库IP:端口 - 第二步:然后执行pull或者push命令
- 第三步:操作完毕后,可以退出登录
docker logout 仓库IP:端口
- 如果想查看仓库中已有的镜像,需要进行http验证才可以。可以直接借助浏览器访问 仓库IP:端口/v2/_catalog