Linux中的Docker安装
查看官网教程,找到doc中的download选择linux,centOS8
具体可参考另一篇文章Linux中的软件安装——Docker
底层原理
Docker是如何工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令
Docker为什么比VM快?
1.Docker有着比虚拟机更少的抽象层。
2.Docker利用的是宿主机的内核,VM使用的是Guest OS。
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级别!
Docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,镜像和容器的数量
docker 命令 --help #万能命令
镜像命令
docker images
类似:docker image ls
常用的选项
-a #列出所有镜像
-q #只显示镜像的id
示例:查看所有本地的主机上的镜像
[root@hadoop666 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 11 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
[root@hadoop666 ~]# docker images --help
# 命令的使用语法格式
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
# 可选项
docker search
常用的选项
-s 后面跟收藏数,列出不小于指定值的镜像
示例:搜索镜像
[root@hadoop666 ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10247 [OK]
# 可选项,通过收藏数来过滤
--filter=STARS=5000
docker pull
下载镜像
# 下载镜像 docker pull 镜像名[:tag]
#如果不写tag,默认就是latest
#分层下载,docker image的核心 联合文件系统
# 签名,防伪信息
#真实地址
docker rmi
删除镜像
# 镜像名后不写tag默认就是latest
docker rmi -f 指定镜像id/名字 #删除指定镜像可以是id或名字
docker rmi -f 指定镜像id/名字 指定镜像id/名字 指定镜像id/名字 #删除多个id
docker rmi -f $(docker images -qa) #递归删除所有的镜像
docker inspect
查看镜像详情
docker [image] inspect 镜像name或id
容器命令
说明:有了镜像才可以创建容器
docker pull centos
docker run
docker container run
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p(小写) 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-P(大写) 随机指定端口
测试,启动并进入容器
docker run -it centos /bin/bash
ls #查看容器内的centos,基础版本,很多命令都是不完善的
exit退出容器
exit #直接停止容器并退出
Ctrl+P+Q #退出但容器不停止
docker container exec -it 容器id bash #将终端重新连接到Docker
docker ps
类似:docker container ls
列出所有的运行容器
# docker ps命令
#列出当前正在运行的容器
-a #列出当前正在运行的容器+带出历史运行过的容器
-l #显示最近创建的容器
-n=? #显示最近创建的容器
-q #只显示容器的编号
# docker container ls #列出当前正在运行的容器
已经进入容器中,则可以通过ps -elf来查看当前容器的进程
docker rm
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
# 删除容器最好还是分两步,先停止,后删除
# 这样给容器中运行的进程一个停止运行并清理残留数据的机会
docker image prune #移除全部的悬虚镜像(再添加-a参数,会额外移除没有被使用的镜像)
start、restart、stop、kill
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
容器其它重要命令
启动守护式容器
docker run -d 容器ID或容器名
# 当前台没有任何进程时,就会自动退出
# 所以此时使用docker ps查看不到任何正在运行的进程
查看容器内运行的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
# 以json字符串的形式返回相关信息
进入正在运行的容器并以命令行交互
docker attach 容器ID
docker exec -it 容器ID [/bin/bash] #默认就是/bin/bash方式进行交互
# 二者的区别
# attach:直接进入容器启动命令的终端,不会启动新的进程
# exec:在容器中打开新的终端,并且可以启动新的进程
从容器中拷贝文件到主机
docker cp 容器ID:容器内路径 目的主机路径
容器数据卷
是什么
类似于redis中的rdb和aof文件
能干嘛
容器持久化
容器间继承+共享数据
数据卷
直接命令添加
- 执行命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer 镜像名
# 示例
# 之前未使用命令的时候,查看主机中根目录下所有文件夹
[root@hadoop666 /]# ls
bin dev home lib64 mnt opt root sbin sys usr
boot etc lib media proc run srv tmp var
# 使用此命令之后,容器中根目录下创建dataVolumeContainer文件夹
# 并且在宿主机中根目录下新建myDataVolume文件夹
[root@hadoop666 ~]# docker run -it -v /myDataVolume:/dataVolumeContainer centos
[root@7b0325dede02 /]# ls
bin dev home lib64 media opt root sbin sys usr
dataVolumeContainer etc lib lost+found mnt proc run srv tmp var
[root@hadoop666 /]# ls
bin dev home lib64 mnt opt root sbin sys usr
boot etc lib media myDataVolume proc run srv tmp var
- 查看数据卷是否挂载成功
# 先使用docker ps查看当前容器的ID
docker ps
# 使用docker inspect 容器ID 以json格式返回容器相关的信息
docker inspect 7b0325dede02
- 容器与宿主机之间数据共享
# 先在宿主机中进行新建文件host.txt
[root@hadoop666 /]# cd myDataVolume/
[root@hadoop666 myDataVolume]# touch host.txt
# 再到容器中查看
[root@7b0325dede02 /]# cd dataVolumeContainer/
[root@7b0325dede02 dataVolumeContainer]# ls
host.txt
# 在容器中进行host.txt修改,以及新建一个container.txt
[root@7b0325dede02 dataVolumeContainer]# vim host.txt
bash: vim: command not found
# 精简版的centos没有vim,所以使用vi进行编辑
[root@7b0325dede02 dataVolumeContainer]# vi host.txt
[root@7b0325dede02 dataVolumeContainer]# touch container.txt
# 再到宿主机中进行查看
[root@hadoop666 myDataVolume]# ls
container.txt host.txt
[root@hadoop666 myDataVolume]# cat host.txt
container update 01
- 容器停止退出后,主机修改数据是否还同步
[root@7b0325dede02 dataVolumeContainer]# exit
exit
# 查看docker中是否容器运行
[root@hadoop666 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 在主机中进行修改
[root@hadoop666 myDataVolume]# vim host.txt
[root@hadoop666 myDataVolume]# touch host2.txt
[root@hadoop666 myDataVolume]# ll
总用量 4
-rw-r--r--. 1 root root 0 1月 24 14:24 container.txt
-rw-r--r--. 1 root root 0 1月 24 14:30 host2.txt
-rw-r--r--. 1 root root 35 1月 24 14:30 host.txt
# 重新启动容器,查看容器中是否还会同步
[root@hadoop666 /]# docker start 7b0325dede02
7b0325dede02
[root@hadoop666 ~]# docker attach 7b0325dede02
[root@7b0325dede02 /]#
[root@7b0325dede02 /]# cd dataVolumeContainer/
[root@7b0325dede02 dataVolumeContainer]# ls
container.txt host.txt host2.txt
[root@7b0325dede02 dataVolumeContainer]# cat host.txt
container update 01
host update 01
删除操作示例
# 将myDataVolume删除
[root@hadoop666 /]# rm -rf myDataVolume/
[root@hadoop666 /]# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
# 容器中查看
[root@7b0325dede02 dataVolumeContainer]# ls -l
total 0
- 命令(带权限)容器中只读不可写
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer:ro 镜像名
# 示例
[root@hadoop666 ~]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
[root@4da7ba7dbff4 /]#
# 之后依次进行上述操作,数据同步是依然正常
# 在容器中无法进行文件的操作,只能在主机中进行更改再同步。
DockerFile添加
VOLUME["/dataVolumeContainer","/dataVolumeContainer2],"dataVolumeContainer3
说明:出于可移植性和分享的考虑,用-v主机目录:容器目录
这种方法不能直接在DockerFile中实现。因为宿主机目录是依赖于特定宿主机的,并不能保证所有宿主机上都存在这样的特定目录
- 在根目录下新建一个文件夹
[root@hadoop666 /]# mkdir /mydocker
[root@hadoop666 /]# cd mydocker
- File构建——DockeFile
[root@hadoop666 mydocker]# vim DockerFile
# 在文件中写入下列内容
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD exho "finished,----------success1"
CMD /bin/bash
- build生成一个镜像
[root@hadoop666 mydocker]# docker build -f /mydocker/DockerFile -t reflect0714/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
---> Running in 597ac1926efe
Removing intermediate container 597ac1926efe
---> f7ca859c24be
Step 3/4 : CMD exho "finished,----------success1"
---> Running in d6d5cca7a048
Removing intermediate container d6d5cca7a048
---> dbc5da72729f
Step 4/4 : CMD /bin/bash
---> Running in e83757ac7d01
Removing intermediate container e83757ac7d01
---> bc55440f2c61
Successfully built bc55440f2c61
Successfully tagged reflect0714/centos:latest
之后可以使用docker images查看镜像
[root@hadoop666 mydocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
reflect0714/centos latest bc55440f2c61 29 seconds ago 209MB
tomcat latest 040bdb29ab37 11 days ago 649MB
centos latest 300e315adb2f 6 weeks ago 209MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
- 运行自己构建的镜像查看其中的文件
[root@hadoop666 mydocker]# docker run -it reflect0714/centos
[root@634fe6d025c9 /]# pwd
/
[root@634fe6d025c9 /]# ls
bin dev lib media proc sbin tmp
dataVolumeContainer1 etc lib64 mnt root srv usr
dataVolumeContainer2 home lost+found opt run sys var
- 进行测试
# 在容器中新建文件,将会存放在宿主机的哪个位置呢?
[root@634fe6d025c9 /]# cd dataVolumeContainer1
[root@634fe6d025c9 dataVolumeContainer1]# touch container01.txt
[root@634fe6d025c9 dataVolumeContainer1]# ls
container01.tx
# 使用inspect命令查看容器相关信息
[root@hadoop666 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
634fe6d025c9 reflect0714/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes blissful_kare
[root@hadoop666 ~]# docker inspect 634fe6d025c9
"Mounts": [
{
"Type": "volume",
"Name": "d268d009dfe0e8682dc778b1517182931d889f73e0bd7feb8ba765439b2b49a7",
# 此处source即为两个容器卷对应在主机上的文件夹
"Source": "/var/lib/docker/volumes/d268d009dfe0e8682dc778b1517182931d889f73e0bd7feb8ba765439b2b49a7/_data",
"Destination": "/dataVolumeContainer1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "ca6b2546104befcec2959e01e4209b170c6e0fda847de22852844f0553b99094",
"Source": "/var/lib/docker/volumes/ca6b2546104befcec2959e01e4209b170c6e0fda847de22852844f0553b99094/_data",
"Destination": "/dataVolumeContainer2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
# 之后进入上述的文件夹中查看是否有对应的container01.txt文件
[root@hadoop666 ~]# cd /var/lib/docker/volumes/d268d009dfe0e8682dc778b1517182931d889f73e0bd7feb8ba765439b2b49a7/_data
[root@hadoop666 _data]# ls
container01.txt
# 主机上新建一个文件,在容器中进行查看
[root@hadoop666 _data]# touch host.txt
[root@634fe6d025c9 dataVolumeContainer1]# ls
container01.txt host.txt
- 备注
- 如果Docker挂载主机目录Docker访问出现cannot open directory.:Permission denied
- 解决办法:在挂载目录后多加一个–privilege=true参数即可
数据卷容器
- 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
示例
以上一步的镜像reflect0714/centos为模板运行dc01/dc02/dc03
关键词 –volumes-from
# 先启动dc01
[root@hadoop666 mydocker]# docker run -it --name dc01 reflect0714/centos
[root@e018437882b6 /]#
# 在其中新建一个文件
[root@e018437882b6 /]# cd dataVolumeContainer2
[root@e018437882b6 dataVolumeContainer2]# touch dc01_add.txt
# Ctrl + P + Q退出但不停止容器
# 以dc01为父模板分别启动dc02和dc03
[root@hadoop666 mydocker]# docker run -it --name dc02 --volumes-from dc01 reflect0714/centos
[root@a9208d45d136 /]#
# 查看里面是否有dc_01.txt文件
[root@a9208d45d136 /]# cd dataVolumeContainer2
[root@a9208d45d136 dataVolumeContainer2]# ls
dc01_add.txt
# 在里面新建一个dc02_add.txt
[root@a9208d45d136 dataVolumeContainer2]# touch dc02_add.txt
# Ctrl + P + Q退出但不停止容器
[root@hadoop666 mydocker]# docker run -it --name dc03 --volumes-from dc01 reflect0714/centos
[root@76e80373d5a9 /]#
# 在里面新建一个dc03_add.txt
[root@76e80373d5a9 /]# cd dataVolumeContainer2
[root@76e80373d5a9 dataVolumeContainer2]# touch dc03_add.txt
# Ctrl + P + Q退出但不停止容器
# 重新进入dc01,查看是否dc02与dc03的新建文件是否与dc01共享
[root@hadoop666 ~]# docker attach dc01
[root@e018437882b6 dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc03_add.txt
# 将dc01删除
[root@hadoop666 ~]# docker rm -f dc01
dc01
[root@hadoop666 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76e80373d5a9 reflect0714/centos "/bin/sh -c /bin/bash" 4 minutes ago Up 4 minutes dc03
a9208d45d136 reflect0714/centos "/bin/sh -c /bin/bash" 7 minutes ago Up 7 minutes dc02
# 重新进入dc02查看其中的文件
[root@hadoop666 ~]# docker attach dc02
[root@a9208d45d136 dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc03_add.txt
# 再到里面新建一个文件
[root@a9208d45d136 dataVolumeContainer2]# touch dc02_update.txt
# 没有了dc01,dc02进行修改是否会影响到dc03?
# 进入dc03查看其中文件
[root@hadoop666 ~]# docker attach dc03
[root@76e80373d5a9 dataVolumeContainer2]# ls
dc01_add.txt dc02_add.txt dc02_update.txt dc03_add.txt
# 得出数据还是完全同步的
- 结论
- 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
DockerFile
是什么
-
DockFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
-
构建三步骤
- 编写DockerFile文件
- docker build
- docker run
DockerFile构建过程解析
基础知识
- 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
#
表示注释- 每条指令都会创建一个新的镜像层,并对镜像进行提交
大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
DockerFile保留字
- From——基础镜像,当前镜像是基于哪个镜像的
- MAINTAINER——镜像维护者的姓名和邮箱地址
- RUN——容器构建时需要运行的命令
- EXPOSE——当前容器对外暴露出的端口
- WORKDIR——指定在创建容器后,终端默认登陆进来的工作目录
- ENV——用来在构建镜像过程中设置环境变量
- ADD——将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY——类似于ADD,拷贝文件和目录到镜像中。
- 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
- COPY src dest
- COPY [“src”, “dest”]
- 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
- VOLUME——容器数据卷,用于数据保存和持久化工作
- CMD——指定一个容器启动时要运行的命令
- DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
- ENTRYPOINT——指定一个容器启动时要运行的命令
- ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。不会覆盖而是追加
- ONBUILD——当构建一个被继承的DockFile时运行命令,父镜像在被子继承后父镜像的onbuild触发
镜像细解
Base镜像
scratch——相当于Java中的Object类
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
自定义镜像mycentos
# 查看精简版的centos不具备的功能
[root@hadoop666 ~]# docker run -it centos /bin/bash
[root@00b207283c38 /]# vim abc.txt
bash: vim: command not found
[root@00b207283c38 /]# ifconfig
bash: ifconfig: command not found
自定义mycentos使得作出改变
- 登录后的默认路径不是/
- vim能使用
- 支持ifconfig
编写DockerFile2.txt文件
# 从centos中构建
FROM centos
# 作者以及作者邮箱
MAINTAINER reflect<ge051799qi@163.com>
# 设置环境变量
ENV MYPATH /usr/local
# 设置登录时所在的路径
WORKDIR $MYPATH
# yum安装
RUN yum -y install vim
RUN yum -y install net-tools
# 暴露80端口
EXPOSE 80
# 要执行的命令,前两个命令会被最后一个命令覆盖
CMD echo $MYPATH
CMD echo "success----------ok"
CMD /bin/bash
构建镜像
docker build -t 新镜像名字:TAG .
# 别忘了最后一个点代表当前路径
[root@hadoop666 docker]# docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .
......
Successfully built 846a765743ac
Successfully tagged mycentos:1.3
[root@hadoop666 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.3 846a765743ac 10 seconds ago 291MB
reflect0714/centos latest bc55440f2c61 9 hours ago 209MB
tomcat latest 040bdb29ab37 12 days ago 649MB
centos latest 300e315adb2f 6 weeks ago 209MB
hello-world latest bf756fb1ae65 12 months ago 13.3kB
运行
docker run -it 新镜像名字:TAG
# 进入系统的落脚点是在/usr/local
[root@hadoop666 docker]# docker run -it mycentos:1.3
[root@7eef2495b42c local]# pwd
/usr/local
# 支持vim
[root@7eef2495b42c local]# vim abc.txt
# 支持ifconfig
[root@7eef2495b42c local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 21 bytes 2615 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
列出镜像变更历史
docker history 镜像名
# 查看镜像mycentos的id
[root@hadoop666 docker]# docker images mycentos
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.3 846a765743ac 28 minutes ago 291MB
# 查看此id镜像的变更历史
[root@hadoop666 docker]# docker history 846a765743ac
IMAGE CREATED CREATED BY SIZE COMMENT
846a765743ac 28 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
d19d605ffa82 28 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
277d4a4b3358 28 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
cfcccdfb7579 28 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
85bd5e5fb079 28 minutes ago /bin/sh -c yum -y install net-tools 23.4MB
0f7fb2c2b2af 28 minutes ago /bin/sh -c yum -y install vim 58.1MB
c7279ea3a7a9 43 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
1dff03cb60f9 43 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
7af5e1295019 43 minutes ago /bin/sh -c #(nop) MAINTAINER reflect<ge0517… 0B
300e315adb2f 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 weeks ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD/ENTRYPOINT镜像案例
CMD会被之后的命令所覆盖
ENTRYPOINT则是追加
自定义Tomcat
# 新建文件夹,常见新文件c.txt和拷贝tomcat和jdk到此目录
[root@hadoop666 /]# mkdir -p /reflect/mydockerfile/tomcat
[root@hadoop666 /]# cd /reflect/mydockerfile/tomcat
[root@hadoop666 tomcat]# touch c.txt
[root@hadoop666 tomcat]# cp /opt/packages/apache-tomcat-9.0.40.tar.gz .
[root@hadoop666 tomcat]# cp /opt/packages/jdk-8u271-linux-x64.tar.gz .
[root@hadoop666 tomcat]# ls
apache-tomcat-9.0.40.tar.gz c.txt jdk-8u271-linux-x64.tar.gz
[root@hadoop666 tomcat]# vim Dockerfile
其中的Dockerfile文件内容
FROM centos
MAINTAINER reflect<ge051799qi@163.com>
# 把宿主机当前上下文的c.txt拷贝到容器中的/usr/local路径下
COPY c.txt /usr/local/cincontainer.txt
# 把jdk和tomcat添加到容器中
ADD jdk-8u271-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.40.tar.gz /usr/local
# 安装vim编辑器
RUN yum -y install vim
# 设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib:$JRE_HOME/lib
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.40
ENV JAVA_PATH ${JAVA_HOME}/bin:${JRE_HOME}/bin
ENV PATH $PATH:${JAVA_PATH}:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
# 启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.40/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.40/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.40/bin/startup/sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
构建
# 不加-f指定文件是因为就在此文件夹中
# 不指定文件是因为默认就会搜索名为Dockerfile的文件(注意file首字母不能大小)
[root@hadoop666 tomcat]# docker build -t demotomcat9 .
......
Successfully built 146c83fa7153
Successfully tagged demotomcat9:latest
[root@hadoop666 tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demotomcat9 latest 146c83fa7153 About a minute ago 639MB
执行
[root@hadoop666 tomcat]# docker run -d -p 9080:8080 --name mytomcat09 -v /reflect/mydockerfile/tomcat/test:/usr/local/apache-tomcat-9.0.40/webapps/test -v /reflect/mydockerfile/tomcat/tomcat9logs/:/usr/local/apache-tomcat-9.0.40/logs --privileged=true demotomcat9
4b5e5805553d7d52b53ec0f8a4f359fc883a927cc073fde1952bbbf1ef5bb223
# 似乎有点意外,应该是环境变量没配置好。