系统:ubuntu18.04
docker:19.03.5
推荐每个容器只运行一个进程
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/
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/
仓库地址默认是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
docker build [options]
根据容器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 system df
# 查看细节
docker system df -v
docker stats
docker events [OPTIONS]
-f :根据条件过滤事件;
–since :从指定的时间后显示所有事件;
–until :显示到指定事件为止的所有事件;
举例:
docker events --since="1467302400"
docker events --since="2020-01-13"
# 显示镜像名是ubuntu的所有事件
docker events -f "image"="ubuntu"
# 清理未被标记和使用的镜像
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 version
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
https://www.jianshu.com/p/54e7bcc9f147
ctop:查询各个容器的实时状态
分配CPU和内存上限,分配后,超过就会被kill,但是可以在run中设置restart参数,使其自动重启。
挂载搜集输出到文件的日志
python -u 可以通过 docker logs -f 查看日志
合理设置 cpu,内存的使用参数 :-m -u 等
restart参数为always 确保达到内存上限或U上限,停止后还能重启
建立本地 docker hub
使用k8s