镜像操作
镜像查看
# 查看镜像
docker images
# 查看镜像,含中间映像层
docker images -a
# 查看镜像,只显示镜像ID
docker images -q
镜像搜索
# 搜索镜像
docker search [镜像名]
# 搜索starts >= 600的镜像
docker search [镜像名] --filter=stars=600
镜像下载
# 下载最新版镜像
docker pull [镜像名]
# 下载指定Tag的镜像
docker pull [镜像名]:[Tag]
# 下载仓库所有镜像
docker pull [镜像名] -a
镜像删除
# 删除镜像
docker rmi <镜像ID>
# 删除所有镜像
docker rmi $(docker images -q)
设置镜像标签
# 为镜像设置一个新Tag
docker tag <镜像ID> <镜像名>:<新的镜像标签>
容器操作
查看容器
# 显示所有的容器
docker ps -a
# 只显示容器编号
docker ps -aq
# 显示总的文件大小
docker ps -as
启动新容器
# 启动容器
docker run -itd --name test1 -p 8080:80 -v /data:/data ubuntu:18.04 /bin/bash
# 参数说明
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d: 后台运行容器,并返回容器ID
--name: 为容器指定一个名称
-P: 随机端口映射,容器内部端口随机映射到主机的端口(49000~49900)
-p: 指定端口映射,格式为:主机端口:容器端口
-e: 设置环境变量
--net: 指定容器的网络连接类型,支持 bridge/host/none/container
-v: 绑定一个卷,主机目录:容器目录
--privileged: 以特权方式启动容器,容器具有root权限
--rm: 容器退出时会自动将其删除
--restart:重启策略(always、unless-stopped、on-failure:3)
/bin/bash: 容器启动后执行的命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
实例
# 使用镜像 ubuntu:18.04 以后台模式启动一个容器
# 将容器的 80 端口映射到主机的 8080 端口(TCP)
# 将容器的 53 端口映射到主机的 53 端口(UDP)
docker run -itd -p 8080:80 -p 53:53/udp ubuntu:18.04 /bin/bash
# 使用镜像 ubuntu:18.04 以后台模式启动一个容器
# 将主机的目录 /test 映射到容器的 /data
docker run -itd -v /test:/data ubuntu:18.04 /bin/bash
# 使用镜像 ubuntu:18.04 以后台模式启动一个容器
# 设置容器换将变量 PASSWORD 为 123456
docker run -itd -e PASSWORD="123456" ubuntu:18.04 /bin/bash
容器自动启动
# 示例
docker run -itd --restart always ubuntu:18.04 /bin/bash
# 容器退出时,docker会总是自动重启这个容器
--restart=always
# 容器非正常退出,自动重启容器,3是自动重启的次数。超过3此则不重启
--restart=on-failure:3
# 容器退出时总是重启,但是不考虑docker守护进程运行时就已经停止的容器
--restart=unless-stopped
# 默认值,容器退出时,docker不自动重启容器
--restart=no
进入已启动容器
# 进入已启动的容器
docker exec -it <容器ID> /bin/bash
启动、停止、重启
# 启动一个已停止的容器
docker start <容器ID>
# 停止运行中的容器
docker stop <容器ID>
# 停止全部运行中的容器
docker stop $(docker ps -q)
# 重启运行中的容器
docker restart <容器ID>
删除容器
# 强制删除指定容器
docker rm -f <容器ID>
# 强制删除所有容器
docker rm -f $(docker ps -aq)
容器日志
# 获取容器的日志,跟踪日志输出
docker logs -f <容器ID>
# 获取容器的日志,跟踪日志输出,显示时间戳
docker logs -ft <容器ID>
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
从容器创建镜像
docker commit -m="has update" -a="dockeruser" <容器ID> <镜像名>:<镜像标签>
# 参数说名
-m: 提交的描述信息
-a: 指定镜像作者
Dockerfile构建镜像
实例
1、创建一个 Dockerfile 文件
FROM ubuntu:18.04
MAINTAINER mghcool "mgh.cool"
Run apt update
RUN apt install nginx -y
EXPOSE 80
2、通过 docker build 命令来构建一个镜像
docker build -t dockeruser/centos:6.7 .
# 参数说明
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
指令详解
FORM
这里的 ubuntu:18.04 就是定制需要的基础镜像。后续的操作都是基于 ubuntu:18.04。
MAINTAINER
镜像维护者姓名或邮箱地址
RUN
构建镜像时运行的指令,有以下俩种格式:
RUN <命令行命令>
RUN ["可执行文件", "参数1", "参数2"]
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- RUN 是在 docker build
- CMD 在docker run 时运行
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 –entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
EXPOSE
EXPOSE是标记信息,不能直接打开端口,方便运维人员在使用容器时,知道要打开哪些端口。
使用run -P 而不是run -p时,会映射EXPOSE定义的容器端口到随机主机端口。
格式:
EXPOSE <端口1> <端口2>...
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY <源路径1>... <目标路径>
COPY "<源路径1>",... "<目标路径>"
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
注意:COPY指令如果是拷贝一个文件夹,那么只会拷贝文件夹的内容。
ADD
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
将镜像推送到DockerHub
首先登录DockerHub
# 输入账号密码登录
docker login
# 或者在命令里写入账号密码
docker login -u user -p passwd
接着推送镜像
docker push <注册用户名>/<镜像名>:<标签>
添加私有镜像仓库
修改/etc/docker/daemon.json
文件,添加以下内容
{
# 加速镜像地址
"registry-mirrors": ["http://mirrors.com"],
# 私服地址
"insecure-registries":["http://test.com"]
}
然后执行以下操作来应用更改
systemctl daemon-reload
systemctl restart docker
最后登录私有账号
docker login test.com -u user -p passwd
buildx构建多CPU架构的镜像
# 1、列出构建器
docker buildx ls
# 2、创建指定cpu架构构建器并使用,命名为mybuilder
docker buildx create --use --platform=linux/amd64,linux/arm64 --name mybuilder
# 删除构建器
docker buildx rm mybuilder
# 3、启动构建器
docker buildx inspect mybuilder --bootstrap
# 4、利用x86机器编译支持arm架构的docker镜像(只能在amd64的系统上运行)
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes before docker buildx create --use
# 5、构建多CPU架构的镜像,并推送到DockerHub
docker buildx build --platform linux/amd64,linux/arm64 -t myimage --push .
其他
从docker访问串口
Docker 1.2.0版(2014/08发布)添加了一个--device
标志,用于在没有--privileged
模式的情况下访问USB设备:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
docker run -t -i --privileged -v /dev/ttyUSB0:/dev/ttyUSB0 ubuntu bash