Docker入门基础之镜像使用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。下面我们来学习:1、管理和使用本地 Docker 主机镜像2、创建镜像列出镜像列表我们可以使用 docker images 来列出存在于宿主机上的镜像。

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

下面我们来学习:

  • 1、管理和使用本地 Docker 主机镜像
  • 2、创建镜像

列出镜像列表
我们可以使用 docker images 来列出存在于宿主机上的镜像。

 root@ubuntu:~# docker images
 REPOSITORY         TAG        IMAGE ID     CREATED      SIZE
 alpine           latest      055936d39205   3 weeks ago    5.53MB
 mysql           5.7        7faa3c53e6d6   3 weeks ago    373MB
 ubuntu           15.04       d1b55fd07600   3 years ago    131MB
 ubuntu           16.04       2a697363a870   2 weeks ago    119MB

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有16.04、15.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

以相应的镜像启动容器
我们如果要使用版本为16.04的ubuntu系统镜像来运行容器时,命令如下:

 root@ubuntu:~# docker run -it ubuntu:16.04 sh

如果要使用版本为15.04的ubuntu系统镜像,则命令如下:

root@ubuntu:~# docker run -it ubuntu:15.04 sh

各个参数解析:

  • docker: Docker 的二进制执行文件。
  • run: 与前面的 docker 组合来运行一个容器。
  • -it: 其实是两个参数组成, -i 和 -t,-i:允许你对容器内的标准输入 (STDIN) 进行交互。-t:在新容器内指定一个伪终端或终端。
  • ubuntu:15.04指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • sh: 执行命令。

获取一个新镜像
当我们在宿主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。

 root@ubuntu:~# docker pull ubuntu:18.04
 18.04: Pulling from library/ubuntu
 6abc03819f3e: Pull complete
 05731e63f211: Pull complete
 0bd67c50d6be: Pull complete
 Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5
 Status: Downloaded newer image for ubuntu:18.04

下载完成后,我们可以直接使用这个镜像来运行容器。

查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否docker官方发布

拉取httpd镜像
我们决定使用上图中的httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。

root@ubuntu:~# docker pull httpd
 Using default tag: latest
 latest: Pulling from library/httpd
 743f2d6c1f65: Already exists
 c92eb69846a6: Pull complete
 2211b052800a: Pull complete
 aed180197314: Pull complete
 7c472a4980a7: Pull complete
 Digest: sha256:a35ad614c1ffc6fe931f12dc42b682edbdcc62cf78d8edc41499dd90ef0f8003
 Status: Downloaded newer image for httpd:latest

下载完成后,我们就可以使用这个镜像了。

创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1.从已经创建的容器中更新镜像,并且提交这个镜像
  • 2.使用 Dockerfile 指令来创建一个新的镜像

更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。

root@ubuntu:~# docker run -it ubuntu:16.04 sh

在运行的容器内使用 apt-get update 命令进行更新。

 # apt-get update
 Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
 Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]
 Get:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
 Get:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
 Get:5 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages [1558 kB]
 Get:6 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [844 kB]
 Get:7 http://archive.ubuntu.com/ubuntu xenial/restricted amd64 Packages [14.1 kB]
 Get:8 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages [9827 kB]
 Get:9 http://archive.ubuntu.com/ubuntu xenial/multiverse amd64 Packages [176 kB]
 Get:10 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [1237 kB]
 Get:11 http://security.ubuntu.com/ubuntu xenial-security/restricted amd64 Packages [12.7 kB]
 Get:12 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages [556 kB]
 Get:13 http://archive.ubuntu.com/ubuntu xenial-updates/restricted amd64 Packages [13.1 kB]
 Get:14 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [967 kB]
 Get:15 http://archive.ubuntu.com/ubuntu xenial-updates/multiverse amd64 Packages [19.1 kB]
 Get:16 http://archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages [7942 B]
 Get:17 http://archive.ubuntu.com/ubuntu xenial-backports/universe amd64 Packages [8532 B]
 Get:18 http://security.ubuntu.com/ubuntu xenial-security/multiverse amd64 Packages [6113 B]
 Fetched 15.8 MB in 8s (1933 kB/s)
 Reading package lists... Done

在完成操作之后,输入 exit命令来退出这个容器。

通过 docker ps -a 查看所有容器:

root@ubuntu:~# docker ps -a
 CONTAINER ID   IMAGE              COMMAND        CREATED      STATUS           PORTS          NAMES
 12847d9f5071   ubuntu:16.04           "sh"          2 minutes ago   Exited (0) 43 seconds ago               peaceful_edison
 3cec6f5e47c0   httpd              "httpd-foreground"   5 minutes ago   Exited (0) 5 minutes ago               vigilant_heisenberg

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

root@ubuntu:~# docker commit -m="has update" -a="yeqing112" 12847d9f5071 yeqing112/ubuntu:v2
sha256:5cce1167ee4c083ff9b87e61a58081805e76d015a12a4811bd152263aa013860

各个参数说明:

  • -m: 提交的描述信息。
  • -a: 指定镜像作者。
  • 12847d9f5071: 容器ID。
  • yeqing112/ubuntu:v2: 指定要创建的目标镜像名。

我们可以使用 docker images 命令来查看我们的新镜像 yeqing112/ubuntu:v2

