• docker实战


    docker实战笔记

    一、安装docker

    下面以ubuntu系统举例:

    卸载已有的旧版本docker

    $ sudo apt-get remove docker \
                   docker-engine \
                   docker.io
    

    使用apt安装最新版docker

    $ sudo apt-get update
    $ sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    

    更新apt软件包缓存

    $ sudo apt-get update
    
    # 安装docker-ce
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io
    

    启动docker

    # 使用系统命令启动docker
    $ sudo systemctl enable docker
    $ sudo systemctl start docker
    

    建立docker用户组

    默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组

    # 建立docker用户组
    $ sudo groupadd docker
    
    # 将用户加入到docker用户组中
    $ sudo usermod -aG docker [$USER 用户名]
    

    二、docker镜像【重要】

    镜像是 Docker 的三大组件之一。

    Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。

    【重点】

    docker镜像与docker容器的区别

    镜像的一个实例称为容器。 你有一个镜像,这是你描述的一组图层。 如果你开始这个镜像,你有一个运行这个镜像的容器。 您可以拥有许多相同镜像的正在运行的容器。

    # 查看所有镜像
    docker images
    
    # 查看正在运行的容器
    docker ps -a 
    

    获取镜像

    $ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
    # 指定ubuntu版本下载
    docker pull ubuntu:18.04
    # 下载Ubuntu所有镜像
    docker pull -a ubuntu 
    # 下载centos所有镜像
    docker pull -a centos 
    

    docker交互式

    // 进入docker交互式 用法和linux命令类似
    docker run -it --rm ubuntu bash
    

    列出镜像

    docker image ls
    

    查看镜像文件大小

    docker system df
    

    删除本地镜像

    $ docker image rm [选项] <镜像1> [<镜像2> ...]
    

    使用commit理解镜像

    docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成,

    简单来说docker commit就是在原来的镜像上面进行copy然后形成新的镜像

    docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
    
    # 栗子:
    $ docker commit \
        --author "Tao Wang " \
        --message "修改了默认网页" \
        webserver \
        nginx:v2
    sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
    

    其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息可以省略留空。

    三、使用dockerfile制作镜像

    ​ 从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile

    Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

    创建dockerfile

    $ mkdir mynginx
    $ cd mynginx
    $ touch Dockerfile
    
    # 写入脚本
    FROM nginx // 指定镜像
    RUN echo '

    Hello, Docker!

    ' > /usr/share/nginx/html/index.html

    FROM命令

    ​ 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 DockerfileFROM 是必备的指令,并且必须是第一条指令。

    RUN命令

    RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种

    • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。

      # 执行脚本 单个
      RUN echo '

      Hello, Docker!

      ' > /usr/share/nginx/html/index.html
    • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。

      FROM debian:stretch
      # 批量执行脚本
      RUN apt-get update
      RUN apt-get install -y gcc libc6-dev make wget
      RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
      RUN mkdir -p /usr/src/redis
      RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
      RUN make -C /usr/src/redis
      RUN make -C /usr/src/redis install
      

    exec格式虽然是批量执行脚本,但是上面脚本创建了七层镜像,是不合适的,那么正确的写法是: 使用&&符号进行连接,把原来创建七层镜像变成了一层

    FROM debian:stretch
    # '\'是shell脚本的末尾换行符
    RUN set -x; buildDeps='gcc libc6-dev make wget' \
        && apt-get update \
        && apt-get install -y $buildDeps \
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
        && mkdir -p /usr/src/redis \
        && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
        && make -C /usr/src/redis \
        && make -C /usr/src/redis install \
        && rm -rf /var/lib/apt/lists/* \
        && rm redis.tar.gz \
        && rm -r /usr/src/redis \
        && apt-get purge -y --auto-remove $buildDeps
    

    3.1、dockerfile指令详解【重要】

    FORM指令

    FROM 系统[:镜像版本号]
    # 指定基础镜像,也是必须的!!!
    FROM ubuntu
    

    EXPOSE指令

    EXPOSE 指令是声明容器运行时提供服务的端口,这只是一个声明,在容器运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

    # 指定 80端口命令
    EXPOSE 80
    

    RUN指令

    # 指定下载安装包并更新软件包缓存
    RUN apt-get -qq update
    

    COPY复制文件

    COPY [--chown=:] <源路径>... <目标路径>
    # 复制/home/test文件夹下所有文件到当前目录
    COPY /home/test/** .
    

    CMD指令

    CMD 指令的格式和 RUN 相似,也是两种格式:

    shell 格式:CMD <命令>
    # 栗子:
    CMD echo 'hello world!'
    CMD service nginx start
    
    exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
    参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
    

    ENV指令

    格式有两种:

    ENV  
    ENV = =...
    
    # 栗子:
    ENV VERSION=1.0 DEBUG=on \
        NAME="Happy Feet"
    

    ADD复制文件(高级用法)

    # 与COPY指令类似,复制某个文件夹下所有文件到/mydir
    ADD --chown=55:mygroup files* /mydir/
    ADD --chown=bin files* /mydir/
    ADD --chown=1 files* /mydir/
    ADD --chown=10:11 files* /mydir/
    

    总结:

    # FROM:作为基础镜像
    FROM ubuntu
    # 使用RUN指令下载安装包等等,连接使用&&
    RUN apt-get -qq update \
    && COPY /home/test/** . \
    # EXPOST 8080
    && RUN  echo 'hello, dockerfile'
    

    那么镜像制作完成了,就应该进行构建镜像

    # docker build -t=【tag信息】 【dockerfile路径】
    docker build [选项] <上下文路径/URL/->
    # 栗子:
    docker build -t nginx:v3 .
    

    四、操作容器

    新建并启动一个容器

    # 使用docker run命令携带脚本
    $ docker run ubuntu /bin/echo 'Hello world'
    Hello world
    

    查看正在运行的docker容器信息

    # 查看容器信息
    docker container ls
    

    查看容器日志【重要】

    # 查看正在运行的容器
    docker ps -a
    # 拿到对应的容器id,使用docker logs 查看日志
    docker container logs [container ID or NAMES]
    # 查看实时日志
    docker logs -f [container ID or NAMES]
    

    操作容器(停止、启动、重启)

    # 1.查看正在运行的容器
    docker ps -a
    
    # 2.停止正在运行的容器
    docker container stop [容器id]
    
    # 3.启动正在运行的容器
    docker container start [容器id]
    
    # 4.重启正在运行的容器
    docker container restart [容器id]
    

    进入容器

    # 命令
    docker attach [容器id] / docker exec [容器id]
    
    # 进入容器并启用伪装终端
    docker exec -it [容器id] bash
    

    导入导出容器

    # 1.查看容器
    docker container ls -a
    
    # 2.导出容器到本地文件
    docker export [容器id] > ubuntu.tar
    
    # 3.导入容器
    docker import [目录/http链接]
    

    删除容器

    # 1.查看所有容器
    docker container ls
    
    # 2.停止对应容器
    docker container stop [容器id]
    
    # 3. 删除对应容器
    docker container rm [容器id / 容器名]
    

    __EOF__

  • 本文作者: 阿辉ya
  • 本文链接: https://www.cnblogs.com/curryAhui/p/17173519.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Linux下创建和删除用户
    Vue 2.0——数据与方法(官方文档解读)
    货币政策传导与货币政策调控-中国视角下的宏观经济
    Unity当中的灯光类型
    贪心算法C++
    Redis 有序集合操作实战(全)
    springboot使用mybatis动态表名添加和删除
    京津冀国际光伏展
    GO语言-什么是临界资源安全问题?
    初刷leetcode题目(2)——数据结构与算法
  • 原文地址:https://www.cnblogs.com/curryAhui/p/17173519.html