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
5.2 列出镜像列表
1
docker images
- 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
- -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
如果不指定镜像的版本标签,例如只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
5.3 获取一个新的镜像
当在本地主机上使用一个不存在的镜像时, Docker会自动下载这个镜像。
使用 docker pull 命令可预先下载这个镜像。
1
docker run -i -t ubuntu:14.04 /bin/bash
5.4 查找镜像
如果需要某个镜像时,可以从 Docker Hub 网站搜索镜像。
Docker Hub 网址为: https://hub.docker.com/
也可以使用 docker search
命令搜索镜像。比如需要一个 httpd 镜像来用于构建 web 服务。可通过 docker search httpd
,从而找到适合的镜像。 其中,各字段含义如下:
- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
5.5 拖取镜像
使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载该镜像。
1
docker pull httpd
1
2
docker run -itd -P --name httpd_test httpd
docker ps -l
使用 docker run 启动 httpd 容器,通过 docker ps 可查看到 httpd 容器的 80 端口已映射给宿主机的 32768 端口。
双击桌面上的Chrome浏览器,c在地址栏中输入:localhost:32768,显示页面如下: 因此,httpd服务已顺利启动。
5.6 删除镜像
镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:
1
2
docker rmi hello-world
docker images
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
在容器19ee0a94ff82内使用 apt-get update
命令进行更新,然后使用 apt-get install gcc -y
安装 gcc 。 待安装命令执行完毕后,使用命令 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
- -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
5.9 构建镜像
接下来,使用命令 docker build , 从零开始构建一个新的镜像。
首先需要一个 Dockerfile 文件,其中包含一系列告诉 Docker 如何构建镜像的指令。
该Dockerfile文件位于 ./core/
,使用命令 cd 切换到该目录, 通过命令 cat 查看 Dockerfile 内容。 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源。
第二条MAINTAINER,说明当前镜像的维护人的信息。
RUN 指令用于说明在构建 docker 镜像时执行哪些命令,例如安装哪些软件。
EXPOSE 指令说明开放哪些端口。
然后,基于 Dockerfile 文件,通过 docker build 命令构建镜像。
1
docker build -t jiongjiong/ubuntu_gcc:v1.0 .
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用 docker images 查看创建的镜像
1
docker images
可见,该镜像已成功创建,镜像名称为: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
在容器中,编译和运行 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
5.10 设置镜像标签
可以使用 docker tag
命令,为镜像添加一个新的标签。
docker tag 命令的语法为:
docker tag <镜像ID>
新镜像名:新tag。
1
2
3
docker images
docker tag 03161c1ac130 jiongjiong/ubuntu_gcc:dev
docker images