root@ubuntu:~# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
yeqing112/ubuntu             v2                  5cce1167ee4c        2 minutes ago       144MB
ubuntu                       16.04               2a697363a870        2 weeks ago         119MB

从上面的信息中可以看到我们更新过的镜像,文件体积明显比之前大了一些。

构建镜像
除了上面更新镜像的方法,我们还可以使用命令 docker build , 从零开始来构建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

root@ubuntu:~# cat Dockerfile 
FROM    ubuntu:16.04
MAINTAINER      Fisher "service@urlos.com"

RUN     apt-get update

EXPOSE  22
EXPOSE  80

CMD     /bin/bash

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么

这里我们还是一样,执行一个 apt-get update 更新命令

然后,我们使用 Dockerfile 文件,通过 docker build -t yeqing112/ubuntu:v3 . 命令来构建一个新镜像。

root@ubuntu:~# root@ubuntu:/home# docker build -t yeqing112/ubuntu:v3 .
Sending build context to Docker daemon  422.4kB
Step 1/6 : FROM    ubuntu:16.04
 ---> 2a697363a870
Step 2/6 : MAINTAINER      Fisher "service@urlos.com"
 ---> Running in 92229e7a091a
Removing intermediate container 92229e7a091a
 ---> 9a89f4debc7d
Step 3/6 : RUN     apt-get update
 ---> Running in d709ef335784
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [107 kB]
Get:5 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [844 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages [1558 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial/restricted amd64 Packages [14.1 kB]
Get:8 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages [9827 kB]
Get:9 http://security.ubuntu.com/ubuntu xenial-security/restricted amd64 Packages [12.7 kB]
Get:10 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages [556 kB]
Get:11 http://archive.ubuntu.com/ubuntu xenial/multiverse amd64 Packages [176 kB]
Get:12 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [1237 kB]
Get:13 http://archive.ubuntu.com/ubuntu xenial-updates/restricted amd64 Packages [13.1 kB]
Get:14 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [967 kB]
Get:15 http://archive.ubuntu.com/ubuntu xenial-updates/multiverse amd64 Packages [19.1 kB]
Get:16 http://archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages [7942 B]
Get:17 http://archive.ubuntu.com/ubuntu xenial-backports/universe amd64 Packages [8532 B]
Get:18 http://security.ubuntu.com/ubuntu xenial-security/multiverse amd64 Packages [6113 B]
Fetched 15.8 MB in 5s (3051 kB/s)
Reading package lists...
Removing intermediate container d709ef335784
 ---> 540751496556
Step 4/6 : EXPOSE  22
 ---> Running in 9ae528bc083f
Removing intermediate container 9ae528bc083f
 ---> cfccc621a52d
Step 5/6 : EXPOSE  80
 ---> Running in efd88e9349c1
Removing intermediate container efd88e9349c1
 ---> 428cb5221a06
Step 6/6 : CMD     /bin/bash
 ---> Running in 2bc08b664f97
Removing intermediate container 2bc08b664f97
 ---> 9c55ea9b9ee8
Successfully built 9c55ea9b9ee8
Successfully tagged yeqing112/ubuntu:v3

参数说明:

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

构建成功后,使用 docker images 查看镜像:

root@ubuntu:~# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
yeqing112/ubuntu             v3                  9c55ea9b9ee8        9 seconds ago       144MB
yeqing112/ubuntu             v2                  5cce1167ee4c        16 minutes ago      144MB
ubuntu                       16.04               2a697363a870        2 weeks ago         119MB

由上面的信息看出,新的镜像v3与v2文件体积是一样的,两个镜像都只是执行了apt-get update

设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。

root@ubuntu:/home# docker tag 9c55ea9b9ee8 yeqing112/ubuntu:v3-1

docker tag 镜像ID,这里是 9c55ea9b9ee8,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为9c55ea9b9ee8的镜像多了一个v3-1的标签。

root@ubuntu:/home# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
yeqing112/ubuntu             v3                  9c55ea9b9ee8        21 minutes ago      144MB
yeqing112/ubuntu             v3-1                9c55ea9b9ee8        21 minutes ago      144MB
yeqing112/ubuntu             v2                  5cce1167ee4c        38 minutes ago      144MB
ubuntu                       16.04               2a697363a870        2 weeks ago         119MB
相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
115 2
|
1天前
|
Ubuntu NoSQL 关系型数据库
《docker基础篇:6.本地镜像发布到私有库》包括本地镜像发布到私有库流程、docker regisry是什么、将本地镜像推送到私有库
《docker基础篇:6.本地镜像发布到私有库》包括本地镜像发布到私有库流程、docker regisry是什么、将本地镜像推送到私有库
50 28
|
1月前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
20天前
|
Ubuntu 应用服务中间件 nginx
docker入门-快速学会docker
本文介绍了Docker的基本概念,包括镜像、容器、tar文件、Dockerfile和仓库,并通过实际操作演示了如何使用Docker。从拉取Nginx镜像、运行容器、修改容器内容、保存容器为新镜像,到使用Dockerfile构建自定义镜像,最后讲解了如何保存和恢复镜像。文中还推荐了一个在线实践平台Play with Docker,方便读者快速上手Docker。
77 5
docker入门-快速学会docker
|
20天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
44 3
docker push推送自己搭建的镜像
|
24天前
|
Docker 容器
|
1月前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
60 9
|
1月前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
51 4
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践

热门文章

最新文章