Docker封装+部署到服务器流程

  • 2021/09/24新增
  • 结语:



写这篇文章主要是为了证明自己学会了Docker本地封装+部署到服务器的行为。


本文以下面配置进行说明:


环境:Ubuntu


软件:Django2.2.4


语言:Python3

  1. 在本地拉取镜像
    此步骤是从docker hub里拉取,我找的是最纯净一ubuntu镜像(27M左右)
docker pull ubuntu

当然,你也可以按需拉取。

  1. 运行基础镜像到容器中
    运行这个镜像是为了下一步安装环境。
docker run -it ubuntu /bin/bash

上面的命令没有这么好,因为Docker会随机产生一个名字,不过这个容器在后面对我来说并没有用,反正我会把它删除掉的。
当然提供一下好的命令。

docker run --name yourname -it ubuntu /bin/bash
  1. 操作安装各种环境
    这一步是各种安装环境,由于我一开始选的是最小ubuntu,所以那些软件目录都没有,这个都得安装,后面你会发现有各种方便环境的镜像大概400M左右。
sudo apt-get update
apt install tzdata
# 安装时区
apt-get install python3
# 安装完python3后,你也可以链接命名,但我比较喜欢写python3没有去做
apt-get install python3-pip
pip3 install Django==2.2.4
# 或可以使用一些国内源
pip3 install Django==2.2.4 -i http://mirrors.aliyun.com/pypi/simple/  --trusted-host mirrors.aliyun.com
# 接下来这个是我的项目需求,各位请按需安装
pip3 install requests

以下这个重点注意

apt-get install libmysqlclient-dev
# ubuntu的一定要记得安装这个
# 不然你下一步会报个错误
pip3 install mysqlclient -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

报错展示


root@xxxxxx:/# pip3 install mysqlclient -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.co
m
Looking in indexes: http://mirrors.aliyun.com/pypi/simple/
Collecting mysqlclient
  Downloading http://mirrors.aliyun.com/pypi/packages/3c/df/59cd2fa5e48d0804d213bdcb1acb4d08c403b61c7ff7ed4dd4a6a2deb3f7/mysqlclient-2.0.3.tar.gz (88 kB)
     |████████████████████████████████| 88 kB 1.3 MB/s
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-v7z3p1vz/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-v7z3p1vz/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-v7z3p1vz/mysqlclient/pip-egg-info
         cwd: /tmp/pip-install-v7z3p1vz/mysqlclient/
    Complete output (15 lines):
    /bin/sh: 1: mysql_config: not found
    /bin/sh: 1: mariadb_config: not found
    /bin/sh: 1: mysql_config: not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-v7z3p1vz/mysqlclient/setup.py", line 15, in <module>
        metadata, options = get_config()
      File "/tmp/pip-install-v7z3p1vz/mysqlclient/setup_posix.py", line 70, in get_config
        libs = mysql_config("libs")
      File "/tmp/pip-install-v7z3p1vz/mysqlclient/setup_posix.py", line 31, in mysql_config
        raise OSError("{} not found".format(_mysql_config_path))
    OSError: mysql_config not found
    mysql_config --version
    mariadb_config --version
    mysql_config --libs
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
  1. 提交生成镜像
    提交一版镜像,当你提交完这版镜像后,以后是相同配置项目可以从这一版上去封装。
docker ps -a
# 找到你配置好的那个容器
docker commit -m='python3+django2' -a='Dish' containerid imagename:tag    # will do many time
# 其中上面命令里的containerid需要你找到改成你的
# 其中上面命令imagename:tag是你的自定义命令,以后你找本地的镜像就是靠它了。
  1. 编写Dockerfile文件
    在你的项目文件里编Dockerfile,这里只是一种方法,就是把你的项目封装到镜像里,这个是官方文档的推荐。
    还有一种方法,把项目放到实体机里,容器连接到实体机的文件夹,这种方法似乎方便项目的修改,使用在不成熟的项目代码,或需要不段进版的代码情况。
    如果有生之年有机会,会再写一篇文章讲那个吧。
    这里的做法是把你的项目封装到镜像里。
FROM ubuntu:v0.1
 WORKDIR /MyProject
 COPY MyProject .
 EXPOSE 8001
 CMD python3 manage.py runserver 0.0.0.0:8001 > log.log

基中:

FROM ———— 你要选择的镜像,就是你上一步自定义的,如果你不记得,请docker images一下
WORKDIR ———— 项目路径,在进入容器后的位置
COPY dir1 . ———— 注意,这一行是把项目复制进去。再注意一下,它是以Dockerfile所在的地方为当前目录,是COPY的动作是你选定目录的所有文件。对于这个项目,Dockerfile没有与manege.py在同一目录,会导致找不到文件。要注意与CMD的搭配。
EXPOSE ———— 你要暴露出的端口,指的是容器的端口。
CMD ———— 启动容器要执行的命令。
  1. 编译生成image
    使用命令行进入你的项目中有Dockerfile的路径,就当作你们都懂的,不展示出来了。
    编译。
docker build -t yourimagename:tag .

注意结尾是一个点的,代表你编译当前目录。

  1. 将image运行到容器作测试
docker run --name yournewname -d -p 8000:8001 yourimagename:tag

在本地运行一下看有没有问题,如果有问题,一运行就会退出,导致你在docker ps看不到它。你需要用docker ps -a才看得到它EXIT的状态。
这时我们可以看看他的log信息。

docker logs yournewname
# yournewname 指的是你的容器名
  1. 将image打包
    当在本地运行没有问题,你就可以打包了。
docker save yourimagename:tag > yourimagename.tar
  1. 传输到你的服务器
    就你的喜好去做,不解释了。
  2. 在服务器上加载你的image
    当把tar包传输上服务器后,找到它,使用命令
docker load < yourimagename.tar
  1. 在服务器上将image运行到容器
    同第7步,当然你也可以定制一些其他动作。

2021/09/24新增

sudo docker run --name yournewname -p 8883:8001 -v /mnt/yourlocalpath/www:/home -w /home/containerpath -d yourimagename:tag sh -c "python3 manage.py runserver 0.0.0.0:8001 > log.log"

根据不断的学习研究,发现使用挂载目录的方式比较方便,所以记录下这个命令。
注意:
当使用docker型mysql时,记得此项目的容器要与mysql在同一个网段里。

sudo docker run --name yournewname --network yournetname --ip 172.121.0.101 -p 8883:8001 -v /mnt/yourlocalpath/www:/home -w /home/containerpath -d yourimagename:tag sh -c "python3 manage.py runserver 0.0.0.0:8001 > log.log"

结语:

软件总会遇到一下玄学问题,请自求多福吧。项目无情人有情!