文章

Docker实验三:Docker 镜像

Docker实验三:Docker 镜像

1 实验内容

  • 学习Docker镜像的常用命令。

2 实验要点

  • 掌握Docker镜像的常用命令。

3 实验环境

  • Windows10

4 注意事项

如果docker pull由于网络原因无法使用,可手动下载相关镜像并使用docker load命令直接加载相应的镜像。

5 实验内容

5.1 准备实验环境

打开终端,执行以下命令,拉取所需的镜像。

1
2
3
4
5
docker pull ubuntu
docker pull ubuntu:16.04
docker pull ubuntu:15.10
docker pull hello-world
docker pull training/webapp

image-20210923224957339

5.2 列出镜像列表

1
docker images

image-20210923224645581 各个选项说明:

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

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

所以,如果要使用版本为16.04的ubuntu系统镜像来运行容器时,命令如下:

1
docker run -i -t ubuntu:16.04 /bin/bash

image-20210923224903867 参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:16.04: 这是指用 ubuntu 16.04 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。 如果要使用版本为 15.10 的 ubuntu 系统镜像来运行容器时,命令如下:
1
docker run -i -t ubuntu:15.10 /bin/bash

image-20210923225129222 如果不指定镜像的版本标签,例如只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

5.3 获取一个新的镜像

当在本地主机上使用一个不存在的镜像时, Docker会自动下载这个镜像。

使用 docker pull 命令可预先下载这个镜像。

1
docker run -i -t ubuntu:14.04 /bin/bash

image-20210923225510357 直接运行不存在的镜像会自动下载并执行。

5.4 查找镜像

如果需要某个镜像时,可以从 Docker Hub 网站搜索镜像。

Docker Hub 网址为: https://hub.docker.com/

也可以使用 docker search 命令搜索镜像。比如需要一个 httpd 镜像来用于构建 web 服务。可通过 docker search httpd ,从而找到适合的镜像。 image-20210923225735309 其中,各字段含义如下:

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

5.5 拖取镜像

使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载该镜像。

1
docker pull httpd

image-20210923230035752 下载完成后,就可以使用该镜像了。

1
2
docker run -itd -P --name httpd_test httpd
docker ps -l

image-20210923230123295 使用 docker run 启动 httpd 容器,通过 docker ps 可查看到 httpd 容器的 80 端口已映射给宿主机的 32768 端口。

双击桌面上的Chrome浏览器,c在地址栏中输入:localhost:32768,显示页面如下: image-20210923230322886 image-20210923230448998 因此,httpd服务已顺利启动。

5.6 删除镜像

镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:

1
2
docker rmi hello-world
docker images

image-20210923230639672

5.7 创建镜像

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

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

5.8 更新镜像

假如现在需要在 ubuntu 16.04 镜像中使用 gcc 编译 C 源文件。

使用 ubuntu 16.04 创建一个新容器,在该容器内运行 gcc -v 可查看 gcc 是否安装。

1
2
docker run -i -t ubuntu:16.04 /bin/bash
gcc -v 

image-20210923230902882 可见,当前 gcc 并未安装。

在容器19ee0a94ff82内使用 apt-get update 命令进行更新,然后使用 apt-get install gcc -y 安装 gcc 。 image-20210923232258218 image-20210923232335933 待安装命令执行完毕后,使用命令 gcc -v 查看 gcc 的版本号。

完成这些操作之后,输入 exit 命令退出容器 19ee0a94ff82。

此时 容器 19ee0a94ff82 即为按我们的需求更改的容器。

在容器所运行的宿主机上通过命令 docker commit 基于更新后的容器生成新镜像。使用 docker images 命令来查看新镜像 cg/my_ubuntu:v2.0。

1
2
docker commit -m "gcc installed" -a "jiongjiong" 19ee0a94ff82 jiongjiong/ubuntu_gcc:v2.0
docker images

image-20210923232525466 各个参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • 19ee0a94ff82:容器 ID
  • jiongjiong/ubuntu_gcc:v2.0: 指定要创建的目标镜像名

接下来使用新镜像创建容器,使用 gcc 编译该 hello_world.c 文件,并运行编译后的二进制程序。

hello_world.c 文件位于 ./code/c_hello_world,首先使用 cd 命令进入该目录,在创建容器后,将 hello_world.c 文件通过 docker cp 命令拷贝到容器中。

具体操作过程如下:

1
2
3
4
5
6
7
8
docker run -itd --name ubuntu_gcc jiongjiong/ubuntu_gcc:v2.0
docker ps -l
docker cp ./code/c_hello_world/hello_world.c f5bcea22e2ca:/home
docker exec -it f5bcea22e2ca /bin/bash
cd home
ls -l 
gcc hello_world.c -o hello_world
./hello_world

image-20210924002450516 最后,使用 exit 退出容器。

5.9 构建镜像

接下来,使用命令 docker build , 从零开始构建一个新的镜像。

首先需要一个 Dockerfile 文件,其中包含一系列告诉 Docker 如何构建镜像的指令。

该Dockerfile文件位于 ./core/,使用命令 cd 切换到该目录, 通过命令 cat 查看 Dockerfile 内容。 image-20210924002933736 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

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

第二条MAINTAINER,说明当前镜像的维护人的信息。

RUN 指令用于说明在构建 docker 镜像时执行哪些命令,例如安装哪些软件。

EXPOSE 指令说明开放哪些端口。

然后,基于 Dockerfile 文件,通过 docker build 命令构建镜像。

1
docker build -t jiongjiong/ubuntu_gcc:v1.0 .

image-20210924004425548 参数说明:

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

使用 docker images 查看创建的镜像

1
docker images

image-20210924004511114 可见,该镜像已成功创建,镜像名称为:jiongjiong/ubuntu_gcc,镜像ID为:03161c1ac130。

接下来,使用新的镜像创建容器

1
2
3
4
docker run -itd jiongjiong/ubuntu_gcc:v1.0 
docker ps -l
docker exec -it fd5463368ea5 /bin/bash
id jiongjiong

image-20210924004946653 从上面看到新镜像已经包含新创建的用户 cg 。

在容器中,编译和运行 hello_world.c 文件。

1
2
3
4
5
6
7
8
cd ./code/c_hello_world
ls -l
docker cp hello_world.c fd5463368ea5:/tmp
docker exec -it fd5463368ea5 /bin/bash
cd /tmp
ls -l
gcc hello_world.c -o hello_world
./hello_world 

image-20210924005949452

5.10 设置镜像标签

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

docker tag 命令的语法为:

docker tag <镜像ID> 新镜像名:新tag。

1
2
3
docker images
docker tag 03161c1ac130 jiongjiong/ubuntu_gcc:dev
docker images

image-20210924010211079 使用 docker images 命令可以看到,ID为 03161c1ac130 的镜像多一个标签dev。

本文由作者按照 CC BY 4.0 进行授权