Dockerfile
一、DockerFile介绍
构建步骤:
1、编写一个dockerfile 文件
2、dockerfile build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
查看一下官方是怎么做的?
很过官方镜像都是基础包,很多功能都没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
二、DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都必须是大写的
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
dockerfile 是面向开发的,我们以后要发布项目,作镜像,就需要编写dockerfile文件,这个文件很简单!
docker镜像逐渐成为企业交付的标准,需要掌握!
步骤:开发、部署、运维-----------缺一不可
Dockerfile:构建文件,定义了一切步骤,源代码
DockerFile:通过dockerfile 构建生成的镜像,最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务
Dockerfile的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像构建是谁写的,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 Dockerfile 这个时候运行 onbuild 的指令。触发指令。
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
练习
Dockerhub 中99% 镜像都是从这个基础镜像过来的 FROM scratch ,然后配置需要的软件和配置来进行的构建
创建一个自己的centos镜像
#1、编写dockerfile的文件
FROM centos
MAINTAINER guanguan<2054210430@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#2、通过这个文件构建镜像
命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]
[root@docker dockerfile]# docker build -f mydockerfile -t mycentos:1.0 .
............
Successfully built b8a0e79e0aa3
Successfully tagged mycentos:1.0
测试运行
对比:之前原生的centos
我们增加之后的镜像
查看本地镜像制作变更的历史
docker history 镜像id
我们平时拿到一个镜像,可以研究一下它是怎么做的?
CMD 和 ENTRYPOINT 区别
CMD #指定这个容器启动的时候要运行地命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
#编写 dockerfile 文件
[root@docker dockerfile]# cat dockerfile-test01
FROM centos
CMD ["ls","-a"]
#构建镜像
[root@docker dockerfile]# docker build -f dockerfile-test01 -t cmd.test .
通过run运行
[root@docker dockerfile]# docker run -it 5af66996479d
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
想追加-l ls -al
[root@docker dockerfile]# docker run -it 5af66996479d -l
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
#cmd的清理下 -l 替换了CMD [“ls”,“-a”]命令,-l 不是命令所以报错!
[root@docker dockerfile]# docker run -it 5af66996479d ls -la
total 0
drwxr-xr-x. 1 root root 6 Jul 9 14:59 .
drwxr-xr-x. 1 root root 6 Jul 9 14:59 ..
-rwxr-xr-x. 1 root root 0 Jul 9 14:59 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jul 9 14:59 dev
drwxr-xr-x. 1 root root 66 Jul 9 14:59 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 255 root root 0 Jul 9 14:59 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jul 6 14:57 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
测试ENTRYPOINT
[root@docker dockerfile]# docker build -f dockerfile-entryfile.test -t entrtpoint.test .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 5d0da3dc9764
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 7437d29db30d
Removing intermediate container 7437d29db30d
---> c4e9b01debd2
Successfully built c4e9b01debd2
Successfully tagged entrtpoint.test:latest
[root@docker dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
entrtpoint.test latest c4e9b01debd2 4 seconds ago 231MB
cmd.test latest 5af66996479d 23 minutes ago 231MB
mycentos 1.0 b8a0e79e0aa3 47 minutes ago 326MB
guanguan/centos latest 847c7a7b6e62 7 hours ago 231MB
tomcat001 1.0 8d5db9d0d151 22 hours ago 684MB
nginx latest 605c77e624dd 6 months ago 141MB
tomcat 9.0 b8e65a4d736d 6 months ago 680MB
tomcat latest fb5657adc892 6 months ago 680MB
redis latest 7614ae9453d1 6 months ago 113MB
mysql 5.7 c20987f18b13 6 months ago 448MB
centos latest 5d0da3dc9764 9 months ago 231MB
portainer/portainer latest 580c0e4e98b0 15 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 2 years ago 791MB
[root@docker dockerfile]# docker run -it c4e9b01debd2
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
#我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令的后面!
[root@docker dockerfile]# docker run -it c4e9b01debd2 -l
total 0
drwxr-xr-x. 1 root root 6 Jul 9 15:16 .
drwxr-xr-x. 1 root root 6 Jul 9 15:16 ..
-rwxr-xr-x. 1 root root 0 Jul 9 15:16 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jul 9 15:16 dev
drwxr-xr-x. 1 root root 66 Jul 9 15:16 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 254 root root 0 Jul 9 15:16 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jul 6 14:57 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
1、准备镜像文件 tomcat 压缩包,jdk压缩包!
2、编写dockerfile文件,官方命名Dockerfile ,build会自动寻找这个文件,就不需要-f 制定了!
[root@docker tomcat]# cat Dockerfile
FROM centos
MAINTAINER guanguan<2054210430@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk1.8.0_20_x64.zip /usr/local/
ADD apache-tomcat-9.0.2.zip /usr/local/
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.2
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.2
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 80
CMD /usr/local/apache-tomcat-9.0.2/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.2/bin/logs/catalina.out
3、构建镜像
[root@docker tomcat]# docker build -t diytomcat .
Sending build context to Docker daemon 10.01MB
Step 1/18 : FROM centos
---> 5d0da3dc9764
Step 2/18 : MAINTAINER guanguan<2054210430@qq.com>
---> Using cache
---> 6ed6ed466e89
Step 3/18 : COPY readme.txt /usr/local/readme.txt
---> Using cache
---> de60c1ba7aed
Step 4/18 : ADD jdk1.8.0_20_x64.zip /usr/local/
---> Using cache
---> 88488da3c2a0
Step 5/18 : ADD apache-tomcat-9.0.2.zip /usr/local/
---> Using cache
---> 7dbc38312779
Step 6/18 : RUN cd /etc/yum.repos.d/
---> Running in ee4ec0b59152
Removing intermediate container ee4ec0b59152
---> 3c362e860bd5
Step 7/18 : RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
---> Running in 24220615a9da
Removing intermediate container 24220615a9da
---> 3328c84c6e56
Step 8/18 : RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
---> Running in 12c7d32afdcc
Removing intermediate container 12c7d32afdcc
---> 764499f9fd7a
Step 9/18 : RUN yum -y install vim
---> Running in 0f7add7cd40b
CentOS Linux 8 - AppStream 272 kB/s | 8.4 MB 00:31
CentOS Linux 8 - BaseOS 2.7 MB/s | 4.6 MB 00:01
CentOS Linux 8 - Extras 15 kB/s | 10 kB 00:00
Last metadata expiration check: 0:00:01 ago on Sat Jul 9 15:58:01 2022.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-16.el8 appstream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-17.el8 appstream 39 k
vim-common x86_64 2:8.0.1763-16.el8 appstream 6.3 M
vim-filesystem noarch 2:8.0.1763-16.el8 appstream 49 k
which x86_64 2.21-16.el8 baseos 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 140 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-16.el8.noarch.rp 477 kB/s | 49 kB 00:00
(3/5): which-2.21-16.el8.x86_64.rpm 313 kB/s | 49 kB 00:00
(4/5): vim-enhanced-8.0.1763-16.el8.x86_64.rpm 2.0 MB/s | 1.4 MB 00:00
(5/5): vim-common-8.0.1763-16.el8.x86_64.rpm 6.1 MB/s | 6.3 MB 00:01
--------------------------------------------------------------------------------
Total 7.4 MB/s | 7.8 MB 00:01
warning: /var/cache/dnf/appstream-d7987f026ef99c82/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS Linux 8 - AppStream 798 kB/s | 1.6 kB 00:00
Importing 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-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-16.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-16.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-16.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-16.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-16.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-16.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-16.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-16.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-16.el8.noarch 4/5
Verifying : which-2.21-16.el8.x86_64 5/5
Installed:
gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-16.el8.x86_64
vim-enhanced-2:8.0.1763-16.el8.x86_64 vim-filesystem-2:8.0.1763-16.el8.noarch
which-2.21-16.el8.x86_64
Complete!
Removing intermediate container 0f7add7cd40b
---> 4771a4027f88
Step 10/18 : ENV MYPATH /usr/local
---> Running in 5a777ba6dee4
Removing intermediate container 5a777ba6dee4
---> 6a722995518d
Step 11/18 : WORKDIR $MYPATH
---> Running in 4449df7ed9df
Removing intermediate container 4449df7ed9df
---> 80306978351a
Step 12/18 : ENV JAVA_HOME /usr/local/jdk1.8.0_11
---> Running in d7078c3ece05
Removing intermediate container d7078c3ece05
---> 52c6c53adb1a
Step 13/18 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
---> Running in bcd9ff5a78f2
Removing intermediate container bcd9ff5a78f2
---> 5ccc9646f1ef
Step 14/18 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.2
---> Running in 4f3e7d557c83
Removing intermediate container 4f3e7d557c83
---> e8f70cafea6c
Step 15/18 : ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.2
---> Running in 9f3bf090b931
Removing intermediate container 9f3bf090b931
---> 8b9384a7ccc2
Step 16/18 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
---> Running in bce24d86b641
Removing intermediate container bce24d86b641
---> 6afa30ce1f43
Step 17/18 : EXPOSE 80
---> Running in 4ba5e45616ff
Removing intermediate container 4ba5e45616ff
---> d2d9f02dd439
Step 18/18 : CMD /usr/local/apache-tomcat-9.0.2/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.2/bin/logs/catalina.out
---> Running in c3732a1993e5
Removing intermediate container c3732a1993e5
---> a47356a06c4a
Successfully built a47356a06c4a
Successfully tagged diytomcat:latest
[root@docker tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
diytomcat latest a47356a06c4a 3 minutes ago 308MB
4、启动镜像
[root@docker tomcat]# docker run -d -p 9090:8080 --name guantomcat001 -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.2/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.2/logs diytomcat
4470e51e819ea9b6b6d07ee81f98b8c74469ae7eb2cba36c5a1fc94b8a2a12d9
[root@docker tomcat]# docker exec -it 4470e51e819ea9b /bin/bash
5、访问测试
进入test目录添加页面内容
6、发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
结果项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都需要使用dockerfile镜像来发布!
三、发布自己的镜像
DockerHub
1、注册自己的账号,地址:https://hub.docker.com/
2、确定这个账号可以登录
3、在我们服务器上提交自己的镜像
[root@docker ~]# docker login --help
Usage: 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、登录完毕后,就可以提交镜像了
[root@docker ~]# docker login -u guanguan001
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
4、登录完毕后就可以提交镜像了,就是一步 docker push
[root@docker ~]# docker push mycentos:1.0
The push refers to repository [docker.io/library/mycentos]
d04ce1428530: Preparing
58a3bf9e5c0e: Preparing
495d59388e95: Preparing
8f960a9ca784: Preparing
74ddd0ec08fa: Preparing
denied: requested access to the resource is denied
#push镜像的问题?
[root@docker ~]# docker push guanguan/centos:1.0
The push refers to repository [docker.io/guanguan/centos]
tag does not exist: guanguan/centos:1.0
#解决,增加一个 tag
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 b8a0e79e0aa3 3 hours ago 326MB
[root@docker ~]# docker tag b8a0e79e0aa3 guanguan/mycentos:1.0
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
guanguan/mycentos 1.0 b8a0e79e0aa3 3 hours ago 326MB
#docker push 上去即可!自己发布的镜像尽量带版本号
[root@docker ~]# docker push guanguan/mycentos:1.0
The push refers to repository [docker.io/guanguan/mycentos]
d04ce1428530: Preparing
58a3bf9e5c0e: Preparing
495d59388e95: Preparing
8f960a9ca784: Preparing
74ddd0ec08fa: Preparing
发布到阿里云
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、浏览阿里云信息
(1)制作tomcat镜像,按如下步骤
[root@master01 ~]# mkdir /root/tomcat_image
把上面的war包和jar包传到这个目录下
[root@master01 ~]# cd /root/tomcat_image
[root@master01 tomcat_image]# ls
metrics.war simpleclient_hotspot-0.8.0.jar tomcat_exporter_servlet-0.0.12.war
simpleclient-0.8.0.jar simpleclient_servlet-0.8.0.jar
simpleclient_common-0.8.0.jar tomcat_exporter_client-0.0.12.jar
[root@master01 tomcat_image]# vim Dockerfile
[root@master01 tomcat_image]#cat Dockerfile
FROM tomcat:8.5-jdk8-corretto
ADD metrics.war /usr/local/tomcat/webapps/
ADD simpleclient-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_common-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_hotspot-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_servlet-0.8.0.jar /usr/local/tomcat/lib/
ADD tomcat_exporter_client-0.0.12.jar /usr/local/tomcat/lib/
[root@master01 tomcat_image]#docker build -t='guan12319/tomcat_prometheus:v1' .
[root@master01 tomcat_image]# docker login --username=倾夏4978 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@master01 tomcat_image]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
guan12319/tomcat_prometheus v1 29091fdd339d 6 hours ago 378MB
#上传镜像到阿里镜像仓库
[root@master01 tomcat_image]# docker push registry.cn-hangzhou.aliyuncs.com/guan001/guan001:v1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/guan001/guan001]
32236613d450: Pushed
a89c63ae5752: Pushed
25c331a7bc68: Pushed
e4319afb0702: Pushed
5ec27e556b42: Pushed
51d2aa8ed9d5: Pushed
2f5f69ae02b8: Pushed
22cf33807314: Pushed
12aebc3f8091: Pushed
49fe839ab5bc: Pushed
d4dfab969171: Pushed
v1: digest: sha256:343fd7c1aed1d604d09098a857523aa769c3d62f3ec878d9bca451771ca34b14 size: 2619
在k8s的node节点拉取镜像拉取镜像