Docker杂记

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 124 14:24 container.txt
-rw-r--r--. 1 root root  0 124 14:30 host2.txt
-rw-r--r--. 1 root root 35 124 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


# 似乎有点意外,应该是环境变量没配置好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值