【Docker】Docker部署爬虫实战

环境

系统:ubuntu18.04
docker:19.03.5

Docker概述

推荐每个容器只运行一个进程

安装docker

1.卸载已安装的docker

 sudo apt autoremove docker
 
 sudo apt autoremove docker-engine
 
 sudo apt autoremove docker.io

2.执行自动安装docker的脚本

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

安装成功后出现:

Client: Docker Engine - Community
.
.
.
  
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker dell

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

此时,docker CE 的稳定(stable)版本已经安装在系统中。

3.新建docker用户组,并将当前用户加入

sudo groupadd docker
sudo usermod -aG docker 当前用户的用户名

4.初始化docker的一些设置

官方示例:https://docs.docker.com/engine/reference/commandline/dockerd/#/linux-configuration-file

以下分别设置了docker镜像源,docker日志驱动和每个容器的日志最大值,日志文件最大数,Docker数据存储目录(默认/var/lib/docker)

sudo vim /etc/docker/daemon.json
# 写入如下内容并保存
{ 
"registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://registry.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
"data-root":"/data/docker"

5.设置docker开机自启动,并重启docker使配置生效

sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl daemon-reload
sudo systemctl restart docker

6.验证docker的启动

docker run hello-world

出现如下信息说明启动成功:


Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

创建docker镜像

1.在新建一个 requirements.txt ,将需要的库写入,建议加上每个库的版本号,以免pip版本不一样导致错误

cd /usr/teemo_docker
vim requirements.txt

#编辑
beautifulsoup4
chardet==3.0.4
demjson==2.2.4
fake-useragent==0.1.11
html5lib==1.0.1
httplib2==0.9.2
kafka-python==1.4.3
lxml==4.2.5
parse==1.8.4
psutil==5.4.8
PyMySQL==0.9.3
pyOpenSSL==18.0.0
pypinyin==0.35.1
python-dateutil==2.7.5
PyVirtualDisplay==0.2.5
redis==3.2.1
requests==2.18.4
requests-unixsocket==0.1.5
Scrapy==1.5.1
scrapy-redis==0.6.8
scrapyd==1.2.0
scrapyd-client==1.1.0
Twisted==18.9.0
urllib3==1.25.7

#保存,esc->冒号->wq->回车

2.将scrapy-redis项目放到/usr/teemo_docker

3.制作dockerfile

vim teemo_dockerfile_makeupvideo
# 编辑
FROM python:3.7
MAINTAINER Teemo "[email protected]"
COPY .  /usr/TeemoPrograms/CopyrightMonitor/
WORKDIR /usr/TeemoPrograms/CopyrightMonitor/
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
WORKDIR /usr/TeemoPrograms/CopyrightMonitor/get_video_msg_kafka/get_video_msg/
CMD python -u  cmdline.py
#保存,esc->冒号->wq->回车

4.用dockerfile创建镜像

docker build -t docker_images_makeupvideo -f ./teemo_dockerfile_makeupvideo .

等待一段时间后,便制作完成了名称为docker_images_makeupvideo的镜像,可以通过docker images命令查看。

启动容器

1.启动容器

docker run -d -v /usr/docker_logs:/usr/like_programs/get_video_msg_kafka/get_video_msg/logs --name="makeupvideo_sp72_2" -m 2048M --cpus 0.2 docker_images_makeupvideo python -u  cmdline_sp72.py

返回一串字符串,则表示启动成功,字符串为容器ID

2.查看容器的控制台输出

docker logs -f 容器id

3.进入容器

docker exec -it 容器ID|容器名 /bin/bash

4.退出容器

CTRL + P + Q

Docker日志默认存储位于:/var/lib/docker/containers//*.log

镜像相关命令

获取镜像

仓库地址默认是docker hub(docker的官方仓库地址)
用户地址默认是官方仓库library
版本号默认是latest

docker pull 仓库地址/用户名/仓库名:版本

举例:

docker pull ubuntu

docker pull registry.hub.docker.com/library/ubuntu:latest

检索镜像

docker search 镜像名(模糊搜索)

查看本地镜像

docker image ls
# or
docker images

举例:

# 列出所有镜像
docker images
# 列出所有ubuntu镜像
docker images  ubuntu

通过dockerfile构建镜像

docker build [options]
  • options:
    -t:通常是 镜像名:标签 的形式 ,或只设定镜像名
    -f :指定要使用的Dockerfile路径,默认当前目录
    -m:设置内存最大值
    –cpu-shares:设置CPU使用权重

删除镜像

根据容器id或容器名删除镜像,加上-f参数后会强制删除镜像

docker rmi 容器名|容器ID
docker rmi -f 容器名|容器ID

删除未被标记和容器使用的镜像:

docker image prune

删除未被容器使用的镜像:

docker image prune -a

给镜像打标签

可以通过指定仓库名/用户名/镜像名:标签的形式将镜像打上标签,将其归入某一仓库。

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

举例:

docker tag ubuntu:15.10 runoob/ubuntu:v3

将镜像归档成文件

-o 表示指定导出的文件名

 docker save runoob/ubuntu:v3 -o my_ubuntu_v3.tar 

从归档的镜像文件载入到本地镜像库

-i 表示指定导入的文件名

docker load -i my_ubuntu_v3.tar 

查看镜像的元数据

docker inspect 镜像ID|镜像名

容器相关命令

启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

-d: 后台运行容器,并返回容器ID;

-i:打开STDIN,以交互模式运行容器,通常与 -t 同时使用;

-w:指定容器工作目录

-v:挂载存储卷到容器某目录

–restart=“no” :(no退出不重启、on-failure出错失败重启、always停止就重启)

-P: 随机端口映射,容器内部端口随机映射到主机的高端口

-p 80:80 :宿主机端口:容器暴露的端口 (端口映射)

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

–name=“VideoInfoCompletion”: 为容器指定一个名称;

–cpus:设置CPU权重

–cpu-period 和 --cpu-quota:配合使用,单位是微秒,比如–cpu-period=100000 --cpu-quota=200000表示每100毫秒内进程使用的CPU时间最多为200毫秒(也就是可以同时使用两个CPU)

–cpuset-cpus:指定固定的CPU,比如 --cpuset-cpus=“1”,–cpuset-cpus=“1,3,4”,因为多核系统每个核有自己的缓存,避免缓存调度。

-m :设置内存上限

-h :指定容器主机名(hostname)


-u:指定容器的用户

–dns 8.8.8.8:指定容器使用的DNS服务器,默认和宿主一致;

–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-e username=“ritchie”: 设置环境变量;

–env-file=[]: 从指定文件读入环境变量;

–cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;

–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

–link=[]: 添加链接到另一个容器;

–expose=[]: 开放一个端口或一组端口;

举例:

docker run -p 80:80 -v /data:/data -d nginx:latest

docker run -it nginx:latest /bin/bash

启动、停止、重启、暂停、恢复容器

可以操作一个或多个容器

docker start   容器ID|容器名
docker stop    容器ID|容器名
docker restart 容器ID|容器名
docker pause   容器ID|容器名
docker unpause 容器ID|容器名

创建一个容器,但不启动

语法和docker run 一样

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

在容器内执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

举例:

# 通过带参数-it并执行/bin/bash的方式进入容器
 docker exec -it ubuntu /bin/bash

# 在后台执行命令
docker exec -d ubuntu python -u /usr/cmdline.py

删除容器

删除一个或多个容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]

