Docker封装+部署到服务器流程
- 2021/09/24新增
- 结语:
写这篇文章主要是为了证明自己学会了Docker本地封装+部署到服务器的行为。
本文以下面配置进行说明:
环境:Ubuntu
软件:Django2.2.4
语言:Python3
- 在本地拉取镜像
此步骤是从docker hub里拉取,我找的是最纯净一ubuntu镜像(27M左右)
docker pull ubuntu
当然,你也可以按需拉取。
- 运行基础镜像到容器中
运行这个镜像是为了下一步安装环境。
docker run -it ubuntu /bin/bash
上面的命令没有这么好,因为Docker会随机产生一个名字,不过这个容器在后面对我来说并没有用,反正我会把它删除掉的。
当然提供一下好的命令。
docker run --name yourname -it ubuntu /bin/bash
- 操作安装各种环境
这一步是各种安装环境,由于我一开始选的是最小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.
- 提交生成镜像
提交一版镜像,当你提交完这版镜像后,以后是相同配置项目可以从这一版上去封装。
docker ps -a
# 找到你配置好的那个容器
docker commit -m='python3+django2' -a='Dish' containerid imagename:tag # will do many time
# 其中上面命令里的containerid需要你找到改成你的
# 其中上面命令imagename:tag是你的自定义命令,以后你找本地的镜像就是靠它了。
- 编写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 ———— 启动容器要执行的命令。
- 编译生成image
使用命令行进入你的项目中有Dockerfile的路径,就当作你们都懂的,不展示出来了。
编译。
docker build -t yourimagename:tag .
注意结尾是一个点的,代表你编译当前目录。
- 将image运行到容器作测试
docker run --name yournewname -d -p 8000:8001 yourimagename:tag
在本地运行一下看有没有问题,如果有问题,一运行就会退出,导致你在docker ps
看不到它。你需要用docker ps -a
才看得到它EXIT的状态。
这时我们可以看看他的log信息。
docker logs yournewname
# yournewname 指的是你的容器名
- 将image打包
当在本地运行没有问题,你就可以打包了。
docker save yourimagename:tag > yourimagename.tar
- 传输到你的服务器
就你的喜好去做,不解释了。 - 在服务器上加载你的image
当把tar包传输上服务器后,找到它,使用命令
docker load < yourimagename.tar
- 在服务器上将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"
结语:
软件总会遇到一下玄学问题,请自求多福吧。项目无情人有情!