Task02:Docker镜像与容器

Docker镜像与容器

一、Docker镜像

1、获取镜像【docker pull】

Docker Hub中有很多可以直接用的镜像,网址:https://hub.docker.com/search?q=&type=image

命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

其中选项:

地址的格式:<域名/IP>[:端口号],默认地址是 Docker Hub(docker.io)

仓库名:<用户名>/<软件名>,其中docker hub中用户名默认为Library

docker pull的实现步骤:用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地。示意图如下(来源:https://zhuanlan.zhihu.com/p/187505981):

此处以拉取Ubuntu18.04版本为例,输入命令

docker pull ubuntu:18.04

出现报错

no matching manifest for windows/amd64 10.0.18363 in the manifest list entries

解决方法:在设置中的docker engine中的experimental设置为true,即可成功拉取

2、列出镜像

docker image ls

3、删除镜像

$ docker image rm [选项] <镜像1> [<镜像2> ...]

其中可以镜像可以是镜像的短ID(id的前面几个字符)、镜像长ID镜像名镜像摘要

有时删除镜像时发生报错:Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container da38f2757b97 is using its referenced image 545e4e38d9db,表明现在有容器正在使用该镜像导致无法删除,将对应容器删除后即可删除。

查看所有容器:docker ps -a
删除所有容器:docker rm $(docker ps -a -q)

删除行为:Untagged、Deleted

一个镜像可能会有多个标签,删除镜像操作实际上是删除某个标签的镜像,执行命令后则取消了符合标准的镜像标签,这就是Untagged

但是可能删除时不会删除所有镜像标签,所以docker rm命令不一定会发生delete行为,只有镜像所有的标签取消,才会触发deleted

3、Dockerfile制作镜像

通过命令行创建文件并在文件中编写指令

其中,FROM 镜像名 可以指定一个镜像为基础,而如果指定镜像为scratch,则表示不以任何镜像为基础。

RUN指令是执行命令行的命令,有shell和exec两种格式,其中shell格式后接命令,而exec格式后接可执行文件。

镜像的层数是有最大限制的,没运行一个RUN指令即创建一层,所以要避免冗余的,若命令都是为了同一个目的,可以只用一层RUN执行,Shell类行尾添加 \ 命令进行换行,使用&&将各个所需命令串联。

每一层构建最后的时候需要清理掉无关的文件,比如下载、展开的文件,apt缓存文件等

此处实验的是教程中定制nginx镜像

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

编写好了dockerfile使用docker build构建镜像

docker build命令格式:docker build [选项] <上下文路径/URL/->
在Dockerfile文件所在的目录执行:docker build -t nginx:v3 .

需要注意的是,最后需要加 . ,否则会出现以下报错,.表示当前目录

docker build" requires exactly 1 argument.

构建镜像时,经常需要将一些本地文件复制进镜像,而docker build命令是在服务端构建镜像,所以构建时需要指定上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。Dockerfile中的COPY、ADD等指令便会在上下文目录找文件。

 

二、Docker容器

1、新建并启动容器

docer run命令参数:
-a stdin:** 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d:** 后台运行容器,并返回容器ID;
-i:** 以交互模式运行容器,通常与 -t 同时使用;
-P:** 随机端口映射,容器内部端口**随机**映射到主机的端口
-p:** 指定端口映射,格式为:**主机(宿主)端口:容器端口**
-t:** 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb":** 为容器指定一个名称;
--dns 8.8.8.8:** 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com:** 指定容器DNS搜索域名,默认和宿主一致;
-h "mars":** 指定容器的hostname;
-e username="ritchie":** 设置环境变量;
--env-file=[]:** 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2":** 绑定容器到指定CPU运行;
-m :**设置容器使用内存最大值;
--net="bridge":** 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]:** 添加链接到另一个容器;
--expose=[]:** 开放一个端口或一组端口;
--volume , -v 主机的文件夹:容器的文件夹** 绑定一个卷

使用-i -t可以进入交互模式

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

通过exit命令退出交互模式

2、其他一些命令

# 停止容器 id为容器的id
docker stop 'id'
# 启动容器 id为容器的id
docker start'id'
# 重启容器 id为容器的id
docker restart 'id'
# 删除容器 id为容器的id
docker rm 'id'
# 进入容器 id为容器的id
docker exec -it 'id' bash
#查看所有已经创建的包括终止状态的容器
docker container ls -a 
#清理所有处于终止状态容器
docker container prune
#导出本地容器
docker export 'id'
#从容器快照文件导入镜像
docker import 路径/镜像名 或指定URL/某个目录导入
#导入镜像存储文件到本地镜像库
docker load

容器快照文件会丢弃历史记录与元数据信息,仅保留容器快照状态。

镜像存储文件会保留完整记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值