Dockerfile---脚本自动化

    科技2025-10-13  2

    一:编写一个Dockerfile脚本,构造一个具有python3环境的镜像

    1:将原始Ubuntu镜像压缩包放在Desktop桌面。

    python@ubuntu:~/Desktop$ ls meimei_project shopping-mall-project sql脚本 ubuntu.tar.gz 安装包文件

    2:镜像加载

    python@ubuntu:~/Desktop$ docker load < ubuntu.tar.gz 762d8e1a6054: Loading layer 91.39MB/91.39MB e45cfbc98a50: Loading layer 15.87kB/15.87kB d60e01b37e74: Loading layer 12.29kB/12.29kB b57c79f4a9f3: Loading layer 3.072kB/3.072kB 832ff27e250b: Loading layer 187.7MB/187.7MB f22b61b25d5c: Loading layer 3.072kB/3.072kB 2c3a13ec4d99: Loading layer 291MB/291MB 65bbf4f56f02: Loading layer 51.71kB/51.71kB f235a7175832: Loading layer 44.08MB/44.08MB a1174334046d: Loading layer 133.8MB/133.8MB a290c0020912: Loading layer 92.14MB/92.14MB 2317a5d4b684: Loading layer 32.4MB/32.4MB 36dce86146ac: Loading layer 4.961MB/4.961MB Loaded image: ubuntu:18.04

    3: 将镜像运行成容器:

    python@ubuntu:~/Desktop$ docker run -d --network=host ubuntu:18.04 1caf2d13cdec9d32456ad624dc53f81b14bf98fd4a7d9b8d7451538486898c8c

    4:进入容器内部:

    python@ubuntu:~/Desktop$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1caf2d13cdec ubuntu:18.04 "nginx '-g daemon of…" About a minute ago Up About a minute practical_cerf 66987d8aec15 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 192.168.203.153:777->80/tcp nginx-3 56e2e5bd67b7 mysql:5.7.22 "docker-entrypoint.s…" 3 weeks ago Exited (0) 4 days ago mysql-slave b5a7b35611f8 delron/elasticsearch-ik:2.4.6-1.0 "/docker-entrypoint.…" 4 weeks ago Exited (143) 2 days ago elasticsearch f90e380d626a delron/fastdfs "/usr/bin/start1.sh …" 4 weeks ago Exited (137) 3 hours ago storage f951dc81977c delron/fastdfs "/usr/bin/start1.sh …" 4 weeks ago Exited (137) 3 hours ago tracker python@ubuntu:~/Desktop$ docker exec -it 1caf2d13cdec /bin/bash root@ubuntu:/#

    5:安装python3 :

    root@ubuntu:/# apt-get install python3-pip -y 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 python3-pip 已经是最新版 (20.0.2-5ubuntu1)。 升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 259 个软件包未被升级。

    6:生成新的容器:

    python@ubuntu:~/Desktop$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1caf2d13cdec ubuntu:18.04 "nginx '-g daemon of…" 7 minutes ago Up 7 minutes practical_cerf 66987d8aec15 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 192.168.203.153:777->80/tcp nginx-3 56e2e5bd67b7 mysql:5.7.22 "docker-entrypoint.s…" 3 weeks ago Exited (0) 4 days ago mysql-slave b5a7b35611f8 delron/elasticsearch-ik:2.4.6-1.0 "/docker-entrypoint.…" 4 weeks ago Exited (143) 2 days ago elasticsearch f90e380d626a delron/fastdfs "/usr/bin/start1.sh …" 4 weeks ago Exited (137) 3 hours ago storage f951dc81977c delron/fastdfs "/usr/bin/start1.sh …" 4 weeks ago Exited (137) 3 hours ago tracker python@ubuntu:~/Desktop$ docker commit -m "安装python3环境" -a "renshanwen" 1caf2d13cdec python3:V1.0 sha256:49c1e54dce5a0d82bd55a4de621476a9b717988e168393335401501727677d7c

    此时发现多了一个python3的镜像。

    python@ubuntu:~/Desktop$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE python3 V1.0 49c1e54dce5a About a minute ago 852MB ubuntu 18.04 1975b4bd017d 6 hours ago 852MB nginx latest f949e7d76d63 12 months ago 126MB mysql 5.7.22 0d16d0a97dd1 2 years ago 372MB delron/fastdfs latest 8487e86fc6ee 2 years ago 464MB delron/elasticsearch-ik 2.4.6-1.0 095b6487fb77 2 years ago 689MB

    7:总结安装的步骤: 选取一个基础镜像----> 运行成容器—> 进入容器—> 安装需要的环境和部署—>将新的容器提交成新的镜像。

    项目部署—手动搭建镜像

    <一>: 前序操作:

    1:进入meiduo_mall/uwsgi.ini中设置虚拟环境代码注释掉(因为镜像中使用的是全局python,无需指定虚拟环境)

    root@ubuntu:/data/meiduo_mall# vim uwsgi.ini

    2:将meiduo_mall meiduo_mall_admin front_end_pc 打包

    root@ubuntu:/data# ls front_end_pc front_end_pc.tar.gz meiduo_mall meiduo_mall_admin meiduo_mall_admin.tar.gz meiduo_mall.tar.gz

    3:新建目录,拷贝打包文件和配置文件:

    root@ubuntu:/data# ls front_end_pc front_end_pc.tar.gz meiduo_mall meiduo_mall_admin meiduo_mall_admin.tar.gz meiduo_mall.tar.gz root@ubuntu:/data# mkdir base root@ubuntu:/data# mv *.tar.gz base root@ubuntu:/data# ls base front_end_pc meiduo_mall meiduo_mall_admin root@ubuntu:/data# cd base root@ubuntu:/data/base# ls front_end_pc.tar.gz meiduo_mall_admin.tar.gz meiduo_mall.tar.gz root@ubuntu:/data/base# cp /etc/nginx/conf.d/*.conf ./ root@ubuntu:/data/base# ls 8000.conf 8080.conf 8081.conf front_end_pc.tar.gz meiduo_mall_admin.tar.gz meiduo_mall.tar.gz

    4:把ubuntu压缩包恢复镜像,并且运行成容器。

    python@ubuntu:~/Desktop$ docker load < ubuntu.tar.gz python@ubuntu:~/Desktop$ docker container run -d --name meiduo ubuntu:18.04 74e33bfc58944dca7f266de109e7ace72f2c42cc03e0e1679ed0fc2f8d245c59

    进入容器:

    python@ubuntu:~/Desktop$ docker container exec -it meiduo /bin/bash root@74e33bfc5894:/#

    <二>搭建容器—手动构建

    1、安装依赖

    4.1、Nginx安装(韦伟老师给的镜像已经安装好啦) apt-get install nginx -y --allow-unauthenticated 4.2、安装python3环境(韦伟老师给的镜像已经安装好啦) apt-get install python3-pip -y

    2:上传工程文件并解压:

    root@74e33bfc5894:/# scp root@192.168.203.153:/data/base/front_end_pc.tar.gz /data/ root@192.168.203.153's password: front_end_pc.tar.gz 100% 1246KB 121.5MB/s 00:00 root@74e33bfc5894:/# scp root@192.168.203.153:/data/base/meiduo_mall.tar.gz /data/ root@192.168.203.153's password: meiduo_mall.tar.gz 100% 453KB 84.8MB/s 00:00 root@74e33bfc5894:/# scp root@192.168.203.153:/data/base/meiduo_mall_admin.tar.gz /data/ root@192.168.203.153's password: meiduo_mall_admin.tar.gz tar -z xvf front_end_pc.tar.gz tar -z xvf meiduo_mall.gz tar -z xvf meiduo_mall_admin.tar.gz

    3:安装美多工程依赖环境(镜像已经安装好啦)

    cd /data/meiduo_mall

    pip3 install -r requirements.txt 4:上传nginx部署文件:

    root@74e33bfc5894:/# scp root@192.168.203.153:/data/base/8080.conf /etc/nginx/conf.d/ root@192.168.203.153's password: 8080.conf 100% 193 507.0KB/s 00:00 root@74e33bfc5894:/# scp root@192.168.203.153:/data/base/8081.conf /etc/nginx/conf.d/ root@192.168.203.153's password: 8081.conf 100% 185 438.9KB/s 00:00 root@74e33bfc5894:/# scp root@192.168.203.153:/data/base/8000.conf /etc/nginx/conf.d/ root@192.168.203.153's password: 8000.conf

    5:退出重启容器:(目的是重新启动nginx服务)

    python@ubuntu:~/Desktop$ docker restart meiduo meiduo

    6: 进入容器并启动美多工程

    docker container exec -it meiduo /bin/bash cd /data/meiduo_mall uwsgi --ini uwsgi.ini

    <二>搭建容器—脚本构建镜像

    1、编写/data/base/Dockerfile脚本,内容如下:

    # 选择基础镜像 FROM ubuntu:18.04 # 作者 MAINTAINER weiwei # 更新源(韦伟老师给的镜像已经安装好故不用执行) # RUN apt-get update -y # 安装nginx(韦伟老师给的镜像已经安装好故不用执行) # RUN apt-get install nginx -y --allow-unauthenticated # 安装python3(韦伟老师给的镜像已经安装好故不用执行) # RUN apt-get install python3-pip -y # 把工程文件上传容器 ADD front_end_pc.tar.gz /data/ ADD meiduo_mall_admin.tar.gz /data/ ADD meiduo_mall.tar.gz /data/ # 切换到美多工程目录,并且安装依赖(韦伟老师给的镜像已经安装好故不用执行) # WORKDIR /data/meiduo_mall/ # RUN pip3 install -r requirements.txt COPY 8080.conf /etc/nginx/conf.d/ COPY 8081.conf /etc/nginx/conf.d/ COPY 8000.conf /etc/nginx/conf.d/ # 设置环境变量;作用:指定系统语言为UTF-8;如果不设置,uwsgi运行无法处理中文语言 ENV LC_ALL="zh_CN.utf8" # 容器开放端口为8080和8081 EXPOSE 8080 8081 8000 # 发送容器启动脚本 COPY command.sh /data # 切换容器目录 WORKDIR /data # 指定容器运行的启动指令 ENTRYPOINT ["/bin/bash", "command.sh"]

    新建command.sh脚本文件,启动脚本command.sh内容如下:

    cd /data/meiduo_mall/ uwsgi --ini uwsgi.ini nginx -g "daemon off;"

    2、使用Dockerfile脚本生成镜像

    docker image build -t meiduo ./

    3、运行镜像

    docker container run -d --name meiduo --network=host meiduo:latest

    4、使用浏览器访问

    5:注意的问题:

    1: 如果容器的启动是host模式启动,表示容器开放的端口就是宿主机开放的端口,所以在Dockerfile中就可以不指定暴露端口了。因为容器此时的暴露端口就是宿主机暴露的端口。

    基础指令:

    FROM

    格式:

    FROM <image> FROM <image>:<tag>。

    解释:

    FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令

    MAINTAINER

    格式:

    MAINTAINER <name>

    解释:

    指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息

    RUN

    格式:

    RUN <command> (shell模式) RUN ["executable", "param1", "param2"]。 (exec 模式)

    解释:

    表示当前镜像构建时候运行的命令

    注释:

    模式格式示例shell模式类似于 /bin/bash -c commandRUN echo helloexec 模式类似于 RUN ["/bin/bash", “-c”, “command”]RUN [“echo”, “hello”]

    ADD

    格式:

    ADD <src>... <dest> ADD ["<src>",... "<dest>"]

    解释:

    将指定的 文件复制到容器文件系统中的

    src 指的是宿主机,dest 指的是容器

    如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。

    COPY

    格式:

    COPY <src>... <dest> COPY ["<src>",... "<dest>"]

    解释:

    单纯复制文件场景,Docker推荐使用COPY

    WORKDIR

    格式:

    WORKDIR /path/to/workdir (shell 模式)

    解释:

    切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。 相当于cd

    可以多次切换(相当于cd命令),

    也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

    举例:

    WORKDIR /a

    WORKDIR b

    WORKDIR c

    RUN pwd

    则最终路径为 /a/b/c。

    EXPOSE

    格式:

    EXPOSE <port> [<port>...]

    解释:

    设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,还需要启动容器时增加-p或者-P参数对容器的端口进行分配。

    ENTRYPOINT

    格式:

    ENTRYPOINT ["executable", "param1","param2"] (exec 模式) ENTRYPOINT command param1 param2 (shell模式)

    解释:

    每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

    Processed: 0.015, SQL: 8