• Docker笔记


    安装

    1. 卸载旧版本以及相关的依赖项
    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 安装所需的软件包。
      yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
      sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    2. 安装 Docker Engine-Community
      列出并排序存储库中可用的版本
      yum list docker-ce --showduplicates | sort -r
      sudo yum install docker-ce- docker-ce-cli- containerd.io
    3. 启动docker
      sudo systemctl start docker

    用户组

    1. 创建docker组
      sudo groupadd docker
      2.将当前用户加入docker组
      sudo gpasswd -a ${USER} docker
      3.重启服务
      sudo service docker restart
      4.刷新docker成员
      newgrp - docker

    仓库

    登录docker仓库
    docker login -u user-p psw123 abc.com
    登出
    docker logout

    镜像

    拉取镜像
    默认latest版本,-a拉去所有tagged镜像 默认存在 /var/lib/docker/
    docker pull abc
    重新定义镜像
    docker tag [ImageId] xxx.com/abc:v1
    推送镜像
    docker push xxx.com/abc:v1
    查看
    docker images
    删除
    docker rm -f

    容器

    docker save 将指定镜像保存成 tar 归档文件
    docker save -o img.tar imgName
    -o:输出到的文件

    docker load 导入使用 docker save 命令导出的镜像。
    –input , -i : 指定导入的文件,代替 STDIN。
    docker load -i abc.tar

    执行docker load -i xxx.tar.gz时候报错open /xxx No such file or directory这种情况属于容器快照文件缺乏基础镜像导致的
    因为docker使用了联名文件系统,即在基础镜像上覆盖一层可写层来执行其他操作。而容器快照文件只包含了上层操作,没有底层的基础镜像。这也是docker save保存的镜像压缩包和docker export保存的容器快照压缩包的区别。
    实际应用的时候因为很多镜像都使用了同一个基础镜像,所以使用容器快照的话更节省资源,不需要每个镜像都加载基础镜像。
    解决方案
    一般容器快照文件都会包含minifest文件,找到minifest文件。里面会告诉你需要的基础镜像,docker load加载基础镜像之后docker load重新加载即可
    
    • 1
    • 2
    • 3
    • 4
    • 5

    docker export文件系统作为一个tar归档文件导出到STDOUT
    docker export > /home/export.tar
    docker save基于镜像,export基于容器;expor导出的镜像文件大小,小于 save保存的镜像

    docker import从归档文件中创建镜像
    docker import xxx.tar xxx:v4

    export导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag  );而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree)
    
    导入容器快照:cat docker/myImd.tar | docker import - test/myImg:v1
    也可以通过指定url或者某个目录来导入docker import http://example.com/test.tgz example/test
    
    • 1
    • 2
    • 3
    • 4

    docker start container_name/container_id # 通过容器名字或ID启动容器
    docker stop container_name/container_id # 通过容器名字或ID停止容器
    docker restart container_name/container_id # 通过容器名字或ID重启容器
    docker rm container_name/container_id :删除一个或多个容器
    -v :删除与容器关联的卷
    -f :强制删除

    docker rmi : 删除本地一个或多个镜像
    -f :强制删除
    –no-prune :不移除该镜像的过程镜像,默认移除;
    docker rmi -f imgId/imgName:tag

    镜像不被任何容器所使用的前提下,批量删除镜像:docker images | grep abc | awk ‘{print $1":"$2}’ | xargs docker rmi

    注:导入加载进来觉得不合适可以使用 docker rm 容器ID 、 docker rmi 镜像ID 来删掉。
    移除所有的容器和镜像
    docker kill $(docker ps -q)
    docker rm $(docker ps -a -q)
    docker rmi $(docker images -q -a)
    docker logs -f -t --since=“2017-05-31” --tail=100 container_name
    docker ps -a | awk ‘{print $1}’ | xargs docker rm -f
    使用Docker进行容器的创建:
    docker info # 查看docker的信息

    docker exec在运行的容器中执行命令
    -d :分离模式: 在后台运行
    -i :即使没有附加也保持STDIN 打开
    -t :分配一个伪终端
    docker exec -it container_name/container_id /bin/bash # 通过容器名字或ID进入容器
    exit # 退出容器

    docker run创建一个新的容器并运行一个命令
    docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
    OPTIONS说明:
    -d: 后台运行容器,并返回容器ID;
    -i: 以交互模式运行容器,通常与 -t 同时使用
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
    -p: 指定端口映射,格式为:hostPort:containerPort 主机(宿主)端口:容器端口
    –name= xxx: 为容器指定一个名称;
    -h: 指定容器的hostname;
    -e username=ritchie: 设置环境变量;
    –volume , -v: 绑定一个卷

    docker run -itd --name=container_name img_name # 使用img_name以交互模式在后台运行分配了伪终端的名为container_name的镜像

    死循环进程,让他不停的循环下去,前台永远有进程执行,那么容器就不会退出了
    docker run -d centos /bin/sh -c “while true; do echo hello world; sleep 1000; done”

    使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
    docker run -it nginx:latest /bin/bash

    docker update更新一个或多个容器的配置
    更新容器重启策略:docker update --restart=always containerId
    更新容器内存:docker update -m 500M f361b7d8465

    docker inspect 获取容器/镜像的元数据
    docker inspect nacos
    docker inspect -f {{.Config.Hostname}} nacos

    从容器里面拷文件到宿主机
    docker cp apline:/usr/local/abc.sh /docker
    从宿主机拷文件到容器里面
    docker cp /docker/abc.sh apline:/usr/local/

    批量删除docker镜像为none的方法
    docker images|grep none|awk ‘{print $3}’|xargs docker rmi
    或者
    docker rmi $(docker images | grep “^” | awk “{print $3}”)

    获取所有容器ID
    docker ps -a -q
    停止所有容器
    docker stop $(docker ps -a -q)
    删除所有停止的容器
    docker rm $(docker ps -a -q)
    删除所有的镜像
    docker rmi $(docker images -q)
    移除没有标签并且没有被容器引用的镜像,这种镜像称为dangling(摇晃的)镜像
    docker image prune -a --filter “until=24h”
    移除停止的容器
    docker container prune
    移除卷
    docker volume prune
    移除网络
    docker network prune
    移除所有,包括镜像、容器、网络、卷
    docker system prune --volumes

    配置阿里云镜像服务

    1. 登录进入阿里云镜像服务中心,获取镜像地址https://****.mirror.aliyuncs.com
    2. 在/etc/docker目录下找到在daemon.json文件(没有就新建),将下面内容写入
    {
        "registry-mirrors": ["https://****.mirror.aliyuncs.com"],
    	"insecure-registries":["192.168.9.68:80"]
    }
    
    • 1
    • 2
    • 3
    • 4

    “registry-mirrors”: [], #私库加速器
    “insecure-registries”: [], #这个私库的服务地址
    3. 重启daemon
    systemctl daemon-reload
    4. 重启docker服务
    systemctl restart docker

    基本开发流程

    1. 寻找基础镜像
    2. 基于基础镜像编写Dockerfile脚本
    3. 根据Dockerfile脚本创建项目镜像
    4. 将创建的镜像推送到docker仓库 (根据自身需要,可做可不做)
    5. 基于项目镜像创建并运行docker容器 (实现最终部署)

    制作镜像

    Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

    docker build [OPTIONS] 
    --tag, -t,指定镜像的名字及tag
    使用当前目录的Dockerfile构建镜像:docker build -t name:tag .
    -f 指定Dockerfile文件位置
    docker build -f /path/Dockerfile .
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。

    // FROM 指定基础镜像
    FROM nginx
    // RUN执行命令。每一条RUN都会生成一层,一个需求尽量使用&&,减少RUN,即减少了分层
    RUN echo '

    Hello, Docker!

    ' > /usr/share/nginx/html/index.html RUN yum update && yum install -y vim \ //COPY 源路径下的package.json复制到新一层的镜像路径/user/src/app COPY package.json /usr/src/app/ // WORKDIR 指定工作目录。指定下层工作的目录为容器内的/data,尽量使用绝对目录 WORKDIR /data // ADD添加,ADD能自动解压文件。 ADD hello test/ // CMD 执行命令 CMD ["python", "app.py"] // ENV 设置环境变量 ENV VERSION=1.0 DEBUG=off \ NAME="Happy Feet" // VOLUMES 挂载 // EXPOSE 端口暴露 EXPOSE <端口1> [<端口2>...]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    FROM构造的新镜像是基于哪个镜像
    例如:FROM centos:v1

    COPY拷贝文件或者目录到镜像,用法同ADD
    例如:COPY ./startup.sh /startup.sh

    MAINTAINER维护者信息
    例如:MAINTAINER yanglin

    ENTRYPOINT运行容器时执行的shell命令
    例如:ENTRYPOINT [“/bin/bash”,“-c”,“/startup.sh”]
    ENTRYPOINT /bin/bash -c ‘/startup.sh’

    RUN构建镜像时运行的shell命令
    例如:RUN [“yum”, “install”, “http”]
    RUN yum install httpd

    VOLUME指定容器挂载点到宿主机自动生成的目录或者其他容器
    例如:VOLUME [“/path/to/dir”]

    CMD运行容器时执行的shell命令
    例如:CMD [“-c”,“/startup.sh”]
    CMD [“/usr/sbin/sshd”,“-D”]

    USER为RUN,CMD,ENTRYPOINT执行命令指定运行用户
    例如:USER www
    镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

    EXPOSE指定于外界交互的端口,即容器在运行时监听的端口
    EXPOSE 8081 8082

    WORKDIR为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录
    例如:WORKDIR /data

    ENV设置容器内环境变量
    例如:ENV MYSQL_ROOT_PASSWORD 123456

    HEALTHCHECK健康检查
    HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ ||exit 1

    ADD拷贝文件或者目录到镜像,如果是URL或者压缩包会自动下载或者自动解压
    例如:ADD hom* /mydir/

    ARG在构建镜像时指定一些参数
    例如:FROM centos:6
    ARG age=100

    Dockerfile中设置环境变量要用 ENV
    ENV JAVA_HOME /usr/local/jdk1.8.0_171
    ENV PATH J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

    Docker Compose

    Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。
    // 一般使用步骤:

    1、创建一个空目录。
    2、定义 Dockerfile,方便迁移到任何地方
    3、编写 docker-compose.yml 文件
    4、运行 docker-compose up 启动服务

    安装docker-compose
    curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
    chmod +x docker-compose

    // docker-compose 常用命令:
    
    // up 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
    docker-compose up [options] [SERVICE...]   // -d 比较常用,不会打印过程。
    //down 停止 up 命令所启动的容器,并移除网络。——这里需要特别注意,up 启动的,不应该使用rm 去删除,因为这样无法删除网络
    docker-compose down
    // run 命令
    docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
    // ps 查看项目中的所有容器
    docker-compose ps
    // restart 重启服务
    docker-compose restart [options] [SERVICE...]。
    // stop start 停止和开启容器
    docker-compose stop xxx
    docker-compose start xxx
    // kill 强制停止某容器
    docker-compose kill -s SIGINT
    // rm 删除指定或所有的服务容器
    docker-compose rm -f [service]
    // build 重建某个容器,在 Dockerfile 发生了改变的时候,可以重建image。然后再 up 运行起来所有的容器
    docker-composer build    //重建所有容器
    docker-compose build xxx   //重建指定容器
    //exec 进入某个容器
    docker-compose exec -it ct-phpfpm /bin/bash
    // images 查看compose文件中包含的镜像
    docker-compose images
    // pull 拉取依赖
    docker-compose pull [options] [SERVICE...]
    // push 推送服务依赖的镜像到 Docker 镜像仓库。
    docker-compose push
    // port 打印某容器的映射端口
    docker-compose port xxx
    // config 验证 docker-compose 文件格式是否正确
    docker-compose config// top 查看所有容器的进程
    docker-compose top
    
    docker-compose -f abc.yaml up -d blkboard
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    [NPUCTF2020]ezlogin xPATH注入
    SRIO系列-基本概念及IP核使用
    SRM供应商管理系统有什么作用?
    蓝桥杯备赛(二)
    沉睡者IT - 关于知乎好物赚钱方法都在这里了
    C++系统相关操作3 - 获取操作系统的平台类型
    [附源码]java毕业设计JAVA点餐系统
    76-SpringSecurity介绍
    lvs集群
    pikachu之暴力破解
  • 原文地址:https://blog.csdn.net/xiha_zhu/article/details/132865587