生活札记

Docker+K8S+Devops零基础入门教程之Docker

copylian    1 评论    6978 浏览    2023.02.08

教程: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

dockerdocker是一种运行于 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

微信图片_20230316094800.png

注意:可以改变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"

         ]

}

1675756853463697.png

1675757056628463.png

查询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 新名称:tagdocker 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 容器IDdocker 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)、ENTRYPOINTENTRYPOINT是容器启动后执行的命令不会被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"

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
Docker K8S Devops 

文明上网理性发言!