Linux容器篇-Docker镜像的使用


前言

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


一、列出镜像列表

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

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
test/ubuntu   v1        f67ec2cf1908   2 days ago    72.8MB
ubuntu        latest    ba6acccedd29   2 years ago   72.8MB

各个选项说明:

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

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

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

[root@localhost ~]# docker run -i -t ubuntu:18.04 /bin/bash
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
284055322776: Pull complete 
Digest: sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6
Status: Downloaded newer image for ubuntu:18.04
root@6e5bc8f53b89:/# 

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:18.04: 这是指用 ubuntu 18.04 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

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

二、获取一个新镜像

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

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
test/ubuntu   v1        f67ec2cf1908   2 days ago    72.8MB
ubuntu        latest    ba6acccedd29   2 years ago   72.8MB
ubuntu        18.04     5a214d77f5d7   2 years ago   63.1MB

[root@localhost ~]# docker pull ubuntu:20.04
20.04: Pulling from library/ubuntu
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
test/ubuntu   v1        f67ec2cf1908   2 days ago    72.8MB
ubuntu        20.04     ba6acccedd29   2 years ago   72.8MB
ubuntu        latest    ba6acccedd29   2 years ago   72.8MB
ubuntu        18.04     5a214d77f5d7   2 years ago   63.1MB

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

三、查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/,国内可能会因为网络的原因无法访问,这也是正常的。

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

[root@localhost ~]# docker search nginx
NAME                               DESCRIPTION                                     STARS     OFFICIAL
nginx                              Official build of Nginx.                        19975     [OK]
unit                               Official build of NGINX Unit: Universal Web …   32        [OK]
nginx/nginx-ingress                NGINX and  NGINX Plus Ingress Controllers fo…   92        
nginxinc/nginx-unprivileged        Unprivileged NGINX Dockerfiles                  152       
nginx/nginx-prometheus-exporter    NGINX Prometheus Exporter for NGINX and NGIN…   42        
nginx/unit                         This repository is retired, use the Docker o…   63        
nginx/nginx-ingress-operator       NGINX Ingress Operator for NGINX and NGINX P…   2         
nginxinc/nginx-s3-gateway          Authenticating and caching gateway based on …   6         
nginx/nginx-quic-qns               NGINX QUIC interop                              1         
nginxinc/amplify-agent             NGINX Amplify Agent docker repository           1         
nginxproxy/nginx-proxy             Automated nginx proxy for Docker containers …   140       
nginxinc/ingress-demo              Ingress Demo                                    4         
nginx/unit-preview                 Unit preview features                           0         
nginxproxy/acme-companion          Automated ACME SSL certificate generation fo…   134       
bitnami/nginx                      Bitnami container image for NGINX               190       
ubuntu/nginx                       Nginx, a high-performance reverse proxy & we…   114       
nginxproxy/docker-gen              Generate files from docker container meta-da…   17        
nginxinc/mra-fakes3                                                                0         
kasmweb/nginx                      An Nginx image based off nginx:alpine and in…   8         
nginxinc/ngx-rust-tool                                                             0         
nginxinc/mra_python_base                                                           0         
bitnami/nginx-ingress-controller   Bitnami container image for NGINX Ingress Co…   34        
bitnami/nginx-exporter             Bitnami container image for NGINX Exporter      5         
rancher/nginx                                                                      2
  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

四、拉取镜像

我们决定使用上面的 nginx 官方版本的镜像,使用命令 docker pull 来下载镜像。

[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

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

[root@localhost ~]# docker run nginx

五、删除镜像

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

[root@localhost ~]# docker rmi nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Deleted: sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85

-f 强制删除

六、创建镜像

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

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

1、更新镜像

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

[root@localhost ~]# docker run -it ubuntu:18.04 /bin/bash
root@851650e41f41:/# 

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

root@851650e41f41:/# apt-get update 
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [102 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [23.8 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [102 kB]
Get:5 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [1688 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [102 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB] 
Get:8 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]     
Get:9 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]          
Get:10 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [3373 kB]   
Get:11 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1637 kB]
Get:12 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]                                                                                                                                                               
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [1728 kB]                                                                                                                                                       
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [3786 kB]                                                                                                                                                             
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [30.8 kB]                                                                                                                                                       
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [2411 kB]                                                                                                                                                         
Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [64.0 kB]                                                                                                                                                           
Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [20.6 kB]                                                                                                                                                       
Fetched 28.2 MB in 8s (3357 kB/s)                                                                                                                                                                                                                
Reading package lists... Done

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