不带参数:只能删除未运行的容器

-f :通过 SIGKILL 信号强制删除一个运行中的容器。

-v :删除与容器关联的卷。

删除所有已停止的容器

docker rm $(docker ps -a -q)
# or
docker container prune

查看本地容器

docker ps [options]

不带参数:显示正在运行的容器
-a:显示所有容器
-q:只显示容器ID
-n num:显示最近创建的num个容器
-s:显示容器的大小

查看容器输出的日志

docker logs [OPTIONS] 容器名|容器ID

-f:持续输出
-t:显示时间戳
-tail n:列出最新n条日志
-since:列出从某时间开始的日志

主机与容器之间文件的互相拷贝

docker cp 主机目录  容器ID:容器目录
docker cp 容器ID:容器目录  主机目录 

查看容器内文件目录结构的修改

docker diff 容器名|容器ID

查看容器的元数据

docker inspect 容器ID|容器名

查看容器运行的进程信息

docker top 容器名|容器ID

查看容器的端口映射

docker port 容器名|容器ID

Docker系统相关命令

查看Docker的磁盘占用

# 查看docker镜像、容器、本地数据卷的磁盘占用情况
docker system df
# 查看细节
docker system df -v

查看各个容器的实时占用系统资源情况

docker stats

查看Docker的事件

docker events [OPTIONS]

-f :根据条件过滤事件;

–since :从指定的时间后显示所有事件;

–until :显示到指定事件为止的所有事件;

举例:

docker events  --since="1467302400"
docker events  --since="2020-01-13"

# 显示镜像名是ubuntu的所有事件
docker events -f "image"="ubuntu"

Docker prune 进行清理

# 清理未被标记和使用的镜像
docker image prune
# 清理未被使用的镜像
docker image prune -a
# 清理未运行的容器
docker container prune
# 清理未被挂载的数据卷
docker volume prune
# 清理所有网络:
docker network prune

# 用于清理dangling镜像和所有关闭的容器,以及失效的数据卷和网络。
docker system prune

# 深度清理,保留真正正在使用的镜像、容器、数据卷以及网络(如果有备份会被删掉)
docker system prune -a

查看Docker版本信息

docker version

查看Docker在当前系统的信息

docker info

得到如下结果

Client:
 Debug Mode: false

Server:
 Containers: 9
  Running: 1
  Paused: 0
  Stopped: 8
 Images: 27
 Server Version: 19.03.5
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: b34a5c8af56e510852c35414db4c1f4fa6123456
 runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481234
 init version: fec1234
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 4.15.0-72-generic
 Operating System: Ubuntu 18.04.1 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 40
 Total Memory: 125.8GiB
 Name: dell
 ID: YR2U:BWBW:N4WR:TSHY:BA3H:MN76:EUP7:USLH:7BQF:6AOR:2UR3:1234
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  http://f1361db2.m.daocloud.io/
 Live Restore Enabled: false

WARNING: No swap limit support

Docker的手动清理

https://www.jianshu.com/p/54e7bcc9f147

Docker运维

ctop:查询各个容器的实时状态
分配CPU和内存上限,分配后,超过就会被kill,但是可以在run中设置restart参数,使其自动重启。

Docker部署爬虫策略

挂载搜集输出到文件的日志

python -u 可以通过 docker logs -f 查看日志

合理设置 cpu,内存的使用参数 :-m -u 等

restart参数为always 确保达到内存上限或U上限,停止后还能重启

建立本地 docker hub

使用k8s

你可能感兴趣的:(【Docker】)