问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Docker基础 - 仓库,镜像,容器详解

创作时间:
作者:
@小白创作中心

Docker基础 - 仓库,镜像,容器详解

引用
1
来源
1.
https://pdai.tech/md/devops/docker/docker-03-basic2.html

Docker基础 - 仓库,镜像,容器详解

本文将从仓库,镜像,容器三个方面讲解常用的docker命令和使用等,对于开发而言这块使用的非常频繁,需要重点掌握。

仓库,镜像,容器的关系

我们再回顾下仓库,镜像,容器的关系(这是官网的图)

Docker 镜像

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

下面我们来学 1、管理和使用本地 Docker 主机镜像 2、创建镜像

镜像列表

我们可以使用 docker images 来列出本地主机上的镜像

docker images

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签, 同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

查找镜像

以查找MySQL的镜像为例:

  • 使用 docker search 命令来搜索镜像
docker search mysql
  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

拉取镜像

现在拉取搜索出的MySQL

docker pull mysql

删除镜像

是时候删除那个无聊的hello-world镜像了

docker rmi hello-world

发现报错了,这时候主要看两点:要么就是container实例存在,要么存在镜像依赖;

docker ps -a
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q )

显然,我们只要删除container即可:

docker rm c91b90b18884

最后再来删除镜像吧

docker rmi hello-world

更新镜像

针对上述ubuntu的镜像,我们能否在里面安装一些软件,然后重新生成一个镜像呢?这就是更新重新commit出一个新的镜像。
我们先跑一个ubuntu容器实例,同时在里面进行
apt-get update
更新

docker run -it ubuntu:latest

此时 ID 为 0a1556ca3c27 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本:

docker commit -m="update test" -a="pdai" 0a1556ca3c27  pdai/ubuntu:v1.0.1

可以看到已经生成成功, 且镜像的大小不一样了:

docker images

生成镜像

那如果是生成一个全新的镜像呢?我们使用命令 docker build ,通过创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
这里特意指定的Base镜像为上一步修改生成的
pdai/ubuntu:v1.0.1

FROM    pdai/ubuntu:v1.0.1
MAINTAINER      pdai "pdai.tech"
RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd pdai
RUN     /bin/echo 'pdai:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

稍微解释下:这一部分在开发中会用到比较多,所以单独一个章节详解:Docker基础 - dockerfile详解

  • 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
  • 第一条FROM,指定使用哪个镜像源
  • RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
  • 我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

接下来生成镜像:

docker build -t pdai/ubuntu:v2.0.1 .

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为a733d5a264b5

docker images

我们可以使用新的镜像来创建容器

docker run -it pdai/ubuntu:v2.0.1 /bin/bash

从上面看到新镜像已经包含我们创建的用户 pdai。

镜像标签

设置镜像的Tag,类似于Git中tag?我们可以使用 docker tag 命令,为镜像添加一个新的标签

docker tag a733d5a264b5 pdai/ubuntu:v3.0.1

注意:

  • docker tag 镜像ID,这里是 a733d5a264b5 ,用户名称、镜像源名(repository name)和新的标签名(tag)。
  • 使用 docker images 命令可以看到,ID为a733d5a264b5的镜像多一个v3.0.1标签。

镜像导出和导入

区别于容器的导出和导入

  • 镜像导出
docker save > pdai-ubuntu-v2.0.2.tar 57544a04cd1a
  • 镜像导入
docker load < pdai-ubuntu-v2.0.2.tar

其中
-i
或者
<
表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
可以依据具体使用场景来选择命令

  • 若是只想备份images,使用save、load即可
  • 若是在启动容器后,容器内容有变化,需要备份,则使用export、import

Docker 容器

上面已经展示了部分容器的使用命令了,这里会在此基础上进行拓展

容器启动

首先我们是可以这样启动容器的:

docker run -it pdai/ubuntu:v2.0.1 /bin/bash
  • -it 可以连写的,表示 -i -t
  • -t : 在新容器内指定一个伪终端或终端。
  • -i : 允许你对容器内的标准输入 (STDIN) 进行交互

容器查看

  • -a 表示 all,所有的
docker ps -a

容器再启动

我们看到,刚才
pdai/ubuntu:v2.0.1
的实例
f5332ebce695
已经停止了
Exited (0) 20 minutes ago
,我们能否再启这个实例?

docker start f5332ebce695

容器停止和重启

我们将上述容器停止,再重启

docker stop f5332ebce695
docker restart f5332ebce695

后台模式与进入

在使用 -d 参数时,容器启动后会进入后台, 如何进入容器呢?

  • 第一种:
    docker attach
docker attach f5332ebce695

看到没,使用
docker attach
进入后,exit便容器也停止了。

  • 第二种:
    docker exec
docker exec -it f5332ebce695 /bin/bash

注意:

  • 我特意在容器停止状态下执行了
    docker exec
    ,是让你看到
    docker exec
    是在容器启动状态下用的,且注意下错误信息;
  • 推荐大家使用
    docker exec
    命令,因为此退出容器终端,不会导致容器的停止。

容器导出和导入

在生产环境中,很多时候是无法连接外网的,所以有时候需要用到容器的导入和导出。

  • 容器的导出
docker export f5332ebce695 > ubuntu-pdai-v2.tar

同时你可以发现,导出容器的时候,容器无需关闭。

  • 容器导入
docker import ubuntu-pdai-v2.tar pdai/ubuntu:v2.0.2

注意看,SIZE可能是不一样的。

强制停止容器

能否强制删除一个正在运行的容器呢?
显然,加上
-f
之后是允许的。

docker rm -f f5332ebce695

清理停止的容器

我们看到上面还有好几个容器出于停止状态,能不能删除它们呢?

清理停止的容器:
docker container prune

docker container prune

容器别名及操作

我们上述对容器的操作都是针对容器ID,这个ID是随机的,能否添加一个name对我们自己设置的name操作呢?

docker run -itd --name pdai-ubuntu-202 pdai/ubuntu:v2.0.2 /bin/bash
docker stop pdai-ubuntu-202

容器错误日志

docker logs -f -t --tail 10 user-uat
docker logs -f -t --since="2018-02-08" --tail=100 user-uat
docker logs --since 30m user-uat
docker logs -t --since="2018-02-08T13:23:37" user-uat
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" user-uat
docker logs -f -t --since="2018-02-18" user-uat | grep error >> logs_error.txt

Docker 仓库

仓库(Repository)是集中存放镜像的地方,它和我们的Maven仓库是一样的。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。

  • 可以采用共有的仓库,也可以自己搭建Docker Registry;
  • 如果之前有自己的Artifactory或者Nexus,它们同样可以支持Docker Registry功能;
  • 带界面的也可以使用Harbor等;

公有仓库

我们以官方的docker hub为例,进行注册和理解。很多人会说官方的速度极慢或者私有仓库上传慢,不试试你怎么知道呢?

我注册的用户名是 realpdai

  • 本地登录刚才注册的账户
docker login
  • 镜像准备
docker tag pdai/ubuntu:v2.0.2 realpdai/ubuntu:v2.0.2
  • 推送至Docker Hub服务器
docker push realpdai/ubuntu:v2.0.2

从推送的速度来看,大概是1.5MB/s。

  • 服务器端查看

私有仓库

这里请参考后续的章节。
Docker基础 - 入门基础和HelloworldDocker基础 - 一个web应用实例

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号