root@851650e41f41:/# exit
exit
[root@localhost ~]#

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

[root@localhost ~]# docker commit -m "already update" -a="Logan"  851650e41f41 Logan/ubuntu:v2
sha256:aac24c1bc19d27ccc4da2f1652625a1e1169ff8af718293746c43d4558adee8a
[root@localhost ~]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED         SIZE
Logan/ubuntu   v2        aac24c1bc19d   3 seconds ago   109MB
test/ubuntu    v1        f67ec2cf1908   2 days ago      72.8MB
ubuntu         20.04     ba6acccedd29   2 years ago     72.8MB
ubuntu         latest    ba6acccedd29   2 years ago     72.8MB
ubuntu         18.04     5a214d77f5d7   2 years ago     63.1MB

各个参数说明:

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

2、构建镜像

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

关键字

FROM         # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER   # 镜像维护者的姓名混合邮箱地址
RUN          # 容器构建时需要运行的命令
EXPOSE       # 当前容器对外保留出的端口
WORKDIR      # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV          # 用来在构建镜像过程中设置环境变量
ADD          # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY         # 类似ADD,拷贝文件和目录到镜像中!
VOLUME       # 容器数据卷,用于数据保存和持久化工作
CMD          # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT   # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD      # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

编写一个Dockerfile,如下示例:

[root@localhost ~]# cat Dockerfile 
FROM centos:6.7
MAINTAINER logan
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN useradd admin
RUN     /bin/echo 'admin:123456' |chpasswd
EXPOSE 80

CMD echo $MYPATH
CMD echo "---Hello wokld!---"
CMD /bin/bash

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

[root@localhost ~]# docker build -f Dockerfile -t mycentos:v1.0 .
[+] Building 16.0s (8/8) FINISHED                                                                                                                                                                                                  docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                         0.0s
 => => transferring dockerfile: 243B                                                                                                                                                                                                         0.0s
 => [internal] load metadata for docker.io/library/centos:6.7                                                                                                                                                                               15.2s
 => [internal] load .dockerignore                                                                                                                                                                                                            0.0s
 => => transferring context: 2B                                                                                                                                                                                                              0.0s
 => [1/4] FROM docker.io/library/centos:6.7@sha256:4c952fc7d30ed134109c769387313ab864711d1bd8b4660017f9d27243622df1                                                                                                                          0.0s
 => CACHED [2/4] WORKDIR /usr/local                                                                                                                                                                                                          0.0s
 => [3/4] RUN useradd admin                                                                                                                                                                                                                  0.2s
 => [4/4] RUN     /bin/echo 'admin:123456' |chpasswd                                                                                                                                                                                         0.2s
 => exporting to image                                                                                                                                                                                                                       0.2s
 => => exporting layers                                                                                                                                                                                                                      0.1s
 => => writing image sha256:81ee6a7ca5774eac3c684e221ca8942b497d5c6abdb8759099c9de747c5c2161                                                                                                                                                 0.0s
 => => naming to docker.io/library/mycentos:v1.0                                                                                                                                                                                             0.0s
[root@localhost ~]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
mycentos       v1.0      81ee6a7ca577   10 seconds ago   191MB

参数说明:

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

七、设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

[root@localhost ~]# docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
mycentos       v1.0      81ee6a7ca577   4 minutes ago    191MB
[root@localhost ~]# 
[root@localhost ~]# docker tag 81ee6a7ca577 logan/centos76:v2.0
[root@localhost ~]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
mycentos         v1.0      81ee6a7ca577   6 minutes ago    191MB
logan/centos76   v2.0      81ee6a7ca577   6 minutes ago    191MB
[root@localhost ~]# 

总结

随手写写,没有总结,觉得对你有帮助,可以点个赞,不喜欢直接划走。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秣宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值