常见指令
FROM # 基础镜像,从此开始构建
MAINTAINER # 镜像作者,通常为姓名+邮箱
RUN # 镜像构建时需要执行的命令
ADD # 在镜像中需要添加的文件(比如基础镜像centos中要添加tomcat)
WORKDIR # 镜像的工作目录
VOLUME # 容器数据卷,挂载主机的目录
EXPOSE # 对外的暴露端口
CMD # 指定容器启动时要运行的命令(只有最后一个生效,可被替代)
ENTRYPOINT # 指定容器启动时要运行的命令(可以追加命令)
ONBUILD # 当构建一个被继承DockerFile时就会运行ONBUILD指令
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建时的环境变量
构建自己的CentOS
- 编写dockerfile
基于官网的centos构建自己的centos,编写一个centos-dockerfile
[root@ecs-98457 ~]# cd /home
[root@ecs-98457 home]# ls
docker-test-volume mysql test test.java
[root@ecs-98457 home]# mkdir dockerfile
[root@ecs-98457 home]# cd dockerfile/
[root@ecs-98457 dockerfile]# vim centos-dockerfile
[root@ecs-98457 dockerfile]# cat centos-dockerfile
FROM centos:7
MAINTAINER cxz<1565976786@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 8088
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
[root@ecs-98457 dockerfile]#
由于从2022年1月31日起,CentOS开发团队将会移除官方镜像源上关于CentOS 8所有的包,届时如果在CentOS 8上再次使用yum命令安装包则会报以下错误:
下载元数据失败:Cannot prepare internal mirrorlist: No URLs in mirrorlist
所以我们在构建自己的centos时我们指定版本 不要使用最新的centos去生成自己的版本 不然构建的时候会报以下错误
CentOS Linux 8 - AppStream 55 B/s | 38 B 00:00
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum -y install vim' returned a non-zero code: 1
- 通过dockerfile构建镜像
[root@ecs-98457 dockerfile]# docker build -f centos-dockerfile -t mycentos:1.0 .
此时我们就构建成功了
Complete!
Removing intermediate container 373fa0d2d62b
---> 4d6864b4cf26
Step 7/10 : EXPOSE 8088
---> Running in ace7432279aa
Removing intermediate container ace7432279aa
---> 8072ccf727ac
Step 8/10 : CMD echo $MYPATH
---> Running in 1d20aa3f54ff
Removing intermediate container 1d20aa3f54ff
---> 1d68a6018926
Step 9/10 : CMD echo "----end----"
---> Running in 1c602eeae2ae
Removing intermediate container 1c602eeae2ae
---> a170cf3e4cf1
Step 10/10 : CMD /bin/bash
---> Running in 331bb123fc50
Removing intermediate container 331bb123fc50
---> 3d4b8ade0459
Successfully built 3d4b8ade0459
Successfully tagged mycentos:1.0
我们可以用docker history命令查看镜像的构建过程
[root@ecs-98457 dockerfile]# docker history 3d4b8ade0459
IMAGE CREATED CREATED BY SIZE COMMENT
3d4b8ade0459 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
a170cf3e4cf1 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
1d68a6018926 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
8072ccf727ac 8 minutes ago /bin/sh -c #(nop) EXPOSE 8088 0B
4d6864b4cf26 8 minutes ago /bin/sh -c yum -y install net-tools 166MB
81ca0fe0f93a 8 minutes ago /bin/sh -c yum -y install vim 221MB
10d8a87b6077 9 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
50fd685fa166 9 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
6902fa334194 9 minutes ago /bin/sh -c #(nop) MAINTAINER cxz<1565976786… 0B
eeb6ee3f44bd 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:b3ebbe8bd304723d4… 204MB
[root@ecs-98457 dockerfile]#
- 通过镜像启动容器
root@ecs-98457 dockerfile]# docker run -it mycentos:1.0
[root@9c17eabd42c5 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 656 (656.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 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
[root@9c17eabd42c5 local]# vim test.text
[root@9c17eabd42c5 local]#
对比之前官方的centos,新增了ifconfig、vim等命令
构建自己的Tomcat
准备Tomcat压缩包,而Tomcat运行需要依赖于jdk,所以还需要jdk的压缩包
tomcat下载地址:https://tomcat.apache.org/download-90.cgi
jdk下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
通过FileZilla将压缩包上传到liunx服务器
[root@ecs-98457 tomcat]# ls
apache-tomcat-9.0.62.tar.gz jdk-8u321-linux-x64.tar.gz readme.txt
编写dockerfile文件
编写dockerfile文件,官方命名为Dockerfile,这样就不需要通过-f指定,build时会自动寻找这个文件
[root@ecs-98457 tomcat]# cat Dockerfile
FROM centos:7
MAINTAINER cxz<1565976786@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u321-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_321
ENV CALSSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.62/bin/logs/catalina.out
ADD jdk-8u321-linux-x64.tar.gz /usr/local/
后面的 /usr/local/ 指定jdk解压到该目录下 运行是会自动解压
ENV JAVA_HOME /usr/local/jdk1.8.0_321
/usr/local/jdk1.8.0_321 为解压后的路径 不要配置错了 不然jdk启动不起来 测试连接是连接不上的
curl: (56) Recv failure: Connection reset by peer
构建镜像
[root@ecs-98457 tomcat]# docker build -t mytomcat .
Sending build context to Docker daemon 158.4MB
Step 1/15 : FROM centos:7
---> eeb6ee3f44bd
Step 2/15 : MAINTAINER cxz<1565976786@qq.com>
---> Using cache
---> 6902fa334194
Step 3/15 : COPY readme.txt /usr/local/readme.txt
---> 3013ceeb61f8
Step 4/15 : ADD jdk-8u321-linux-x64.tar.gz /usr/local/
---> 26e27156c5be
Step 5/15 : ADD apache-tomcat-9.0.62.tar.gz /usr/local/
---> 789531130a1d
Step 6/15 : RUN yum -y install vim
---> Running in da1e7e23c4ea
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.bfsu.edu.cn
* extras: mirrors.huaweicloud.com
* updates: mirrors.tuna.tsinghua.edu.cn
Resolving Dependencies
--> Running transaction check
#运行镜像
[root@ecs-98457 tomcat]# docker run -d -p 9090:8080 --name cxztomcat14 -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test -v /home/tomcat/logs:/usr/local/apache-tomcat-9.0.62/logs mytomcat
c8efaa82a1e94b4a545949fd4a8f1681519d13acf26a71bd919c921a508f8a43
[root@ecs-98457 tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8efaa82a1e9 mytomcat "/bin/sh -c '/usr/lo…" 3 seconds ago Up 3 seconds 0.0.0.0:9090->8080/tcp, :::9090->8080/tcp cxztomcat14
3b8360afe6d5 centos:7 "/bin/bash" 39 minutes ago Up 39 minutes dreamy_pare
bed5c3e5f6c5 centos "/bin/bash" 43 minutes ago Up 43 minutes pensive_galois
774984d47194 nginx "/docker-entrypoint.…" 51 minutes ago Up 51 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
#测试连接
[root@ecs-98457 tomcat]# curl localhost:9090
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.62</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">
<div id="navigation" class="curved container">
<span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
<span id="nav-hosts"><a href="/docs/">Documentation</a></span>
<span id="nav-config"><a href="/docs/config/">Configuration</a></span>
发布项目
我们已经做了卷挂载,本机的/home/tomcat/test挂载到容器的/usr/local/apache-tomcat-9.0.41/webapps/test目录,因此我们只需要在本机对应目录项发布项目就会自动同步到容器中
我们在/home/tomcat/test目录下新建WEB-INF目录,在其中创建web.xml文件
[root@ecs-98457 tomcat]# cd test/
[root@ecs-98457 test]# ls
[root@ecs-98457 test]# mkdir WEB-INF
[root@ecs-98457 test]# ls
WEB-INF
[root@ecs-98457 test]# cd WEB-INF/
[root@ecs-98457 WEB-INF]# vim web.xml
[root@ecs-98457 WEB-INF]# cat web.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>
然后在test目录下创建一个index.jsp页面
[root@ecs-98457 test]# cat index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>zsr</title>
</head>
<body>
Hello World!<br/>
<%
out.println("mytomcat测试");
%>
</body>
</html>
[root@ecs-98457 test]#
然后浏览器输入localhost:9090/test即可看到页面
发布镜像到 Docker Hub
首先要有自己Docker Hub的账号
- 登录 Docker Hub
docker login命令用于登录
[root@ecs-98457 test]# docker login -u dockerhub账号
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
在push自己的镜像之前 需要使用tag命令在前面加上自己的dockerhub的username 否则会报错
[root@ecs-98457 test]# docker tag 62d0c90bfe7c dockerhub的用户命名/tomcat:1.0
[root@ecs-98457 test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockerhub的用户命名/tomcat 1.0 62d0c90bfe7c 2 hours ago 806MB
cxz/tomcat 1.0 62d0c90bfe7c 2 hours ago 806MB
mytomcat latest 62d0c90bfe7c 2 hours ago 806MB
mycentos 1.0 3d4b8ade0459 6 hours ago 591MB
nginx latest 12766a6745ee 10 days ago 142MB
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
centos 7 eeb6ee3f44bd 6 months ago 204MB
centos latest 5d0da3dc9764 6 months ago 231MB
发布镜像到阿里云镜像仓库
创建阿里云镜像仓库
** 登录阿里云Docker Registry**
docker login --username=bareth registry.cn-beijing.aliyuncs.com
登录的用户名为阿里云账号全名,密码为开通服务时设置的密码
[root@ecs-98457 ~]# docker login --username=chenxuezhou registry.cn-beijing.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@ecs-98457 ~]#
[root@ecs-98457 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
18271904157/tomcat 1.0 62d0c90bfe7c 5 hours ago 806MB
cxz/tomcat 1.0 62d0c90bfe7c 5 hours ago 806MB
mytomcat latest 62d0c90bfe7c 5 hours ago 806MB
mycentos 1.0 3d4b8ade0459 10 hours ago 591MB
nginx latest 12766a6745ee 10 days ago 142MB
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
centos 7 eeb6ee3f44bd 6 months ago 204MB
centos latest 5d0da3dc9764 6 months ago 231MB
[root@ecs-98457 ~]# docker tag 62d0c90bfe7c registry.cn-beijing.aliyuncs.com/docker-cxzcxz/docker-test:1.0
[root@ecs-98457 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
18271904157/tomcat 1.0 62d0c90bfe7c 6 hours ago 806MB
cxz/tomcat 1.0 62d0c90bfe7c 6 hours ago 806MB
mytomcat latest 62d0c90bfe7c 6 hours ago 806MB
registry.cn-beijing.aliyuncs.com/docker-cxzcxz/docker-test 1.0 62d0c90bfe7c 6 hours ago 806MB
mycentos 1.0 3d4b8ade0459 10 hours ago 591MB
nginx latest 12766a6745ee 10 days ago 142MB
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
centos 7 eeb6ee3f44bd 6 months ago 204MB
centos latest 5d0da3dc9764 6 months ago 231MB
#push到阿里云镜像仓库
[root@ecs-98457 ~]# docker pull registry.cn-beijing.aliyuncs.com/docker-cxzcxz/docker-test:1.0