文章目录
1. 构建镜像
构建镜像类似于一台电脑的装机过程,添加文件、安装软件、配置环境…
例如构建一个 tomcat 10 镜像流程,就像在一台电脑上安装配置 tomcat 环境一样:
- 选择基础镜像 centos:8(相当于一台新电脑,只有操作系统)
- 添加 jdk 和 tomcat 文件
- 设置环境变量
- 设置开机启动 tomcat
下面来演示构建 tomcat 10 镜像的过程:
1.1 准备必要的文件
jdk 和 tomcat 10 的压缩文件放入一个文件夹中,这个文件夹不应该包含其他无关文件:
[/root/tomcat/]
- jdk-8u291-linux-x64.tar.gz
- apache-tomcat-10.0.6.tar.gz
1.2 Dockerfile
Dockerfile
类似于一个批处理文件,用来设置镜像的构建流程
在上一步的 tomcat 文件夹下创建 Dockerfile
文件:
[/root/tomcat/]
- jdk-8u291-linux-x64.tar.gz
- apache-tomcat-10.0.6.tar.gz
- Dockerfile
编辑 Dockerfile
文件
cd /root/tomcat
vim Dockerfile
在文件中添加以下内容:
# 选择基础镜像
FROM centos:8
# jdk 和 tomcat 文件添加到镜像的 /usr/local/ 目录下
# ADD 指令会自动解压文件
ADD jdk-8u291-linux-x64.tar.gz apache-tomcat-10.0.6.tar.gz /usr/local/
# 切换到镜像中指定的文件夹下
WORKDIR /usr/local/apache-tomcat-10.0.6/
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk1.8.0_291 \
CATALINA_HOME=/usr/local/apache-tomcat-10.0.6 \
PATH=/usr/local/jdk1.8.0_291/bin:/usr/local/apache-tomcat-10.0.6/bin:$PATH
# EXPOSE 8080 只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
# 这个声明有两个好处:
# 1.帮助镜像使用者理解这个镜像服务的端口,以方便配置映射
# 2.在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口(-P参数5.3 文件挂载及网络 会介绍)
EXPOSE 8080
# 设置启动命令
CMD ["catalina.sh", "run"]
Dockerfile
指令参考手册:https://docs.docker.com/engine/reference/builder/
1.3 执行构建
进入 tomcat 文件夹,并在当前文件夹下找到 Dockerfile
和其他需要的文件,来构建镜像:
cd /root/tomcat
# 使用当前文件夹中的 Dockerfile 文件进行构建
# -t 给新构建的镜像指定命名为 tomcat:10
# 构建路径设置为当前目录 ./
docker build -t tomcat:10 ./
查看构建结果:
docker images
docker history tomcat:10
docker inspect tomcat:10
1.4 启动容器
docker run -d --name cat1 -p 8080:8080 tomcat:10
docker ps -a
docker logs cat1
浏览器访问测试:http://192.168.64.150:8080
2.镜像
2.1 镜像的名称
镜像的名称由两部分组成:repository:tag
,其中的 tag
一般用来表示版本,默认的 tag
是 latest
,表示最近的版本。
镜像的名称相当于在镜像上贴的一个标签,在一个镜像上可以贴多个标签:
# 镜像可以起另一个名称,名称格式: repository:tag
# 默认的 tag 是 latest
docker tag redis redis:5012
# 查看镜像
# 可以看到同一个镜像(ID相同)可以有多个名称
docker images | grep redis
2.2 删除镜像名:
镜像的名称可以被删除,只有唯一的一个名称时会删除镜像:
docker rmi redis:5012
测试完成删除后,需要重新将其导入进来;
2.3 镜像的导入导出
导出镜像并压缩到压缩文件:
# 把两个镜像 redis:latest 和 centos:8 导出,并压缩到 imgs.gz
docker save redis centos:8 | gzip > imgs.gz
导入镜像:
docker load -i imgs.gz
3.从镜像运行启动容器
3.1 从镜像运行启动容器
从一个镜像可以运行启动一个或多个容器。
所谓容器,我们可以理解为是一个虚拟的计算机,其中运行着操作系统,操作系统中运行着我们部署的应用。
从 tomcat
镜像启动容器:
docker run tomcat
容器启动后在容器中运行了 tomcat 应用。
这样启动会占用命令行,可以用 ctrl+c
退出 tomcat
应用。当容器中没有任何应用运行时,容器也会自动关闭退出。
3.2 查看启动的容器
也可以使用docker ps -a
查看当前镜像启动的容器;
3.3 容器启动后运行的命令
容器启动后需要运行指定的命令来启动一个应用。
在镜像中指定的默认运行命令:
docker history tomcat
通过此命令来查看镜像的构建历史,其记录了此镜像是如何一步一步构建的过程;
在记录第一行我们可以看到,tomcat
镜像中设置的 CMD
指令指定了容器启动后默认运行的命令: catalina.sh run
。
再来看看其他镜像中设置的默认命令:
docker history redis
---------------------------------------------------------------------------------
[root@localhost ~]# docker history redis
IMAGE CREATED CREATED BY SIZE
bc8d70f9ef6c 3 weeks ago /bin/sh -c #(nop) CMD ["redis-server"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) EXPOSE 6379 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
docker history mariadb
---------------------------------------------------------------------------------
[root@localhost ~]# docker history mariadb
IMAGE CREATED CREATED BY SIZE
eff629089685 13 days ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 13 days ago /bin/sh -c #(nop) EXPOSE 3306 0B
<missing> 13 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
docker history centos:8
----------------------------------------------------------------------------------
[root@localhost ~]# docker history centos:8
IMAGE CREATED CREATED BY SIZE
300e315adb2f 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
3.4 ENTRYPOINT 和 CMD
这两向设置都是用来设置容器中运行的命令,即启动命令:
只设置 CMD
来执行 ls -a -l
:
CMD ["ls", "-a", "-l"]
只设置 CMD
是常见的用法。
用 ENTRYPOINT
和 CMD
两个一起设置来执行 ls -a -l
:
ENTRYPOINT ["ls"]
CMD ["-a", "-l"]
两项一起设置时,会把两项设置的内容连接起来作为一个完整的命令。
3.5 启动容器时覆盖 ENTRYPOINT 和 CMD
覆盖 CMD
:
以 tomcat
镜像为例,镜像中设置的默认命令是 catalina.sh run
,可以任意指定命令覆盖这个默认命令,这里执行 ls -a -l
来测试:
docker run tomcat ls -a -l
覆盖 ENTRYPOINT
:
--entrypoint
:设置运行的命令,不许写在镜像名称 tomcat
的前面。注意,这里不能添加命令的参数;
镜像名称 tomcat 后面的内容会覆盖 CMD
docker run --entrypoint ls tomcat -a -l
3.6 -d 后台运行
后台运行启动 tomcat
容器:
docker run -d tomcat
查看后台运行的容器:
# 只查看运行的容器
docker ps
# 查看所有容器,包括已停止的容器
docker ps -a
# 仅列出容器的 id
docker ps -q
# 仅列出运行容器的 id
docker ps -aq
查看容器的日志:
可以使用容器的名称或 id,使用id是允许至少写三位,能与其他id区分即可
docker logs 4d3
3.7 docker exec 进入容器,运行指定命令
绝大多数情况下一个容器中只运行一个应用。
容器中也允许运行启动多个应用,可以进入已经启动的容器, 在里面运行启动其他应用:
# 进入容器,运行指定的命令
docker exec -it 4d3 pwd
docker exec -it 4d3 touch f1.txt
docker exec -it 4d3 ls -l
# 启动 top 查看进程列表
# ctrl+c 可以退出top
docker exec -it 4d3 top
# 启动bash命令行
# exit 可以退出bash
# 启动bash命令后,此后执行的指令都是在容器中执行的
docker exec -it 4d3 bash
3.8 --name 和 --restart=always
--name
:
每个启动的容器都可以指定一个名称,方便使用名称来操作容器。
--restart=always
:
docker系统服务重启,或者操作系统重启,容器可以随系统自动启动。
# cat1容器可以随系统启动
docker run -d \
--name cat1 \
--restart=always \
tomcat
# cat2系统重启后默认是关闭状态,不会自动启动
docker run -d \
--name cat2 \
tomcat
# 查看容器
docker logs cat1
docker inspect cat1
# 重启docker系统服务
systemctl restart docker
# 查看容器,可以看到 cat1 自动重启了,而 cat2 处于关闭状态
docker ps -a
3.9 --rm 和 docker cp
--rm
:
有时候我们会临时使用一个容器之后这个容器就不再使用,添加 --rm
参数可以在容器停止时自动删除容器
docker cp
:
在容器和宿主机之间复制文件
下面来看一个实际的例子,这个例子中我们从 tomcat
的一个临时容器复制配置文件 server.xml
到宿主机,然后在 server.xml
中修改端口号,把 8080
改成 80
。
# 启动一个临时容器
docker run -d \
--rm \
--name tmp \
tomcat
# 把 tomcat 的 server.xml 复制到宿主机的 /root/ 目录下
docker cp tmp:/usr/local/tomcat/conf/server.xml /root/
# 停止临时容器,会自动删除
docker stop tmp
docker ps -a
# 修改 server.xml 中的8080端口,改成80
vim server.xml
# -v 把宿主机路径挂载到容器的一个路径
# 挂载的路径可以是文件,也可以是文件夹
# 这里把修改过的 server.xml 挂载到新启动的容器中
docker run -d \
--name cat2 \
-v /root/server.xml:/usr/local/tomcat/conf/server.xml \
tomcat
# 查看启动日志,确认使用 80 端口启动
docker logs cat2