1.Docker 镜像
1.1 镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
1.2 镜像加载原理
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把文件系统及叠加起来,这样最终的文件系统包含所有底层的文件和目录
Dcoker镜像加载原理
- docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
- bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们电箱的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
- rootfs(root file system),在bootfs之上。包含的就是典型Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs。
虚拟机是分钟级别,容器是秒级!
1.3、分层理解
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层层的在下载 。
为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过docker image inspect 命令
[root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker image inspect redis:latest
[
{
//.............
"RootFS": {
"Type": "layers",
"Layers": [ "sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7", "sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871", "sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54", "sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1", "sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3", "sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
理解:
所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,加入基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上穿件第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终是保持当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像层包含了来自两镜像层的6个文件。
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图总展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新的镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实心镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux 上可用的存储引擎有AUFS、Overlay2,Device Maper、Btrfs 以及 ZFS。顾名思义,没种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfiler 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
特点
Docker镜像都是只读的,当容器启东时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层。
1.4、commit镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
# 1、启动一个默认的tomcatdocker run -d -p 8080:8080 tomcat# 2、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的!docker exec -it 容器id# 3、拷贝文件进去# 4、将操作过的容器通过commit**为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们我们使用虚拟机的快照。
2.容器数据卷
2.1、什么是容器卷?
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
2.2、使用数据卷
方式一 :直接使用命令挂载 -v
-v, --volume list Bind mount a volume
docker run -it -v 主机目录:容器内目录
[root@iZ8vbgc3u6dvwrjyp45lyrZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
#通过 docker inspect 容器id 查看
2.3、案例:安装MySQL
# 获取mysql镜像
➜ ~ docker pull mysql:5.7
# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!
# 参考官网hub
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动我们得
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字
➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 启动成功之后,我们在本地使用sqlyog来测试一下
# sqlyog-连接到服务器的3306--和容器内的3306映射
# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
2.4、具名和匿名挂载
# 匿名挂载
-v 容器内路径!
docker run -d -p --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
[root@iZ8vbgc3u6dvwrjyp45lyrZ lib]# docker volume ls
DRIVER VOLUME NAME
local 3df3ebf883092323908b31e21c761b56c937ee04ed51d418eedcc10df8d5f20a
# 这里发现,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!
# 具名挂载
# 具名挂载
➜ ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
➜ ~ docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以方便的找到我们的 一个卷,大多数情况使用的是 具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器路径 # 指定路径挂载!
拓展:
# 通过 -v 容器内路径: ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
2.5、初识Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件!
1.通过这个脚本可以生成镜像,镜像是一层一层的,脚本就是一个一个的命令
# 创建一个dockerfile文件,名字可以随机 建议 Dockerfile# 文件中的内容 指令(大写)参数FROM centosVOLUME ["/volume01", "/volume02"]CMD echo "----end----------"CMD /bin/bash# 这里的每个命令,就是镜像的一层!
2.通过 docker build 命令基于dockerfile 构建自己的镜像
3启动镜像
可以看到docker文件里写的 挂载 已经生效
4查看一下卷挂载的路径
2.6 数据卷容器
多个MySQL同步数据!
命名的容器挂载数据卷!
启动2个容器,通过我们刚才自己写的镜像启动
--volumes-from list Mount volumes from the specified container(s)# 测试,
[root@qiaoba ~]# docker run -it --name docker-04 --volumes-from docker-3 9b05afa5a9cd[root@675e696485b1 /]# cd volumedir01[root@675e696485b1 volumedir01]# lsfangtao.java
多个mysql实现数据共享
➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7➜ ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7# 这个时候,可以实现两个容器数据同步!
结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
3.DockerFile
3.1、DockerFile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建称为一个镜像
- docker run运行镜像
- docker push发布镜像(DockerHub 、阿里云仓库)
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
3.2、DockerFile构建过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序
- "#"表示注释
- 每一个指令都会创建提交一个新的镜像曾,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
3.3、DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建MAINTAINER # 镜像是谁写的, 姓名+邮箱RUN # 镜像构建的时候需要运行的命令ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录WORKDIR # 镜像的工作目录VOLUME # 挂载的目录EXPOSE # 保留端口配置CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。COPY # 类似ADD,将我们文件拷贝到镜像中ENV # 构建的时候设置环境变量!
3.4、实战测试
Docker Hub中 99% 镜像都是从这个基础镜像过来的FROM scratch
, 然后配置需要的软件和配置来进行的构建
创建一个自己的centos
1、新建dockerfile 文件 并编辑脚本保存
FROM centos #指定继承得父镜像MAINTAINER fangtao<fangtao_greate@163.com> #标注作者ENV MYPATH /usr/local #设置环境变量 WORKDIR $MYPATH #指定初始工作目录RUN yum -y install vim #运行一些Linux命令 这里是在安装 vim 和 网络 命令RUN yum -y install net-toolsEXPOSE 80 #指定暴露得端口CMD echo $MYPATH #输出一些信息CMD echo "---finish----"CMD /bin/bash #指定这个容器启动的时候要运行bash命令
2、通过这个文件构建镜像
[root@qiaoba docker-test-dockerfile]# docker build -f mycentos -t mycentos:1.0.1 .#下面是构建镜像日志Sending build context to Docker daemon 2.048kBStep 1/10 : FROM centos ---> 5d0da3dc9764Step 2/10 : MAINTAINER fangtao<fangtao_greate@163.com> ---> Running in 835dd7444f92Removing intermediate container 835dd7444f92 ---> 8d8dae0fe87aStep 3/10 : ENV MYPATH /usr/local ---> Running in 14a34c0c09b9Removing intermediate container 14a34c0c09b9 ---> 675a69afbf01Step 4/10 : WORKDIR $MYPATH ---> Running in a9848f598e66Removing intermediate container a9848f598e66 ---> 67ef2b211da9Step 5/10 : RUN yum -y install vim ---> Running in f23264f1a329CentOS Linux 8 - AppStream 3.1 MB/s | 9.3 MB 00:03 CentOS Linux 8 - BaseOS 3.1 MB/s | 7.5 MB 00:02 CentOS Linux 8 - Extras 10 kB/s | 10 kB 00:01 Dependencies resolved.================================================================================ Package Arch Version Repository Size================================================================================Installing: vim-enhanced x86_64 2:8.0.1763-15.el8 appstream 1.4 MInstalling dependencies: gpm-libs x86_64 1.20.7-17.el8 appstream 39 k vim-common x86_64 2:8.0.1763-15.el8 appstream 6.3 M vim-filesystem noarch 2:8.0.1763-15.el8 appstream 48 k which x86_64 2.21-12.el8 baseos 49 kTransaction Summary================================================================================Install 5 PackagesTotal download size: 7.8 MInstalled size: 30 MDownloading Packages:(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 182 kB/s | 39 kB 00:00 (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 484 kB/s | 48 kB 00:00 (3/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 1.6 MB/s | 1.4 MB 00:00 (4/5): which-2.21-12.el8.x86_64.rpm 76 kB/s | 49 kB 00:00 (5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 3.1 MB/s | 6.3 MB 00:02 --------------------------------------------------------------------------------Total 1.9 MB/s | 7.8 MB 00:04 CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00 warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEYImporting GPG key 0x8483C65D: Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>" Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction Preparing : 1/1 Installing : which-2.21-12.el8.x86_64 1/5 Installing : vim-filesystem-2:8.0.1763-15.el8.noarch 2/5 Installing : vim-common-2:8.0.1763-15.el8.x86_64 3/5 Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5 Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5 Installing : vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5 Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5 Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64 5/5 Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5 Verifying : vim-common-2:8.0.1763-15.el8.x86_64 2/5 Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64 3/5 Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch 4/5 Verifying : which-2.21-12.el8.x86_64 5/5 Installed: gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64 vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch which-2.21-12.el8.x86_64 Complete!Removing intermediate container f23264f1a329 ---> c0d4413d2b1dStep 6/10 : RUN yum -y install net-tools ---> Running in 8e9461e64a48Last metadata expiration check: 0:00:19 ago on Mon Oct 4 04:17:34 2021.Dependencies resolved.================================================================================ Package Architecture Version Repository Size================================================================================Installing: net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 kTransaction Summary================================================================================Install 1 PackageTotal download size: 322 kInstalled size: 942 kDownloading Packages:net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 444 kB/s | 322 kB 00:00 --------------------------------------------------------------------------------Total 238 kB/s | 322 kB 00:01 Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction Preparing : 1/1 Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Installed: net-tools-2.0-0.52.20160912git.el8.x86_64 Complete!Removing intermediate container 8e9461e64a48 ---> 3a171cf83932Step 7/10 : EXPOSE 80 ---> Running in 96ff3ce70ee9Removing intermediate container 96ff3ce70ee9 ---> ce150e684a95Step 8/10 : CMD echo $MYPATH ---> Running in 997908f0be1cRemoving intermediate container 997908f0be1c ---> f3465f21cdb7Step 9/10 : CMD echo "---finish----" ---> Running in 77e532514004Removing intermediate container 77e532514004 ---> b3f5317a146bStep 10/10 : CMD /bin/bash ---> Running in b1367e2d0839Removing intermediate container b1367e2d0839 ---> dcadd751b09cSuccessfully built dcadd751b09cSuccessfully tagged mycentos:1.0.1[root@qiaoba docker-test-dockerfile]#
3.启动镜像
发现 进入了之前配置的工作目录, 例如ifconfig这样的网络命令已安装成功
CMD 和 ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试cmd
# 编写dockerfile文件$ vim dockerfile-test-cmdFROM centosCMD ["ls","-a"]# 构建镜像$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .# 运行镜像$ docker run cmd-test:0.1....dockerenvbindev# 想追加一个命令 -l 成为ls -al$ docker run cmd-test:0.1 -ldocker: Error response from daemon: OCI runtime create failed:container_linux.go:349: starting container process caused "exec: "-l":executable file not found in $PATH": unknown.ERRO[0000] error waiting for container: context canceled# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令所有报错
测试ENTRYPOINT
# 编写dockerfile文件$ vim dockerfile-test-entrypointFROM centosENTRYPOINT ["ls","-a"]$ docker run entrypoint-test:0.1....dockerenvbindevetchomeliblib64lost+found ...# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的$ docker run entrypoint-test:0.1 -ltotal 56drwxr-xr-x 1 root root 4096 May 16 06:32 .drwxr-xr-x 1 root root 4096 May 16 06:32 ..-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenvlrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bindrwxr-xr-x 5 root root 340 May 16 06:32 devdrwxr-xr-x 1 root root 4096 May 16 06:32 etcdrwxr-xr-x 2 root root 4096 May 11 2019 homelrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/liblrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
3.5、实战:Tomcat镜像
1、准备镜像文件
准备tomcat 和 jdk到当前目录,编写好README 。
2、编写dokerfile
FROM centos #MAINTAINER cheng<1204598429@qq.com>COPY README /usr/local/README #复制文件ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压RUN yum -y install vim ENV MYPATH /usr/local #设置环境变量WORKDIR $MYPATH #设置工作目录ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:EXPOSE 8080 #设置暴露的端口CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 设置默认命令
3、构建镜像
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件$ docker build -t mytomcat:0.1 .$ docker build -t diytomcat .
4、run镜像
$ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logsmytomcat:0.1
5、访问测试
6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
3.6、发布自己的镜像
2、确定这个账号可以登录
3、登录
$ docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in to a Docker registry.If no server is specified, the default is defined by the daemon.Options:-p, --password string Password--password-stdin Take the password from stdin-u, --username string Username
4、提交 push镜像.
# push自己的镜像到服务器上!$ docker push diytomcat
# 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library# 解决方法# 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了$ docker build -t chengcoder/mytomcat:0.1 .# 第二种 使用docker tag #然后再次push$ docker tag 容器id chengcoder/mytomcat:1.0 #然后再次push$ docker push kuangshen/tomcat:1.0
提交的时候也是按照镜像的层级来提交的!
阿里云镜像服务上
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
看官网 很详细https://cr.console.aliyun.com/repository/
$ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]# 修改id 和 版本sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0# 修改版本$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]
测试结果:
1.Docker 镜像
1.1 镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作一个镜像DockerFile
1.2 镜像加载原理
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把文件系统及叠加起来,这样最终的文件系统包含所有底层的文件和目录
Dcoker镜像加载原理
- docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
- bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们电箱的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
- rootfs(root file system),在bootfs之上。包含的就是典型Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs。
虚拟机是分钟级别,容器是秒级!
1.3、分层理解
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层层的在下载 。
为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过docker image inspect 命令
[root@iZ8vbgc3u6dvwrjyp45lyrZ ~]# docker image inspect redis:latest[ { //............. "RootFS": { "Type": "layers", "Layers": [ "sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7", "sha256:245c9d23f65373415922e53424032cabe7b282c5cf8f9f8070a7d1830fca6871", "sha256:ebef6caacb966ed54c0c3facf2288fa5124452f2c0a17faa1941625eab0ceb54", "sha256:0b7b774038f08ec329e4dd2c0be440c487cfb003a05fce87cd5d1497b602f2c1", "sha256:a71d36a87572d637aa446110faf8abb4ea74f028d0e0737f2ff2b983ef23abf3", "sha256:9e1fddfb3a22146392a2d6491e1af2f087da5e6551849a6174fa23051ef8a38f" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } }]
理解:
所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,加入基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上穿件第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终是保持当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像层包含了来自两镜像层的6个文件。
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图总展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新的镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实心镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux 上可用的存储引擎有AUFS、Overlay2,Device Maper、Btrfs 以及 ZFS。顾名思义,没种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfiler 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
特点
Docker镜像都是只读的,当容器启东时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层。
1.4、commit镜像
docker commit 提交容器成为一个新的副本# 命令和git原理类似docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
# 1、启动一个默认的tomcatdocker run -d -p 8080:8080 tomcat# 2、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的!docker exec -it 容器id# 3、拷贝文件进去# 4、将操作过的容器通过commit**为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比我们我们使用虚拟机的快照。
2.容器数据卷
2.1、什么是容器卷?
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
2.2、使用数据卷
方式一 :直接使用命令挂载 -v
-v, --volume list Bind mount a volumedocker run -it -v 主机目录:容器内目录 [root@iZ8vbgc3u6dvwrjyp45lyrZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash#通过 docker inspect 容器id 查看
2.3、案例:安装MySQL
# 获取mysql镜像➜ ~ docker pull mysql:5.7# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!# 参考官网hubdocker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag#启动我们得-d 后台运行-p 端口映射-v 卷挂载-e 环境配置-- name 容器名字➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7# 启动成功之后,我们在本地使用sqlyog来测试一下# sqlyog-连接到服务器的3306--和容器内的3306映射# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
2.4、具名和匿名挂载
# 匿名挂载-v 容器内路径!docker run -d -p --name nginx01 -v /etc/nginx nginx# 查看所有的volume的情况[root@iZ8vbgc3u6dvwrjyp45lyrZ lib]# docker volume lsDRIVER VOLUME NAMElocal 3df3ebf883092323908b31e21c761b56c937ee04ed51d418eedcc10df8d5f20a# 这里发现,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!# 具名挂载# 具名挂载➜ ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx➜ ~ docker volume lsDRIVER VOLUME NAMElocal juming-nginx# 通过 -v 卷名:容器内路径# 查看一下这个卷
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以方便的找到我们的 一个卷,大多数情况使用的是 具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!-v 容器内路径 # 匿名挂载-v 卷名:容器内路径 # 具名挂载-v /宿主机路径:容器路径 # 指定路径挂载!
拓展:
# 通过 -v 容器内路径: ro rw 改变读写权限ro readonly # 只读rw readwrite # 可读可写# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了!docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginxdocker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
2.5、初识Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件!
1.通过这个脚本可以生成镜像,镜像是一层一层的,脚本就是一个一个的命令
# 创建一个dockerfile文件,名字可以随机 建议 Dockerfile# 文件中的内容 指令(大写)参数FROM centosVOLUME ["/volume01", "/volume02"]CMD echo "----end----------"CMD /bin/bash# 这里的每个命令,就是镜像的一层!
2.通过 docker build 命令基于dockerfile 构建自己的镜像
3启动镜像
可以看到docker文件里写的 挂载 已经生效
4查看一下卷挂载的路径
2.6 数据卷容器
多个MySQL同步数据!
命名的容器挂载数据卷!
启动2个容器,通过我们刚才自己写的镜像启动
--volumes-from list Mount volumes from the specified container(s)# 测试,
[root@qiaoba ~]# docker run -it --name docker-04 --volumes-from docker-3 9b05afa5a9cd[root@675e696485b1 /]# cd volumedir01[root@675e696485b1 volumedir01]# lsfangtao.java
多个mysql实现数据共享
➜ ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7➜ ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7# 这个时候,可以实现两个容器数据同步!
结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
3.DockerFile
3.1、DockerFile介绍
dockerfile 是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建称为一个镜像
- docker run运行镜像
- docker push发布镜像(DockerHub 、阿里云仓库)
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
3.2、DockerFile构建过程
基础知识:
- 每个保留关键字(指令)都是必须是大写字母
- 执行从上到下顺序
- ”#“表示注释
- 每一个指令都会创建提交一个新的镜像曾,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
3.3、DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建MAINTAINER # 镜像是谁写的, 姓名+邮箱RUN # 镜像构建的时候需要运行的命令ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录WORKDIR # 镜像的工作目录VOLUME # 挂载的目录EXPOSE # 保留端口配置CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。COPY # 类似ADD,将我们文件拷贝到镜像中ENV # 构建的时候设置环境变量!
3.4、实战测试
Docker Hub中 99% 镜像都是从这个基础镜像过来的FROM scratch
, 然后配置需要的软件和配置来进行的构建
创建一个自己的centos
1、新建dockerfile 文件 并编辑脚本保存
FROM centos #指定继承得父镜像MAINTAINER fangtao<fangtao_greate@163.com> #标注作者ENV MYPATH /usr/local #设置环境变量 WORKDIR $MYPATH #指定初始工作目录RUN yum -y install vim #运行一些Linux命令 这里是在安装 vim 和 网络 命令RUN yum -y install net-toolsEXPOSE 80 #指定暴露得端口CMD echo $MYPATH #输出一些信息CMD echo "---finish----"CMD /bin/bash #指定这个容器启动的时候要运行bash命令
2、通过这个文件构建镜像
[root@qiaoba docker-test-dockerfile]# docker build -f mycentos -t mycentos:1.0.1 .#下面是构建镜像日志Sending build context to Docker daemon 2.048kBStep 1/10 : FROM centos ---> 5d0da3dc9764Step 2/10 : MAINTAINER fangtao<fangtao_greate@163.com> ---> Running in 835dd7444f92Removing intermediate container 835dd7444f92 ---> 8d8dae0fe87aStep 3/10 : ENV MYPATH /usr/local ---> Running in 14a34c0c09b9Removing intermediate container 14a34c0c09b9 ---> 675a69afbf01Step 4/10 : WORKDIR $MYPATH ---> Running in a9848f598e66Removing intermediate container a9848f598e66 ---> 67ef2b211da9Step 5/10 : RUN yum -y install vim ---> Running in f23264f1a329CentOS Linux 8 - AppStream 3.1 MB/s | 9.3 MB 00:03 CentOS Linux 8 - BaseOS 3.1 MB/s | 7.5 MB 00:02 CentOS Linux 8 - Extras 10 kB/s | 10 kB 00:01 Dependencies resolved.================================================================================ Package Arch Version Repository Size================================================================================Installing: vim-enhanced x86_64 2:8.0.1763-15.el8 appstream 1.4 MInstalling dependencies: gpm-libs x86_64 1.20.7-17.el8 appstream 39 k vim-common x86_64 2:8.0.1763-15.el8 appstream 6.3 M vim-filesystem noarch 2:8.0.1763-15.el8 appstream 48 k which x86_64 2.21-12.el8 baseos 49 kTransaction Summary================================================================================Install 5 PackagesTotal download size: 7.8 MInstalled size: 30 MDownloading Packages:(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 182 kB/s | 39 kB 00:00 (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 484 kB/s | 48 kB 00:00 (3/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 1.6 MB/s | 1.4 MB 00:00 (4/5): which-2.21-12.el8.x86_64.rpm 76 kB/s | 49 kB 00:00 (5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 3.1 MB/s | 6.3 MB 00:02 --------------------------------------------------------------------------------Total 1.9 MB/s | 7.8 MB 00:04 CentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00 warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEYImporting GPG key 0x8483C65D: Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>" Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction Preparing : 1/1 Installing : which-2.21-12.el8.x86_64 1/5 Installing : vim-filesystem-2:8.0.1763-15.el8.noarch 2/5 Installing : vim-common-2:8.0.1763-15.el8.x86_64 3/5 Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5 Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5 Installing : vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5 Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5 Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64 5/5 Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5 Verifying : vim-common-2:8.0.1763-15.el8.x86_64 2/5 Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64 3/5 Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch 4/5 Verifying : which-2.21-12.el8.x86_64 5/5 Installed: gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64 vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch which-2.21-12.el8.x86_64 Complete!Removing intermediate container f23264f1a329 ---> c0d4413d2b1dStep 6/10 : RUN yum -y install net-tools ---> Running in 8e9461e64a48Last metadata expiration check: 0:00:19 ago on Mon Oct 4 04:17:34 2021.Dependencies resolved.================================================================================ Package Architecture Version Repository Size================================================================================Installing: net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 kTransaction Summary================================================================================Install 1 PackageTotal download size: 322 kInstalled size: 942 kDownloading Packages:net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 444 kB/s | 322 kB 00:00 --------------------------------------------------------------------------------Total 238 kB/s | 322 kB 00:01 Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transaction Preparing : 1/1 Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Installed: net-tools-2.0-0.52.20160912git.el8.x86_64 Complete!Removing intermediate container 8e9461e64a48 ---> 3a171cf83932Step 7/10 : EXPOSE 80 ---> Running in 96ff3ce70ee9Removing intermediate container 96ff3ce70ee9 ---> ce150e684a95Step 8/10 : CMD echo $MYPATH ---> Running in 997908f0be1cRemoving intermediate container 997908f0be1c ---> f3465f21cdb7Step 9/10 : CMD echo "---finish----" ---> Running in 77e532514004Removing intermediate container 77e532514004 ---> b3f5317a146bStep 10/10 : CMD /bin/bash ---> Running in b1367e2d0839Removing intermediate container b1367e2d0839 ---> dcadd751b09cSuccessfully built dcadd751b09cSuccessfully tagged mycentos:1.0.1[root@qiaoba docker-test-dockerfile]#
3.启动镜像
发现 进入了之前配置的工作目录, 例如ifconfig这样的网络命令已安装成功
CMD 和 ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试cmd
# 编写dockerfile文件$ vim dockerfile-test-cmdFROM centosCMD ["ls","-a"]# 构建镜像$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .# 运行镜像$ docker run cmd-test:0.1....dockerenvbindev# 想追加一个命令 -l 成为ls -al$ docker run cmd-test:0.1 -ldocker: Error response from daemon: OCI runtime create failed:container_linux.go:349: starting container process caused "exec: "-l":executable file not found in $PATH": unknown.ERRO[0000] error waiting for container: context canceled# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令所有报错
测试ENTRYPOINT
# 编写dockerfile文件$ vim dockerfile-test-entrypointFROM centosENTRYPOINT ["ls","-a"]$ docker run entrypoint-test:0.1....dockerenvbindevetchomeliblib64lost+found ...# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的$ docker run entrypoint-test:0.1 -ltotal 56drwxr-xr-x 1 root root 4096 May 16 06:32 .drwxr-xr-x 1 root root 4096 May 16 06:32 ..-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenvlrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bindrwxr-xr-x 5 root root 340 May 16 06:32 devdrwxr-xr-x 1 root root 4096 May 16 06:32 etcdrwxr-xr-x 2 root root 4096 May 11 2019 homelrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/liblrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
3.5、实战:Tomcat镜像
1、准备镜像文件
准备tomcat 和 jdk到当前目录,编写好README 。
2、编写dokerfile
FROM centos #MAINTAINER cheng<1204598429@qq.com>COPY README /usr/local/README #复制文件ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压RUN yum -y install vim ENV MYPATH /usr/local #设置环境变量WORKDIR $MYPATH #设置工作目录ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:EXPOSE 8080 #设置暴露的端口CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 设置默认命令
3、构建镜像
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件$ docker build -t mytomcat:0.1 .$ docker build -t diytomcat .
4、run镜像
$ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logsmytomcat:0.1
5、访问测试
6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
3.6、发布自己的镜像
2、确定这个账号可以登录
3、登录
$ docker login --helpUsage: docker login [OPTIONS] [SERVER]Log in to a Docker registry.If no server is specified, the default is defined by the daemon.Options:-p, --password string Password--password-stdin Take the password from stdin-u, --username string Username
4、提交 push镜像.
# push自己的镜像到服务器上!$ docker push diytomcat
# 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library# 解决方法# 第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了$ docker build -t chengcoder/mytomcat:0.1 .# 第二种 使用docker tag #然后再次push$ docker tag 容器id chengcoder/mytomcat:1.0 #然后再次push$ docker push kuangshen/tomcat:1.0
提交的时候也是按照镜像的层级来提交的!
阿里云镜像服务上
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
看官网 很详细https://cr.console.aliyun.com/repository/
$ sudo docker login --username=zchengx registry.cn-shenzhen.aliyuncs.com$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]# 修改id 和 版本sudo docker tag a5ef1f32aaae registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:1.0# 修改版本$ sudo docker push registry.cn-shenzhen.aliyuncs.com/dsadxzc/cheng:[镜像版本号]
测试结果: