生活札记
Docker+K8S+Devops零基础入门教程之Docker
教程:https://www.bilibili.com/video/BV1S14y1M7bs
Docker文档:https://docs.docker.com/engine/reference/run/
视频教程:https://www.bilibili.com/video/BV1rr4y1j7uy
视频教程(window):https://www.bilibili.com/video/BV11L411g7U1、文档:https://docker.easydoc.net/doc/81170005/cCewZWoN/lTKfePfP
查看运行的端口:netstat -tunpl | grep 80
查看运行的进程:ps -ef
docker :docker是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
安装:
1)、查看系统版本:Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看CentOS的内核版本。
uname -a
Linux ABC 3.10.0-957.12.1.el7.x86_64 #1 SMP Mon Apr 29 14:59:59 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
2)、查看是否安装了docker
yum list installed | grep docker
containerd.io.x86_64 1.6.6-3.1.el7 @docker-ce-stable
docker-ce.x86_64 3:20.10.17-3.el7 @docker-ce-stable
docker-ce-cli.x86_64 1:20.10.17-3.el7 @docker-ce-stable
docker-ce-rootless-extras.x86_64 20.10.17-3.el7 @docker-ce-stable
docker-scan-plugin.x86_64 0.17.0-3.el7 @docker-ce-stable
卸载删除docker:删除所有docker列表
yum remove -y docker-ce.x86_64 docker-ce-cli.x86_64 docker-ce-rootless-extras.x86_64 docker-scan-plugin.x86_64
或者
yum remove docker docker-common docker-selinux docker-engine
3)、安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
4)、设置Docker Yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5)、查看所有仓库中所有docker版本
yum list docker-ce --showduplicates | sort -r
6)、安装Docker
yum install -y docker-ce
如果要安装特定版本:
yum install docker-ce-18.06.1.ce
yum install docker-ce-20.10.17-3
1-7)、启动
设置为开机启动:systemctl enable docker
启动:systemctl start docker
重启:systemctl restart docker
查看启动状态:systemctl status docker
查看版本:docker version
注意:可以改变docker的镜像源来实现加速,参考:https://blog.csdn.net/segegefe/article/details/126327589。
Docker 中国官方镜像 https://registry.docker-cn.com
DaoCloud 镜像站 http://f1361db2.m.daocloud.io
Azure 中国镜像 https://dockerhub.azk8s.cn
科大镜像站 https://docker.mirrors.ustc.edu.cn
阿里云 https://<your_code>.mirror.aliyuncs.com
七牛云 https://reg-mirror.qiniu.com
网易云 https://hub-mirror.c.163.com
腾讯云 https://mirror.ccs.tencentyun.com
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
查询docker信息:docker info | grep Root
Docker Root Dir: /var/lib/docker
[root@CopyLian ~]# ls /var/lib/docker/image/overlay2/imagedb/content/sha256/ -l
-rw-------. 1 root root 12878 2月 7 16:36 2362f0cdbf14867a1c1ef2e1cc8dc4e78c4f8b66351acdbe71c8ab938e54f364
安装:
Linux安装:https://www.copylian.com/life/493.html
Windows安装:https://docker.easydoc.net/doc/81170005/cCewZWoN/lTKfePfP
镜像操作
1)、搜索:docker search 镜像名:tag # tag是标签版本,如:latest
2)、拉取:docker pull 镜像名:tag # tag是标签版本,如:latest
3)、查看:
查看:docker images 镜像名:tag -qa # tag是标签版本,如:latest,q只显示镜像ID
格式化:docker images --format "{{.ID}}\t{{.Repository}}\t{{.Tag}}"
格式化(table): docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
grep+awk: docker images | grep hello | awk '{print $1}'
4)、删除:docker rmi 镜像名、批量删除镜像:docker rmi `docker images -aq`、强制删除:docker rmi 镜像ID -f
5)、保存:docker save 镜像名:tag -o /copylian/downloads/hello-world2.tgz 镜像ID
6)、加载:docker load -i /copylian/downloads/hello-world2.tgz
7)、查看详情:docker image inspect 镜像ID
8)、修改名称:docker tag 名称:tag 新名称:tag、docker tag 镜像ID 新名称:新tag
9)、登录与推送:docker login -u 用户名 -p 密码 服务器地址、docker push 用户名/镜像ID:tag
网络操作:不同容器在同一个网络通信
docker network create test-net #创建一个名为test-net的网络
docker network rm test-net #删除一个名为test-net的网络
docker run -d --name redis --network test-net --network-alias redis redis:latest #运行 Redis 在 test-net 网络中,别名redis
docker volume ls #查看 volume 列表
docker network ls #查看网络列表
容器操作
1)、查看:docker ps -a # a表示所有的容器
2)、停止:docker stop 容器ID
3)、启动:docker start 容器ID、docker restart 容器ID
4)、删除:docker rm -f 容器ID # -f:强制删除
5)、运行:docker run -d -it --rm --restart=always --name 名称 -p 宿主主机端口:容器端口 镜像ID #--restart=always:自动重启
-d:后台运行
-it:进入容器
--rm:删除
--name:名称
-p:端口映射,宿主主机端口:镜像容器端口,比如nginx默认是80,镜像容器端口就是80,除非自行配置,宿主主机端口必须开放访问
-P:大写的P是随机映射端口,Linux的端口范围:0~65535,一般可以设置大一些,比如8090,避免暂用预留端口
docker run -d --rm --name nginx_cp -p 80:80 nginx
查看端口:docker port 容器ID
查看日志:docker logs -f 容器ID、docker logs -f 60 | tail -5
进入:docker exec -it 容器ID bash、docker exec -it 容器ID sh
查看详情:docker container inspect 容器ID、docker inspect 容器ID
提交容器:docker commit 容器ID 新的镜像名称
查看进程信息命令:docker top 容器ID
查看资源消耗:docker stats 容器ID
查看详情信息:docker inspect 容器ID | grep 172.
查看详情格式化信息:docker inspect 容器ID --format "{{.NetworkSettings.Networks.bridge.IPAddress}}"
Dockerfile:是一个组合镜像命令的文件文档,Docker通过读取Dockerfile来自动生成镜像,Dockerfile基本结构,一般分为:基础镜像,维护者信息,镜像操作指令和容器启动时执行指令,"#"为dockerfile中的注释。在dockerfile文件中我们需要了解几个常用的基本命令,分别是FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13个指令。
1)、通过Dockerfile创建镜像:docker build --no-cache -t 镜像名称 目录 # --no-cache:无缓存
[root@CopyLian test_dockerfile1]# cat Dockerfile
FROM nginx
RUN echo "测试dockerfile" > /usr/share/nginx/html/index.html
[root@CopyLian test_dockerfile1]# ls
Dockerfile
[root@CopyLian test_dockerfile1]# docker build -t my_nginx .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 9eee96112def
Step 2/2 : RUN echo "测试dockerfile" > /usr/share/nginx/html/index.html
---> Running in 56c2bc1fc5ae
Removing intermediate container 56c2bc1fc5ae
---> 88e52068220a
Successfully built 88e52068220a
Successfully tagged my_nginx:latest
2)、FROM系统基础的镜像:FROM <image>:<tag> #系统:版本,默认不加版本就会选择的是最新版本。
FROM centos:7.2.1511
3)、MAINTAINER 维护者信息:MAINTAINER是用来描述dockerfile编辑作者的信息,或者内容大致信息,便于读者学习。
MAINTAINER copylian@aikehou.com
MAINTAINER www.copylian.com
4)、RUN 基础镜像命令:RUN linux命令,RUN命令是我们在FROM的基础系统中需要做的一下操作。
RUN mkdir /usr/local/python3 \ && mkdir /usr/local/python3/DevOps \ && yum -y install gcc
5)、ADD/COPY复制:从本地向制作的镜像中复制文件,ADD可以使用url,也可以复制tar文件,并会自动解压到目标路径中,COPY不能访问网络资源,也不会自动解压。
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
一般建议使用COPY复制,不过也要根据自己的环境,如果有tar文件可以使用ADD,不需要解压的可以使用COPY。
6)、CMD命令:CMD命令是根据镜像创建的容器启动时,需要执行的命令,这个命令是在容器创建之后,会被覆盖。格式如下:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
CMD ["nginx", "-g", "daemon off;"] (前台运行)
后面直接跟执行的语句,CMD和RUN的区别一个是在容器启动之前一个是容器启动之后。如果有多个CDM命令只执行最后一个。
7)、ENTRYPOINT:ENTRYPOINT是容器启动后执行的命令,不会被docker run提供的参数覆盖,只能有一个ENTRYPOINT。但是如果docker run时使用了--entrypoint选项,此选项的参数可当作要运行的程序覆盖ENTRYPOINT。例如
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参,不会覆盖
CMD ["/etc/nginx/nginx.conf"] # 变参,会被覆盖
如果不传参运行:docker run nginx:test,在容器中会默认会启动 nginx -c /etc/nginx/nginx.conf
如果传参运行:docker run nginx:test -c /etc/nginx/new.conf,会把CMD中定义的参数覆盖掉,在容器中会执行的会是 nginx -c /etc/nginx/new.conf
ENTRYPOINT搭配CMD使用时一般时使用CMD给ENTRYPOINT传参。
8)、ENV环境变量:ENV是给创建好的容器设置环境变量,设置好的环境变量可以被RUN使用。格式如下:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
ENV NAME=MYSQL
ENV VERSION=8.0
9)、ARG 环境变量:ARG和ENV都是设置环境变量,两者的区别是,ARG是对Dockerfile内有效,也就是在docker build的过程中有效,ENV是针对构建好容器的变量。格式:
ARG <参数名>[=<默认值>]
10)、VOLUME挂载路径:VOLUME是定义匿名数据卷,在启动容器是忘记挂在数据卷,会自动挂载到匿名卷中,作用是避免数据丢失,或着因容器重启导致数据流失会使容器慢慢变大。格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
在容器启动时可以使用-v参数修改挂载点。
11)、EXPOSE 端口:EXPOSE申明的仅仅是端口,在镜像服务中使用随机端口做映射,也就是docker run -P时,会自动随机映射EXPOSE的端口,格式:
EXPOSE <端口1> [<端口2>...]
12)、WORKDIR 工作目录:只工作目录,用于WORKDIR指定的工作目录,会在构建镜像的每一层中都存在,WORKDIR的工作目录必须是创建好的,docker build构建镜像过程中,每一个RUN命令都是新建的一层,只有通过WORKDIR创建的目录才会一直存在。格式:
WORKDIR <工作目录路径>
13)、USER 用户和组:用于指定后续执行命令的用户和用户组,这边只是切换后续命令执行的用户,用户名和用户组必须提前创建好。格式:
USER <用户名>[:<用户组>]
14)、HEALTHCHECK 监控服务状态:HEALTHCHECK用来指定或指定来监控docker容器服务的运行状态,格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
15)、ONBUILD 延迟构建:ONBUILD用来延迟构建命令的执行,简单的说,就是在dockerfile里用ONBUILD指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。格式:
ONBUILD <其它指令>
16)、LABLE 为镜像添加源数据:用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。格式:
LABLE <key>=<value> ... <key>=<value> >>>>>>> LABLE version="1.0" desc="这是一个描述" by="飓风呀"
Dockerfile构建一个简单的Python实例:
1)、app.py:
#coding:utf8
from flask import Flask
#实例化
app=Flask(__name__)
#路由
@app.route("/")
def hello():
return "我是Python Dockerfile"
#执行
if __name__ == "__main__":
app.run(host="0.0.0.0",port=8082)
2)、Dockerfile:
FROM centos:7.8.2003
RUN curl -o /etc/yum.repos.d/Cent0S-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo;
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo;
RUN yum makecache fast;
RUN yum install python3-devel python3-pip -y
RUN pip3 install -i https://pypi.douban.com/simple flask
COPY app.py /opt
WORKDIR /opt
EXPOSE 8082
CMD ["python3", "app.py"]
3)、构建Dockerfile镜像:docker build --no-cache -t my_python .
4)、创建容器:docker run -d --name my_python -p 8082:8082 镜像ID
5)、修改容器内容:docker exec -it 容器ID bash
6)、重启容器:docker restart 容器ID
Docker compose:使用docker-compose和Dockerfile管理镜像和容器
参考:https://docker.easydoc.net/doc/81170005/cCewZWoN/IJJcUk5J
参考:https://www.copylian.com/life/493.html
查看运行状态:docker-compose ps
停止运行:docker-compose stop
重启:docker-compose restart
重启单个服务:docker-compose restart service-name
进入容器命令行:docker-compose exec service-name sh
查看容器运行log:docker-compose logs [service-name]
迁移备份:
运行一个 mongodb,创建一个名叫mongo-data的 volume 指向容器的 /data 目录
docker run -p 27018:27017 --name mongo -v mongo-data:/data -d mongo:4.4
运行一个 Ubuntu 的容器,挂载mongo容器的所有 volume,映射宿主机的 backup 目录到容器里面的 /backup 目录,然后运行 tar 命令把数据压缩打包
docker run --rm --volumes-from mongo -v d:/backup:/backup ubuntu tar cvf /backup/backup.tar /data/
最后你就可以拿着这个 backup.tar 文件去其他地方导入了。
恢复 Volume 数据
运行一个 ubuntu 容器,挂载 mongo 容器的所有 volumes,然后读取 /backup 目录中的备份文件,解压到 /data/ 目录
docker run --rm --volumes-from mongo -v d:/backup:/backup ubuntu bash -c "cd /data/ && tar xvf /backup/backup.tar --strip 1"
文明上网理性发言!
已完结!