Docker镜像与制作

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的欢迎界面
Docker镜像与制作_第1张图片

2、制作jdk、tomcat镜像

2.1、制作ubuntu镜像

以ubuntu为基础镜像
首先我们先建立目录

mkdir dockerfile/{web/{nginx,tomcat,apache},system/{ubuntu}} -pv

建立完成后的目录树如下图所示:
Docker镜像与制作_第2张图片

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 [email protected]

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

你可能感兴趣的:(docker,运维,容器)