把python项目部署成docker
1.安装docker
从https://download.docker.com/linux/ubuntu/dists/, 选择合适的Ubuntu版本, 索引至 pool/stable/, 选择 amd64、armhf、 arm64、ppc64el或者s390x, 下载想要的Docker CE version对应的 .deb 文件。
此处下载了docker-ce_17.03.3_ce-0_ubuntu-xenial_amd64.deb
在linux放置.deb文件的目录下执行:
$sudo dpkg -i docker-ce_17.03.3_ce-0_ubuntu-xenial_amd64.deb
测试能否运行docker测试镜像:
$sudo docker run hello-world
执行docker,验证是否安装成功:
$docker
查看docker版本:
$docker --version
$docker version
2.Python项目结构
其中,hello_demo与requirements.txt与Dockerfile平级。
hello_demo是项目代码。
requirements.txt是项目所需的依赖包。
Dockerfile是用于构建docker镜像的文件。
平时启动python项目,只需要运行hello_demo下的app.py即可:
现在希望将该工程部署到docker里面,使用容器启动。可以采用基于Dockerfile的构建方式。
3.编写Dockerfile,构建docker镜像和容器
可以有两种方式编写Dockerfile。
(1)第一种方式:Dockerfile中指定项目路径及启动方式
Dockerfile内容:
基于Dockerfile构建镜像,在linux下执行命令
$sudo docker build -t docker_hello_demo_img .
运行镜像,生成并启动容器
$sudo docker run --restart=always -it -p 20001:20001 docker_hello_demo_img
(2)第二种方式:Dockerfile中不指定,生成并启动容器时再指定项目路径及启动方式
Dockerfile内容:
基于Dockerfile构建镜像,在linux下执行命令
$sudo docker build -t docker_hello_demo_img2 .
运行镜像,生成并启动容器
$sudo docker run --restart=always -it
-p 20002:20001
-v $PWD/hello_demo:/code/hello_demo
-w /code/hello_demo
docker_hello_demo_img2
python app.py
命令说明:
-v $PWD/hello_demo:/code/hello_demo :将主机中当前目录下的hello_demo挂载到容器的/code/hello_demo
-w /code/hello_demo :指定容器的/code/hello_demo目录为工作目录
python app.py :使用容器的python命令来执行工作目录中的app.py文件
还可以将挂载到容器的项目文件设为只读:
$sudo docker run --restart=always -it
-p 20003:20001
-v $PWD/hello_demo:/code/hello_demo:ro
-w /code/hello_demo
docker_hello_demo_img3
python app.py
命令说明:
:ro:将容器内的/code/hello_demo目录设置为只读
4.docker挂载共享多个本地文件目录
若存在多个文件目录需要共享,则使用多个-v分别指定。
如:hello_demo为整个项目代码,/code/data为项目运行过程中可能产生的数据,将其分别挂载到本机的不同目录中,在linux下执行命令:
$sudo docker run --restart=always -it
-p 20004:20001
-v $PWD/hello_demo:/code/hello_demo:ro
-v /home/dell2/nlp/guazai_data:/code/data
-w /code/hello_demo
docker_hello_demo_img4
python app.py
命令说明:
-v $PWD/hello_demo:/code/hello_demo:ro :将主机中当前目录下的hello_demo挂载到容器的/code/hello_demo(只读模式)
-v /home/dell2/nlp/guazai_data:/code/data :将主机中的/home/dell2/nlp/guazai_data挂载到容器的/code/data
5.上传镜像到仓库,方便内网使用
135服务器上:
下载镜像registry
docker pull registry
运行registry容器,构建私有仓库
sudo docker run -itd -v /data/registry:/var/lib/registry -p 5600:5000 --restart=always --name registry registry:latest
修改镜像源下载地址
sudo vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://registry.docker-cn.com”],
“insecure-registries”: [“192.168.3.135:5600”]
}
重启docker服务,使配置生效
systemctl restart docker
为想要推送的镜像打标签
sudo docker tag docker_hello_demo_img:latest 192.168.3.135:5600/docker_hello_demo_img:latest
推送到镜像服务器
sudo docker push 192.168.3.135:5600/docker_hello_demo_img:latest
列出仓库中的所有镜像
curl http://192.168.3.135:5600/v2/_catalog
129服务器上:
修改镜像源下载地址
{
“registry-mirrors”: [“http://hub-mirror.c.163.com”],
“insecure-registries”: [ “192.168.3.135:5600”]
}
重启docker服务,使配置生效
systemctl restart docker
拉镜像
sudo docker pull 192.168.3.135:5600/docker_hello_demo_img:latest
6.常用命令
查看镜像
docker images
删除指定镜像
docker image rm image_name
删除none镜像(构建镜像过程中因为脚本错误导致很多镜像构建终止,产生很多none标签的版本)
docker rmi $(docker images | grep “none” | awk ‘{print $3}’)
打包镜像(测试环境)
docker save -o package.tar image_name
导入镜像(生产环境)
docker load -i package.tar
运行镜像,生成并启动容器
sudo docker run -it -p 20001:20001 image_name
查看容器:
docker ps -a
删除指定容器
docker kill docker_name
docker rm docker_name
一次性删除所有容器
docker rm $(docker ps -a -q)
进入容器
sudo docker exec -it docker_name /bin/bash
退出容器
Crtl+P+Q