• 【Docker】docker 入门以及一些常用指令


    概述

    Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。

    为什么选择Docker

    轻量 快速 跨环境

    安装docker

    centos 环境

    yum install docker-io -y
    
    启动
    systemcl start docker
    
    设置开机启动

    设置开机启动 以后就不用每次运行了

     systemctl enable docker
    

    镜像操作

    1.介绍
    镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。

    • 父镜像

    父镜像提供了一个基本的操作系统环境,例如 centos linux 等等... 用户可以根据需要再上面安装和配置软件

    • 基础镜像
      一个没有任何父镜像的镜像,谓之基础镜像。
    • 镜像ID

    所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 碰撞机率,所以服务器总是返回长ID。

    [root@localhost ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/centos    latest              49f7960eb7e4        8 weeks ago         200 MB
    
    

    这里的IMAGE ID 就是镜像ID

    2.获取镜像

    你可以从镜像仓库拉去镜像

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    
    OPTIONS说明:
    
    -a :拉取所有 tagged 镜像
    
    --disable-content-trust :忽略镜像的校验,默认开启
    

    例如 现在要获取centos镜像

    [root@localhost ~]# docker pull centos
    Using default tag: latest
    Trying to pull repository docker.io/library/centos ...
    
    

    3.列出本地镜像

    镜像拉到本地后。我们要查看本底的镜像

    docker images [OPTIONS] [REPOSITORY[:TAG]]
    
    OPTIONS说明:
    
    -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
    
    --digests :显示镜像的摘要信息;
    
    -f :显示满足条件的镜像;
    
    --format :指定返回值的模板文件;
    
    --no-trunc :显示完整的镜像信息;
    
    -q :只显示镜像ID。
    

    例如现在查看本地镜像

    [root@localhost ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/centos    latest              49f7960eb7e4        8 weeks ago         200 MB
    
    
    • IMAGE ID 其中镜像的 ID 唯一标识了镜像
    • TAG 信息用来标记来自同一个仓库的不同镜像
    • CREATED 表示镜像的创建时间
    • SIZE 镜像大小

    4.创建镜像
    创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件Dockerfile创建一个

    • 修改已有镜像
      下载镜像
      运行并进入镜像做你爱做的事
      推出镜像 并保存修改
    [root@localhost ~]# docker pull centos
    Using default tag: latest
    Trying to pull repository docker.io/library/centos ...
    latest: Pulling from docker.io/library/centos
    Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322
    Status: Image is up to date for docker.io/centos:latest
    [root@localhost ~]# docker run -ti -d centos
    a70ce31c28ee2e31229421baa09c5833980b79d0ae04300e4508922f433c7c5f
    [root@localhost ~]# yum update
    
    
    [root@localhost ~]#docker commit -m "yum uppdate" -a "admin" 0b2616b0e5a8 docker-io/centos:v2
    

    docker commit 从容器创建一个新的镜像

    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    
    OPTIONS说明:
    
    -a :提交的镜像作者;
    
    -c :使用Dockerfile指令来创建镜像;
    
    -m :提交时的说明文字;
    
    -p :在commit时,将容器暂停。
    
    • 利用 Dockerfile 来创建镜像

    使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令

    • 上传镜像

    docker push

    5.存出和载入镜像

    • 存出镜像
    docker save [OPTIONS] IMAGE [IMAGE...]
    
    OPTIONS说明:
    
    -o :输出到的文件。
    

    将centos镜像存出为centos.tar

    [root@localhost ~]# docker save -o centos.tar centos
    [root@localhost ~]# ll
    总用量 203376
    -rw-------. 1 root root      1241 8月   1 17:50 anaconda-ks.cfg
    -rw-------. 1 root root 208250880 8月   4 04:49 centos.tar
    [root@localhost ~]#
    
    
    • 载入镜像
    docker load [OPTIONS] 
    
    OPTIONS说明:
    
    -i, –input string Read from tar archive file, instead of STDIN 
    从tar归档文件读取镜像,而不是标准输入流
    
    -q, –quiet Suppress the load output 
    禁止读入输出
    

    6.移除本地镜像

    docker rmi IMAGID

    [root@localhost ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/centos    latest              49f7960eb7e4        8 weeks ago         200 MB
    [root@localhost ~]# docker rmi centos
    
    

    容器操作

    容器的生命周期

    • run 运行容器
    • start/stop/restart 启动容器/终止/重启
    • kill 杀掉一个运行中的容器
    • rm 移除一个已经终止运行的容器
    • pause/unpause 暂停/恢复
    • create 创建一个新的容器但不启动它
    • exec 在运行的容器中执行命令

    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

    docker run
    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    OPTIONS说明:
    
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    
    -d: 后台运行容器,并返回容器ID;
    
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    
    -p: 端口映射,格式为:主机(宿主)端口:容器端口
    
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    
    --name="nginx-lb": 为容器指定一个名称;
    
    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    
    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    
    -h "mars": 指定容器的hostname;
    
    -e username="ritchie": 设置环境变量;
    
    --env-file=[]: 从指定文件读入环境变量;
    
    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
    
    -m :设置容器使用内存最大值;
    
    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    
    --link=[]: 添加链接到另一个容器;
    
    --expose=[]: 开放一个端口或一组端口;
    

    使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

    docker run --name mynginx -d nginx:latest
    

    使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

    docker run -P -d nginx:latest
    

    使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

    docker run -p 80:80 -v /data:/data -d nginx:latest
    

    绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

    docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
    

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

    docker run -it nginx:latest /bin/bash
    
    docker start

    可以利用 docker start 命令,直接将一个已经终止的容器启动运行。

    容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps 或 top 来查看进程信息。

    dockers ps -a   
    ....
    
    docker start imageid
    
    docker kill
    docker kill [OPTIONS] CONTAINER [CONTAINER...]
    OPTIONS说明:
    
    -s :向容器发送一个信号
    
    docker kill -s KILL mynginx  #杀掉运行中的容器mynginx
    
    docker rm
    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
    OPTIONS说明:
    
    -f :通过SIGKILL信号强制删除一个运行中的容器
    
    -l :移除容器间的网络连接,而非容器本身
    
    -v :-v 删除与容器关联的卷
    
    
    进入一个运行中的容器

    常用的两种

    第一种

    docker run -ti centos /bin/bash
    或
    docker run -ti exec centos /bin/bash
    

    第二种

    docker attach 容器id
    

    数据卷

    数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

    • 数据卷可以在容器之间共享和重用
    • 对数据卷的修改会立马生效
    • 对数据卷的更新,不会影响镜像
    • 卷会一直存在,直到没有容器使用
    创建一个数据卷挂载到容器

    在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷

    下面创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录。
    docker run -d -P --name web -v /webapp training/webapp python app.py
    
    挂载一个或多个目录/文件到容器
    挂载一个目录
    docker run -tid -v /opt/data:/opt/data centos
    
    挂载多个目录
    docker run -tid -v /opt/data:/opt/data -v /opt/log:/opt/log centos
    
    挂载一个文件到容器
    docker run -tid -v /opt/conf.cfg:/opt/conf.cfg centos
    

    挂载文件容易出现的问题:

    挂载文件后 Permission denied

    解决办法:

    1.在运行容器的时候,给容器加特权,也就是加上 --privileged=true 参数:

    docker run -tid   --privileged=true -v /opt/conf.cfg:/opt/conf.cfg centos
    

    2.临时关闭selinux

    setenforce 0
    

    3.添加selinux规则,改变要挂载的目录的安全性文本

    # 更改安全性文本的格式如下
    chcon [-R] [-t type] [-u user] [-r role] 文件或者目录
    
    选顷不参数: 
    -R  :连同该目录下癿次目录也同时修改; 
    -t  :后面接安全性本文的类型字段!例如 httpd_sys_content_t ; 
    -u  :后面接身份识别,例如 system_u; 
    -r  :后面街觇色,例如 system_r
    复制代码
      根据格式我们需要更改/data/share/master的安全性文档
    
    chcon -Rt svirt_sandbox_file_t /data/share/master
    

    网络操作

    外部访问容器

    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。

    当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。

    -p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。

    docker run -p 127.0.0.1:80:80 ...
    
    或
    
    docker run -p 80:80 ...
    

    • 映射所有接口地址

    使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行

    $ sudo docker run -d -p 5000:5000 ...
    # 此时默认会绑定本地所有接口上的所有地址。
    

    • 映射到指定地址的指定端口

    ip:hostPort:containerPort 格式指定映射使用一个特定地址

    docker run -p 127.0.0.1:80:80 ...
    

    • 映射到指定地址的任意端口

    ip::containerPort 绑定 localhost 的任意端口到容器的

    docker run -d -p 127.0.0.1::5000
    

    • 查看映射端口配置

    #  docker port CONTAINER [PRIVATE_PORT[/PROTO]]
    
    docker port centos 80
    
  • 相关阅读:
    分布式系统阅读笔记(六)-----间接通信
    分布式系统阅读笔记(六)-----间接通信
    分布式系统阅读笔记(六)-----间接通信
    分布式系统阅读笔记(七)-----操作系统的支持
    分布式系统阅读笔记(七)-----操作系统的支持
    分布式系统阅读笔记(七)-----操作系统的支持
    分布式系统阅读笔记(八)-----分布式对象和组件
    sizeof()
    void *
    strcpy函数的实现
  • 原文地址:https://www.cnblogs.com/zimuzimu/p/9437655.html
Copyright © 2020-2023  润新知