Docker镜像和容器的使用(初级)

规划

IP地址主机名节点
192.168.200.40masterDocker节点

基础准备:安装docker-ce

镜像的基本管理和使用

查看镜像列表

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

[root@master ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
httpd                        latest              d3017f59d5e2        2 years ago         165MB
busybox                      latest              020584afccce        2 years ago         1.22MB
nginx                        latest              540a289bab6c        2 years ago         126MB
redis                        alpine              6f63d037b592        2 years ago         29.3MB
python                       3.7-alpine          b11d2a09763f        2 years ago         98.8MB
<none>                       <none>              4cda95efb0e4        2 years ago         80.6MB
centos                       latest              0f3e07c0138f        2 years ago         220MB
192.168.200.40:5000/centos   latest              0f3e07c0138f        2 years ago         220MB
registry                     latest              f32a97de94e1        3 years ago         25.8MB
swarm                        latest              ff454b4a0e84        4 years ago         12.7MB
httpd                        2.2.32              c51e86ea30d1        5 years ago         171MB
httpd                        2.2.31              c8a7fb36e3ab        5 years ago         170MB

各个选项的说明:

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

同一仓库源可以有多个TAG,代表这个仓库源的不同个版本。例如http仓库源里有2.2.31、2.2.32等多个不同的版本,可以使用REPOSITORY:TAG命令来定义不同的镜像。
例如,要使用版本为2.2.31的http镜像来运行容器,命令如下:

[root@master ~]# docker run -i -t -d httpd:2.2.31 /bin/bash
00da2034585c6a771359c4e55a1b62c9196947fcb523898426fc18e868381f5b

参数说明:

  • -i:交互式操作
  • -t:终端
  • -d:后台运行
  • httpd:2.2.31:镜像名,使用httpd:2.2.31镜像为基础来启动容器
  • /bin/bash:容器交互式shell

如果要使用版本为2.2.32的http镜像来运行容器时,命令如下:

[root@master ~]# docker run -i -t -d httpd:2.2.32 /bin/bash
1791ee50dafdae51341bf9d6ef09ac1016d242445afd2d0e1c1d3ba06b194c74

如果不指定镜像的版本标签,则默认使用latest标签的镜像。

获取镜像

当本地主机上使用一个不存在的镜像时,Docker会自动下载这个镜像。如果需要预先下载这个镜像,可以使用docker pull命令来下载,语法如下:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS说明:

  • -a:拉取所有tagged镜像。
  • –disable-content-trust:忽略镜像的校验,默认开启。

查找镜像

查找镜像一般有两种方式,可以通过Docker Hub(https://hub.docker.com/)网站来搜索镜像,也可以使用docker search命令来搜索镜像。其语法如下:

docker search [OPTIONS] TERM

OPTIONS说明:

  • –automated:只列出automated build类型的镜像。
  • –no-trunc:显示完整的镜像描述。
  • –filter=stars:列出收藏数不小于指定值的镜像。

例如,需要一个httpd镜像作Web服务时,可以使用docker search命令搜索httpd来寻找适合的镜像。

[root@master ~]# docker search --filter=stars=10 httpd
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                     The Apache HTTP Server Project                  4061                [OK]                
centos/httpd-24-centos7   Platform for running Apache httpd 2.4 or bui…   44                                      
centos/httpd                                                              35                                      [OK]

参数说明:

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

删除镜像

镜像删除使用docker rmi命令,语法如下:

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS说明:

  • -f:强制删除。
  • –no-prune:不移除该镜像的过程镜像,默认移除。

例如,强制删除本地镜像busybox:

[root@master ~]# docker rmi -f busybox:latest
Untagged: busybox:latest
Deleted: sha256:020584afccce44678ec82676db80f68d50ea5c766b6e9d9601f7b5fc86dfb96d
Deleted: sha256:1da8e4c8d30765bea127dc2f11a17bc723b59480f4ab5292edb00eb8eb1d96b1

容器的基本管理和使用

运行容器

运行第一个容器,执行以下命令:

[root@master ~]# docker run -it --rm -d -p 80:80 nginx:latest
fb3d935052e02dd96079bfdcabeea4ecd72f9fbed0ec4ed6900c90e63b33ccc7

参数说明:

  • -i:交互式操作。
  • -t:终端。
  • -rm:容器退出后随之将其删除,可以避免浪费空间。
  • -p:端口映射。
  • -d:容器在后台运行。

其过程可以简单的描述为:
① 下载Nginx镜像。
② 启动容器,并将容器的80端口映射到宿主机的80端口。
当使用docker run来创建容器时,Docker在后台运行的标准流程如下:
① 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
② 利用镜像创建并启动一个容器。
③ 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
④ 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
⑤ 从地址池配置一个IP地址给容器。
⑥ 执行用户指定的应用程序。

接下来可以通过浏览器验证容器是否正常工作。在浏览器中输入地址http://host_IP,如下图所示:
在这里插入图片描述启动容器的语法如下:

docker start [CONTAINER ID]

例如,启动所有的Docker容器:

docker start $(docker ps -aq)

操作容器

列出运行中的容器。

# docker ps
# docker container ls

列出所有容器(包含终止状态)。

# docker ps -a

查看具体容器的信息。

# docker inspect [container ID or NAMES]

查看容器的使用资源状况。

# docker stats [container ID or NAMES]

查看容器日志。

# docker logs [OPTIONS] [container ID or NAMES]

OPTIONS说明:

  • –details:显示更多的信息。
  • -f,–follow:跟踪实时日志。
  • –sincestring:显示自某个timestamp之后的日志,或相对时间,如42分钟。
  • –tailstring:从日志末尾显示多少行日志,默认是all。
  • -t,–timestamps:显示时间戳。
  • –until string:显示自某个timestamp之前的日志,或相对时间,如42分钟。

进入容器。

# docker exec -it [CONTAINER ID] bash

进入容器后,输入exit或者按Crtl+C键即可退出容器,示例代码如下:

[root@master ~]# docker exec -it fb3d935052e0 bash
root@fb3d935052e0:/# exit
exit
[root@master ~]# 

终止容器

删除终止状态的容器。

# docker rm [CONTAINER ID]

删除所有处于终止状态的容器。

# docker container prune

删除未被使用的数据卷。

# docker volume prune

删除运行中的容器。

# docker rm -f [CONTAINER ID]

批量停止所有的容器。

# docker stop $(docker ps -aq)

批量删除所有的容器。

# docker rm $(docker ps -aq)

终止容器进程,容器进入终止状态。

# docker container stop [CONTAINER ID] 

导入和导出容器

将容器快照导出为本地文件,语法如下:

# docker export [CONTAINER ID] > [tar file]

例如:

[root@master ~]# docker export fb3d935052e0 >nginx.tar
[root@master ~]# ll nginx.tar 
-rw-r--r-- 1 root root 128326656 Jun 28 17:57 nginx.tar

同样的,也可以把容器快照文件再导入为镜像,语法如下:

[root@master ~]# cat nginx.tar |docker import - nginx:test
sha256:e2f7f29bf587c8d325997732e71ff26634e34330e5f88721a756aad7e4594d87
[root@master ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
nginx                        test                e2f7f29bf587        6 seconds ago       125MB
httpd                        latest              d3017f59d5e2        2 years ago         165MB
nginx                        latest              540a289bab6c        2 years ago         126MB
redis                        alpine              6f63d037b592        2 years ago         29.3MB
python                       3.7-alpine          b11d2a09763f        2 years ago         98.8MB
<none>                       <none>              4cda95efb0e4        2 years ago         80.6MB
192.168.200.40:5000/centos   latest              0f3e07c0138f        2 years ago         220MB
centos                       latest              0f3e07c0138f        2 years ago         220MB
registry                     latest              f32a97de94e1        3 years ago         25.8MB
swarm                        latest              ff454b4a0e84        4 years ago         12.7MB
httpd                        2.2.32              c51e86ea30d1        5 years ago         171MB
httpd                        2.2.31              c8a7fb36e3ab        5 years ago         170MB

使用docker import命令导入一个容器快照到本地镜像库时,将丢弃所有的历史记录和元数据信息,即仅保存容器当时的快照状态。

构建自定义镜像

docker commit

docker commit命令用于从容器创建一个新的镜像,其语法如下:

# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

  • -a:提交的镜像作者。
  • -c:使用Dockerfile指令来创建镜像。
  • -m:提交时的说明文字。
  • -p:在commit时,将容器暂停。

查看已有的容器。

[root@master ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
fb3d935052e0        nginx:latest        "nginx -g 'daemon of…"   26 minutes ago      Up 26 minutes       0.0.0.0:80->80/tcp       hungry_morse
5e70c25de4a2        registry:latest     "/entrypoint.sh /etc…"   3 days ago          Up 2 hours          0.0.0.0:5000->5000/tcp   registry

将容器fb3d935052e0保存为新的镜像,并添加提交人信息和说明信息。

[root@master ~]# docker commit -a "xiaoming" -m "nginx-test" fb3d935052e0 nginx:v1
sha256:7009ea072f66dcfbf1284ea1c5ca3c22d3b10c3c2318a590dc31d2fd15b9de1c

构建完成后查看构建结果。

[root@master ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
nginx                        v1                  7009ea072f66        6 seconds ago       126MB
nginx                        test                e2f7f29bf587        5 minutes ago       125MB
httpd                        latest              d3017f59d5e2        2 years ago         165MB
nginx                        latest              540a289bab6c        2 years ago         126MB
redis                        alpine              6f63d037b592        2 years ago         29.3MB
python                       3.7-alpine          b11d2a09763f        2 years ago         98.8MB
<none>                       <none>              4cda95efb0e4        2 years ago         80.6MB
192.168.200.40:5000/centos   latest              0f3e07c0138f        2 years ago         220MB
centos                       latest              0f3e07c0138f        2 years ago         220MB
registry                     latest              f32a97de94e1        3 years ago         25.8MB
swarm                        latest              ff454b4a0e84        4 years ago         12.7MB
httpd                        2.2.32              c51e86ea30d1        5 years ago         171MB
httpd                        2.2.31              c8a7fb36e3ab        5 years ago         170MB

使用docker commit命令构建的镜像,除了制定镜像的人知道执行过什么命令,怎么生成的镜像,别人根本无从得知。建议使用Dockerfile来制作镜像,镜像的生成过程是透明的, docker commit可用于被入侵后保存现场等操作。

dockerfile

Dockerfile是一个文本文档,其中包含了组合映像的命令,可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile,其语法如下:

# docker build -f /path/to/a/Dockerfile

Dockerfile一般分为4部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,“#”为Dockerfile中的注释。

Dockerfile主要指令如下:

  • FROM:指定基础镜像,必须为第一个命令。
  • MAINTAINER:维护者信息。
  • RUN:构建镜像时执行的命令。
  • ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
  • COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。
  • CMD:构建容器后调用,也就是在容器启动时才进行调用。
  • ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去“application”,只使用参数。
  • LABEL:用于为镜像添加元数据。
  • ENV:设置环境变量。
  • EXPOSE:指定与外界交互的端口。
  • VOLUME:用于指定持久化目录。
  • WORKDIR:工作目录,类似于cd命令。
  • USER:指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可通过该命令指定运行用户。
  • ARG:用于指定传递给构建运行时的变量。
  • ONBUILD:用于设置镜像触发器。

接下来以centos:latest为基础镜像,安装jdk1.8并构建新的镜像centos-jdk。
新建文件夹用于存放JDK安装包和Dockerfile文件。

[root@master ~]# mkdir centos-jdk
[root@master ~]# mv jdk/jdk-8u141-linux-x64.tar.gz ./centos-jdk/ 
[root@master ~]# cd centos-jdk/

编写Dockerfile。

[root@master centos-jdk]# cat Dockerfile 
#Centos with JDK8
#AUthor XiaoMing
# 指定基础镜像
FROM centos
# 指定作者
MAINTAINER XiaoMing
# 新建文件夹用于存放jdk文件
RUN mkdir /usr/local/java
# 将JDK文件复制到镜像内并自动解压
ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/
# 创建软连接
RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH

使用docker build命令构建新镜像。(-t指定镜像名字和标签)

[root@master centos-jdk]# docker build -t="centos-jdk" .
Sending build context to Docker daemon  185.5MB
Step 1/9 : FROM centos
 ---> 0f3e07c0138f
Step 2/9 : MAINTAINER XiaoMing
 ---> Running in 4694c94fac8e
Removing intermediate container 4694c94fac8e
 ---> 799ed3f24d74
Step 3/9 : RUN mkdir /usr/local/java
 ---> Running in 330fee97c91b
Removing intermediate container 330fee97c91b
 ---> 8df432096586
Step 4/9 : ADD jdk-8u141-linux-x64.tar.gz /usr/local/java/
 ---> f6634da90146
Step 5/9 : RUN ln -s /usr/local/java/jdk1.8.0_141 /usr/local/java/jdk
 ---> Running in 473845e4bed1
Removing intermediate container 473845e4bed1
 ---> 3bc03cc678d4
Step 6/9 : ENV JAVA_HOME /usr/local/java/jdk
 ---> Running in dddc46bebe57
Removing intermediate container dddc46bebe57
 ---> 864d6bbb88e1
Step 7/9 : ENV JRE_HOME ${JAVA_HOME}/jre
 ---> Running in 2817ac7fb9a7
Removing intermediate container 2817ac7fb9a7
 ---> d04fddc1fd06
Step 8/9 : ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
 ---> Running in 95a2d728d3a9
Removing intermediate container 95a2d728d3a9
 ---> d7bf712da26a
Step 9/9 : ENV PATH ${JAVA_HOME}/bin:$PATH
 ---> Running in 224c79163f69
Removing intermediate container 224c79163f69
 ---> b3bcc384d28a
Successfully built b3bcc384d28a
Successfully tagged centos-jdk:latest

查看构建的新镜像

[root@master centos-jdk]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
centos-jdk                   latest              b3bcc384d28a        4 minutes ago       596MB

使用新构建的镜像运行容器验证JDK是否安装成功。

[root@master centos-jdk]# docker run -it centos-jdk /bin/bash
[root@9abd145ca72c /]# java -version
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
[root@9abd145ca72c /]# 

可以发现JDK已经安装成功了,至此,使用Dockerfile构建镜像已完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值