Docker镜像与制作
Docker镜像是没有内核的,镜像在启动为容器后将直接使用宿主机的内核。
Docker镜像的制作分为了手动制作和自动制作(基于DockerFile)
1、制作nginx镜像
先准备一个目录,
mkdir docker-images && cd docker-images
编写Dockerfile文件
vi Dockerfile
# 使用ubuntu16.04作为基础镜像
FROM ubuntu:16.04
# apt-get更新 并 安装 nginx
RUN apt-get update && \
apt-get install -y nginx
# 将nginx.conf 移动到/etc/nginx/nginx.conf下
COPY nginx.conf /etc/nginx/nginx.conf
# open 80 port
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
在该目录下编写nginx.conf文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
sendfile on;
server {
listen 80;
server_name localhost;
root /var/www/html;
location / {
index index.html;
}
}
}
构建docker镜像:
docker build -f ./Dockerfile -t my-nginx-image:v1 .
-f 后跟Dockerfile所在的路径
-t 后跟构建的镜像名
:v1 表示版本
出现以下表明镜像构建成功
Removing intermediate container 91b3eb96a75e
---> 54846b071710
Step 3/5 : COPY nginx.conf /etc/nginx/nginx.conf
---> 7cced5bd27de
Step 4/5 : EXPOSE 80
---> Running in a216d7411efd
Removing intermediate container a216d7411efd
---> 084d1d3e2ec7
Step 5/5 : CMD ["nginx","-g","daemon off;"]
---> Running in cb05b809ba3d
Removing intermediate container cb05b809ba3d
---> c35831dffa0c
Successfully built c35831dffa0c
Successfully tagged my-nginx-image:latest
查看构建好的镜像:
root@ubuntu:~/docker-images# docker images | grep my-nginx-image
my-nginx-image v1 c35831dffa0c 23 minutes ago 222MB
后台运行该镜像:
root@ubuntu:~/docker-images# docker run -it -d -p 80:80 my-nginx-image:v1
7080e80685a0e30161ac4efffa50ffb7d7e787d9ed6ba93bcd2566b993903683
-d:后台运行
-p:指定端口
接下来我们打开浏览器,输入http://ip:80就可以看到nginx的欢迎界面
2、制作jdk、tomcat镜像
2.1、制作ubuntu镜像
以ubuntu为基础镜像
首先我们先建立目录
mkdir dockerfile/{web/{nginx,tomcat,apache},system/{ubuntu}} -pv
建立完成后的目录树如下图所示:
root@ubuntu:~/dockerfile# ls
system web
root@ubuntu:~/dockerfile# cd system/
root@ubuntu:~/dockerfile/system# ls
ubuntu
root@ubuntu:~/dockerfile/system# cd ubuntu/
在ubuntu这个目录下,创建一个Dockerfile文件,用于制作基础镜像,我这是以ubuntu16.04为基础镜像的,大家做的时候可以用新一点的。
FROM ubuntu:16.04
MAINTAINER XiaoMing ho1256@163.com
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y curl wget git vim
再编写一个脚本文件build-command.sh
#!/bin/bash
docker build -t ubuntu-base:v1 .
执行脚本文件
bash build-command.sh
我们的Ubuntu基础镜像就做好了,查看镜像
root@ubuntu:~/dockerfile/system/ubuntu# docker images ubuntu-base:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-base v1 a821358eaa58 9 minutes ago 309MB
2.2、制作jdk镜像
首先我们先下载jdk的Linux安装包,
jdk下载网址
下载完成后传输到之前建立好的jdk目录下。
进入到jdk目录下
root@ubuntu:~/dockerfile# cd web/jdk/
编写Dockerfile文件
FROM ubuntu-base:v1
# 拷贝jdk安装包和环境变量脚本
COPY jdk-20_linux-x64_bin.tar.gz /opt
COPY env.sh /etc/profile.d/
RUN chmod a+x /etc/profile.d/env.sh
# 解压安装包并设置环境变量
RUN tar -zxvf /opt/jdk-20_linux-x64_bin.tar.gz -C /usr/local
ENV JAVA_HOME=/usr/local/jdk-20.0.1
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 清除无用数据
RUN rm -rf /opt/jdk-20_linux-x64_bin.tar.gz
# 设置容器命令和参数
CMD ["/bin/bash"]
编写环境设置脚本env.sh
#!/bin/bash
export JAVA_HOME=/usr/local/jdk2.0
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
编写构建jdk镜像脚本
#!/bin/bash
docker build -t jdk-base:v1 .
执行构建脚本
bash build-command.sh
...
Removing intermediate container 963e3b68177f
---> f2bac051098d
Step 9/10 : RUN rm -rf /opt/jdk-20_linux-x64_bin.tar.gz
---> Running in 02ab3265deab
Removing intermediate container 02ab3265deab
---> a495eb009b51
Step 10/10 : CMD ["/bin/bash"]
---> Running in a6b41488f99b
Removing intermediate container a6b41488f99b
---> 275d7da27ed8
Successfully built 275d7da27ed8
Successfully tagged jdk-base:v1
出现上图表示构建成功!
查看构建好的镜像:
root@ubuntu:~/dockerfile/web/jdk# docker images jdk-base:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
jdk-base v1 275d7da27ed8 26 seconds ago 836MB
从镜像创建出一个测试容器,验证容器的中的 JDK 环境是否可用
root@ubuntu:~/dockerfile/web/jdk# docker run -it --rm jdk-base:v1 bash
root@05defad8b75f:/# java --version
java 20.0.1 2023-04-18
Java(TM) SE Runtime Environment (build 20.0.1+9-29)
Java HotSpot(TM) 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing)
出现上述情况,证明java环境可用
命令参数解释:
docker run: 命令用于启动一个新的容器。如果该镜像还没有本地副本,Docker 将会自动从 Docker Hub 下载该镜像。
-it: 参数表示使用交互式终端运行容器,在容器内部执行命令,并且通过 STDIN、STDOUT 和 STDERR 连接到容器的 TTY 设备上。
–rm: 参数会在容器停止后自动清理掉容器文件系统和资源,这可以避免因为容器不断创建而导致一些冗余的容器产生。
jdk-base:v1: 是指要使用的 Docker 镜像的名称(比如从 Docker Hub 拉取的或者已经本地存在的),其中 jdk-base 表示对应的镜像名称,:v1 是关于镜像版本的标签信息。这里表明了启动该容器需要用到的镜像是名字为 jdk-base,按照标签为 v1 所对应的镜像版本。
bash: 是 Docker 启动容器时默认执行的命令。这里使用 bash 来启动一个交互式的 Bash 终端。你可以在容器中运行其他命令,例如 java 命令或者其他 shell 命令。
在该容器里写一个简单的HelloWorld.java去测试java环境:
root@ubuntu:~/dockerfile/web/jdk# docker run -it --rm jdk-base:v1 bash
root@05defad8b75f:/# vi hello.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
保存退出
编译
javac HelloWorld.java
会生成一个HelloWorld.class文件
运行
root@05defad8b75f:/# java HelloWorld.java
Hello, World!
最后,退出测试容器
root@05defad8b75f:/# exit
exit
2.3、制作tomcat镜像
首先制作一个tomcat基础镜像
在tomcat目录下。创建一个tomcat-base目录并进入:
mkdir tomcat-base && cd tomcat-base
下载tomcat的linux安装包,tomcat下载地址
上传到该目录下
编写Dockerfile文件
# Tomcat Base Image
# 以jdk-base:v1为基础镜像
FROM jdk-base:v1
# env
ENV LANG en_US.UTF-8
# 主版本号
ENV TOMCAT_MAJOR_VERSION 8
# 次版本号
ENV TOMCAT_MINOR_VERSION 8.5.88
# tomcat的安装路径
ENV CATALINA_HOME /apps/tomcat
# tomcat的安装目录
ENV APP_DIR ${CATALINE_HOME}/webapps
# tomcat
RUN mkdir /apps
# 解压压缩包并复制到/apps目录下 这样做不太安全,可以使用 COPY先把压缩包传过去,再解压
ADD apache-tomcat-8.5.88.tar.gz /apps
# 创建一个软链接
RUN ln -sv /apps/apache-tomcat-8.5.88 /apps/tomcat
编写构建脚本
vi build-command.sh
#!/bin/bash
docker build -t tomcat-base:v8.5.88 .
执行构建脚本
bash build-command.sh
查看构建好的镜像
root@ubuntu:~/dockerfile/web/tomact/tomcat-base# docker images tomcat-base:v8.5.88
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-base v8.5.88 1c1ba0f43eee 10 minutes ago 851MB
使用构建好的镜像启动容器并进入:
docker run -it tomcat-base:v8.5.88