DockerFile介绍
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 命令 运行镜像
- docker push 发布镜像(docker hub 、阿里云镜像仓库)
查看一下官方是怎么做的
点击后跳到一个Dockerfile
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
DockerFile构建过程
基础知识
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
DockerFile的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
实战测试
Docker Hub 中99%的镜像都是从这个基础镜像过来的 FROM scratch
然后配置需要的软件和配置来进行构建
创建一个自己的centos镜像
# 编写dockerfile文件
FROM centos
MAINTAINER chang<1036428339@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end----"
CMD /bin/bash
# 通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[TAG]
[root@localhost dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .
Sending build context to Docker daemon 2.048kB
...
Successfully built f0a2090c930c
Successfully tagged mycentos:0.1
# 测试运行
# 官方原版
[root@localhost docker-test-volume]# docker run -it centos
[root@c78c04e29031 /]# pwd
/
[root@c78c04e29031 /]# vim
bash: vim: command not found
[root@c78c04e29031 /]# ifconfig
bash: ifconfig: command not found
[root@c78c04e29031 /]# exit
exit
# 我们自定义的版本
[root@localhost dockerfile]# docker run -it mycentos:0.1
[root@bbf8be2ad8be local]# pwd
/usr/local
[root@bbf8be2ad8be 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 8 bytes 648 (648.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
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1 (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
[root@bbf8be2ad8be local]# vim test
# 工作命令修改成功,ifconfig vim 命令都加上了
我们可以列出本地进行的变更历史
# docker history 镜像id
[root@localhost docker-test-volume]# docker history f0a2090c930c
IMAGE CREATED CREATED BY SIZE COMMENT
f0a2090c930c 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
1d6d75be627b 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
d258784fae69 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
44f098d40541 10 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
e28e5279d833 10 minutes ago /bin/sh -c yum -y install net-tools 24.8MB
5f54939c0bda 11 minutes ago /bin/sh -c yum -y install vim 60.4MB
e4edc3a07ad4 12 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
0dbf0262b5f4 12 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
5bbb14a3715d 12 minutes ago /bin/sh -c #(nop) MAINTAINER chang<10364283… 0B
300e315adb2f 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD 与 ENTRYPOINT的区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
# 编写 dockerfile文件
[root@localhost dockerfile]# vim docker-cmd-test
[root@localhost dockerfile]# cat docker-cmd-test
FROM centos
CMD ["ls","-a"]
# 构建镜像
[root@localhost dockerfile]# docker build -f docker-cmd-test -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
---> Running in c64016257e17
Removing intermediate container c64016257e17
---> 022017435f9b
Successfully built 022017435f9b
Successfully tagged cmdtest:latest
# 启动镜像 发现我们的 ls -a 生效
[root@localhost dockerfile]# docker run 022017435f9b
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 想追加一个命令 -l 组成 ls -al
[root@localhost dockerfile]# docker run 022017435f9b -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
# cmd 的情况下 -l 替换了 CMD ["ls","-a"] 命令, 而 -l 不是命令所以报错
测试ENTRYPOINT
# 编写dockerfile文件
[root@localhost dockerfile]# vim docker-cmd-entrypoint
[root@localhost dockerfile]# cat docker-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
[root@localhost dockerfile]# docker build -f docker-cmd-entrypoint -t entrypoint-test .
Sending build context to Docker daemon 4.096kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in c57a7ae32002
Removing intermediate container c57a7ae32002
---> 4b70eadb3d95
Successfully built 4b70eadb3d95
Successfully tagged entrypoint-test:latest
# 启动镜像 发现我们的 ls -a 生效
[root@localhost dockerfile]# docker run 4b70eadb3d95
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 我们的追加命令,是直接拼接在 ENTRYPOINT 命令之后的
[root@localhost dockerfile]# docker run 4b70eadb3d95 -l
total 0
drwxr-xr-x. 1 root root 6 Jun 9 07:03 .
drwxr-xr-x. 1 root root 6 Jun 9 07:03 ..
-rwxr-xr-x. 1 root root 0 Jun 9 07:03 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jun 9 07:03 dev
drwxr-xr-x. 1 root root 66 Jun 9 07:03 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 Dec 4 2020 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. 105 root root 0 Jun 9 07:03 proc
dr-xr-x---. 2 root root 162 Dec 4 2020 root
drwxr-xr-x. 11 root root 163 Dec 4 2020 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 Jun 8 13:19 sys
drwxrwxrwt. 7 root root 145 Dec 4 2020 tmp
drwxr-xr-x. 12 root root 144 Dec 4 2020 usr
drwxr-xr-x. 20 root root 262 Dec 4 2020 var
DockerFile中很多命令都十分相似,我们需要了解他们的区别,我们最好的学习就是对比他们然后测试效果。
构建自己的Tomcat镜像
- 准备镜像文件
准备tomcat压缩包,jdk压缩包
# 下载tomcat
# 去tomcat库查看想要下载的版本
https://mirrors.cnnic.cn/apache/tomcat/
# 选择一个版本下载
[root@localhost docker-tomcat]# wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.46/bin/apache-tomcat-9.0.46.tar.gz
# 下载jdk1.8
[root@localhost docker-tomcat]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
准备好的文件夹
- 编写dockerfile文件 ,官方命名
Dockerfile
,build会自动寻找这个文件,就不需要-f 指定了 ``` [root@localhost docker-tomcat]# vim Dockerfile [root@localhost docker-tomcat]# cat Dockerfile FROM centos MAINTAINER chang1036428339@qq.com
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u131-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.46.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_131 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.46 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.46 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.46/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.46/bin/logs/catalina.out [root@localhost docker-tomcat]# ll 总用量 192424 -rw-r—r—. 1 root root 11496577 5月 9 02:06 apache-tomcat-9.0.46.tar.gz -rw-r—r—. 1 root root 633 6月 9 17:41 Dockerfile -rw-r—r—. 1 root root 185540433 3月 16 2017 jdk-8u131-linux-x64.tar.gz -rw-r—r—. 1 root root 0 6月 9 17:22 readme.txt
3. 构建镜像
[root@localhost docker-tomcat]# docker build -t diytomcat . Sending build context to Docker daemon 197MB Step 1/15 : FROM centos … Successfully built 7c14ebd45b68 Successfully tagged diytomcat:latest [root@localhost docker-tomcat]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE diytomcat latest 7c14ebd45b68 About a minute ago 662MB
4. run镜像
docker run -d -p 9090:8080 —name mytomcat -v /home/docker-tomcat/test:/usr/local/apache-tomcat-9.0.46/webapps/test -v /home/docker-tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.46/logs diytomcat
5. 访问测试
curl localhost:9090
6. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
文件目录
[root@localhost test]# pwd /home/docker-tomcat/test [root@localhost test]# ls index.jsp WEB-INF [root@localhost test]# cd WEB-INF/ [root@localhost WEB-INF]# ls web.xml [root@localhost WEB-INF]#
WEB-INF
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test log----");
%>
</body>
</html>
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!
发布自己的镜像
发布到DockerHub上
- 地址 https://hub.docker.com/ 注册自己的账号
- 确定这个账号可以登录
- 登录 ``` [root@localhost ~]# 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
登录
[root@localhost ~]# docker login -u 1036428339 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`
直接push 会发现push不上去,因为如果没有前缀的话默认是push到 官方的library
[root@localhost ~]# docker push 1036428339/diytomcat:1.0 The push refers to repository [docker.io/1036428339/diytomcat] An image does not exist locally with the tag: 1036428339/diytomcat
解决方法
第一种 build的时候添加你的dockerhub用户名,然后在push就可以放到自己的仓库了
docker build -t dockerhub用户名/镜像名称:版本 .
第二种 使用docker tag 修改镜像名称 然后再push到自己的仓库
docker tag 容器id dockerhub用户名/镜像名称:版本
测试第二种方式
查看镜像
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB
重命名
[root@localhost ~]# docker tag d1165f221234 1036428339/myhelloworld:1.0 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 1036428339/myhelloworld 1.0 d1165f221234 3 months ago 13.3kB hello-world latest d1165f221234 3 months ago 13.3kB
push到dockerhub自己的仓库
[root@localhost ~]# docker push 1036428339/myhelloworld:1.0 The push refers to repository [docker.io/1036428339/myhelloworld] f22b99068db9: Mounted from library/hello-world 1.0: digest: sha256:1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792 size: 525
到dockerhub官网上查看<br />
<a name="aTz3O"></a>
#### 发布到阿里云镜像服务上
1. 登录阿里云[https://cr.console.aliyun.com/cn-hangzhou/instance/repositories](https://cr.console.aliyun.com/cn-hangzhou/instance/repositories)
1. 找到容器镜像服务

3. 创建命名空间

4. 创建容器镜像
<br /><br />
5. 具体操作官网写的很详细了

如果登录了dockerhub要先退出
[root@localhost ~]# docker logout Removing login credentials for https://index.docker.io/v1/
登录阿里云账号
[root@localhost ~]# docker login —username=雪落书窗 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@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB [root@localhost ~]# docker tag d1165f221234 registry.cn-hangzhou.aliyuncs.com/1036428339/test:1.0 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.cn-hangzhou.aliyuncs.com/1036428339/test 1.0 d1165f221234 3 months ago 13.3kB 1036428339/myhelloworld 1.0 d1165f221234 3 months ago 13.3kB
push 本地镜像到阿里云
[root@localhost ~]# docker push registry.cn-hangzhou.aliyuncs.com/1036428339/test:1.0
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/1036428339/test]
f22b99068db9: Pushed
1.0: digest: sha256:1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792 size: 525
```
到阿里云官网上查看版本信息