规划
IP地址 | 主机名 | 节点 |
---|---|---|
192.168.200.40 | master | Docker节点 |
基础准备:安装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中的注释。
- 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构建镜像已完成。