部署笔记
本文主要记录本人在部署遇到的一些问题以及解决思路做的一些记录,笔记由摘抄+自我理解组成
docker
构建镜像
注意后面有个.
docker build -t 镜像名 .
例如:
docker build -t docker_ai .
挂载镜像
docker run -it --name 镜像名 -p 宿主机端口:虚拟机端口 -v 宿主机绝对路径:镜像内容器路径
例如:
docker run -u root -it --name flask -p 5002:5002 -v /home/project/ai_server:/code docker_ai
docker run
启动容器
docker start id或者name
-a attach
-i 进入交互
例如: docker start flask -i
停止容器
docker stop id或者name
例如: docker stop flask
复制文件进入容器
docker cp xx文件 容器id:容器路径
打包当前容器成为新镜像
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
--help Print usage
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
例如
docker commit cc432d1f6b13 new_anaconda
进入容器
# 进入容器内部
docker exec -it 容器id /bin/bash
# 进入容器的print
docker attach
删除容器或镜像
删除容器
docker rm 容器id
删除镜像
docker rmi 镜像id
保存/加载镜像
若是只想备份images,使用save、load即可。
save是依据镜像来的,所以导入时可以完整保留下每一层layer信息
-
save 保存镜像
save命令是从镜像(images)中导出
docker save [options] images [images…]docker save -o nginx.tar nginx:latest 或者 docker save > nginx.tar nginx:latest 其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
-
load 加载镜像
docker load [options]docker load -i nginx.tar 或 docker load < nginx.tar 其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
保存/加载容器
export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作
-
export 导出容器
export命令是从容器(container)中导出tar文件
docker export [options] containerdocker export -o nginx-test.tar nginx-test 其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)
-
import 导入容器
docker import [options] file|URL|- [REPOSITORY[:TAG]]docker import nginx-test.tar nginx:imp 或 cat nginx-test.tar | docker import - nginx:imp
docker 容器运行出现permission denied
容器使用docker run -v hostvolume:dockervolume,采用这种方式运行如果出现permission denied是因为宿主机的当前运行用户和docker容器里面的运行用户不一致导致访问权限问题。
解决办法:
1、使docker里面的运行用户和宿主一样,运行命令 docker run -u root,docker u参数可以指点以哪个用户运行。
2、在宿主机里面创建和容器默认用户一样的,然后把要映射的文件目录使用chown -R user:group方式修改为docker例的用户。
注意:这里需要查看docker镜像里的制作文件dockerfile。比如EMQ容器制作就如下添加用户
RUN adduser -D -u 1000 emqtt
Docker Swarm 分布式集群
master配置
在Master上安装Docker
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
apt-get update
apt-get install -y docker-ce
创建Manager节点
一个Docker Swarm集群需要Manager节点。现在初始化Master服务器,作为集群的Manager节点。运行下面一条命令。
#端口默认2377
docker swarm init --advertise-addr 192.168.1.138
这个返回结果中,给出了一条命令,这个命令可以
docker swarm join --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377
编写Dockerfile
构建镜像
编写完成Dockerfile以后,执行下面的命令,开始构建我们自己的镜像:
docker build -t localhost:8003/spider .
这里需要特别注意,由于我们要把这个镜像上传到私有源供Slave服务器上面的从节点下载,所以镜像的命名方式需要满足localhost:8003/自定义名字:版本号这样的格式。其中的自定义名字和版本号可以根据实际情况进行修改。
创建服务
docker service create --name spider --network host 45.77.138.242:8003/spider:0.01
创建私有源仓库(可选)
私有源本身也是一个Docker的镜像
docker pull registry:latest
# 或者
docker pull docker.io/registry
启动私有源镜像
docker run -d -p 8003:5000 --name registry -v /home/dockeruser/data:/tmp/registry docker.io/registry:latest
允许docker使用可信任的http私有源
echo '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.json
上传镜像到私有源
镜像构建完成以后,需要把它上传到私有源。此时需要执行命令:
docker push localhost:8003/spider:0.01
重启docker
systemctl restart docker
Slave配置
- 安装Docker
- 加入集群
- 信任源
加入集群
docker swarm join --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377
配置信任源
echo '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.json
更新代码
接下来需要更新服务中的镜像。更新镜像有两种做法。一种是先把所有爬虫关闭,再更新。
docker service scale spider=0
docker service update --image 45.77.138.242:8003/spider:0.02 spider
docker service scale spider=3
第二种是直接执行更新命令。
docker service update --image 45.77.138.242:8003/spider:0.02 spider
可视化 portainer
docker service create \
--name portainer \
--publish 9000:9000 \
--constraint 'node.role == manager' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer \
-H unix:///var/run/docker.sock
docker-compose
Compose 安装
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以下载 Docker Compose 的当前稳定版本:
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.24.1。
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose --version
cker-compose version 1.24.1, build 4667896b
示例
1.docker-compose.yml
version: '2'
services:
flask:
build: .
command: python main.py
ports:
- 5003:5003
volumes:
- /home/project/flask_api-master/:/code/
celery:
build: .
command: celery -A application.base:celery_app worker --loglevel=info -P eventlet
volumes:
- /home/project/flask_api-master/:/code/
持续打印日志
docker-compose logs -f
Git
强制覆盖
git强制覆盖:
git fetch --all
git reset --hard origin/master
git pull
git强制覆盖本地命令(单条执行):
git fetch --all && git reset --hard origin/master && git pull
第一个是:拉取所有更新,不同步;
第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);
第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)
linux
pip3安装包错误跳过
该命令可以跳过安装错误的库,继续安装
while read requirement; do pip3 install $requirement; done < requirements.txt
软链接
创建python3软链接:
(安装python一般会自动生成软链接/usr/bin/python3,如果没有,请将“/usr/bin/python3”改为你安装的python3的位置)
sudo ln -s /usr/bin/python3 /usr/bin/python
同理,pip也一样
sudo ln -s /usr/bin/pip3 /usr/bin/pip
Docker中的Ubuntu 安装vi/vim
依次执行以下命令
先备份一下source.list文件
cp /etc/apt/sources.list /etc/apt/sources.list.bak
然后往文件里写入内容。由于现在没有vi/vim,而且由于ubuntu官方源不在国内,所以只能把内容通过echo方式重定向到文件中。
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse" >/etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse" >>/etc/apt/sources.list
更新apt源
apt-get update
安装vim
apt-get install -y vim
ubuntu防火墙
1.安装
sudo apt-get install ufw
2.启用
sudo ufw enable
sudo ufw default deny
运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。
关闭所有外部对本机的访问,但本机访问外部正常。
3.开启/禁用
sudo ufw allow|deny [service]
打开或关闭某个端口,例如:
sudo ufw allow smtp 允许所有的外部IP访问本机的25/tcp (smtp)端口
sudo ufw allow 22/tcp 允许所有的外部IP访问本机的22/tcp (ssh)端口
sudo ufw allow 53 允许外部访问53端口(tcp/udp)
sudo ufw allow from 192.168.1.100 允许此IP访问所有的本机端口
sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53
sudo ufw deny smtp 禁止外部访问smtp服务
sudo ufw delete allow smtp 删除上面建立的某条规则
4.查看防火墙状态
sudo ufw status