飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一:编写一个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 hello
exec 模式类似于 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,当指定多个时,只有最后一个起效。

posted on 2020-10-08 20:25  飞行的猪哼哼  阅读(55)  评论(0)    收藏  举报