Docker基本使用

Linux安装Docker

Docker版本:

  • 社区版(Community Edition,CE)
  • 企业版(Enterprise Edition,EE)

支持平台:

  • Linux(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)
  • Mac
  • Windows

Linux安装Docker

1、更换源:
#安装base reop源
yum install wget -y
cd /etc/yum.repos.d

#接着备份旧的配置文件
mv CentOS-Base.repo CentOS-Base.repo.bak

#下载阿里源的文件
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#安装epel repo源:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

#.清理缓存
yum clean all

#重新生成缓存
yum makecache

#安装epel-release源
yum -y remvoe  epel-release
yum -y install   epel-release

#yum 安装完之后别忘了清除一下cache
yum clean all
2、安装dockers
【安装文档网址】https://docs.docker.com/
【centos最新安装网址】https://docs.docker.com/engine/install/centos/
【17版本安装网址】https://docs.docker.com/v17.06/engine/installation/linux/docker-ce/centos/#prerequisites
注意:生产环境使用最多是docker-ce-17.12版本
#关闭防火墙和seliunx
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config 	# 永久
setenforce 0 # 临时

#卸载旧版本的源
sudo yum -y remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

#安装源。yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序。
yum install -y yum-utils device-mapper-persistent-data lvm2


#配置源,如果不能配置离线安装或者采用阿里源
#sudo  yum-config-manager \
#    --add-repo \
#   https://download.docker.com/linux/centos/docker-ce.repo
#使用阿里源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#特殊说明。禁用/开启库
#yum-config-manager --disable docker-ce-edge
#                   --enable docker-ce-edge

#安装docker-ce
sudo yum  -y install docker-ce docker-ce-cli containerd.io

#启动docker加入开机启动
sudo systemctl start docker
sudo systemctl enable docker

#docker通过运行hello-world 映像来验证是否已正确安装。
sudo docker run hello-world

#修改docker镜像源,使用加速镜像源
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
sudo systemctl daemon-reload 
sudo systemctl restart docker

#查看可用的docker版本
yum list docker-ce.x86_64  --showduplicates | sort -r
#:版本字符串是程序包名称加上直到第一个连字符的版本。例如:docker-ce-17.06.1.ce
sudo yum install <FULLY-QUALIFIED-PACKAGE-NAME>
3、卸载docker
#卸载Docker软件包:
sudo yum remove docker-ce 
#主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
sudo rm -rf /var/lib/docker
4、docker详情查看
[root@localhost ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)
  scan: Docker Scan (Docker Inc., v0.8.0)

Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 1
 Server Version: 20.10.8
 Storage Driver: overlay2  #存储驱动目录
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: e25210fe30a0a703442421b0f60afac609f950a3
 runc version: v1.0.1-0-g4144b63
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-862.14.4.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 3.685GiB
 Name: localhost.localdomain
 ID: H5AC:HDAI:3HKK:IRQH:EVGE:5ZNQ:XNSQ:QYLL:V3TN:NS6I:AA7V:4FYE
 Docker Root Dir: /var/lib/docker  #docker文件目录
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  http://f1361db2.m.daocloud.io/
 Live Restore Enabled: false
  • Client: #docker客户端信息
  • Server: #docker服务端信息
  • Containers: #容器数量
  • Images: #镜像数量
  • Server Version: #docker版本
  • Storage Driver: #docker的存储驱动目录
  • Docker Root Dir: #docker根目录
  • Registry Mirrors: #当前使用的镜像源

二、理解容器与镜像

1、镜像是什么?
  • 一个分层存储的文件,不是一个单一的文件
  • 一个软件的环境
  • 一个镜像可以创建N个容器
  • 一种标准化的交付
  • 一个不包含Linux内核而又精简的Linux操作系统
2、镜像从哪里来?

Docker Hub是由Docker公司负责维护的公共镜像仓库,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜 像。

仓库地址:https://hub.docker.com

#配置镜像加速器:
cat >> /etc/docker/daemon.json <<EOF
{ "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] }
EOF

三、理解容器与镜像

在这里插入图片描述

  • 镜像:类似于虚拟机镜像,一个只读模板
  • 容器:通过镜像创建的运行实例

四、管理镜像常用命令

1、docker --help详解
Management Commands(管理命令):
  app*        Docker App (Docker Inc., v0.9.1-beta3)    #Docker应用程序
  builder     Manage builds                             #构建管理
  buildx*     Build with BuildKit (Docker Inc., v0.6.1-docker)
  config      Manage Docker configs                     #配置管理
  container   Manage containers                         #容器管理
  context     Manage contexts                           #上下文管理
  image       Manage images                             #镜像管理
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks                           #网络管理
  node        Manage Swarm nodes                        #节点管理
  plugin      Manage plugins                            #插件管理
  scan*       Docker Scan (Docker Inc., v0.8.0)
  secret      Manage Docker secrets                     #密钥管理
  service     Manage services                           #服务管理
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker                            
  trust       Manage trust on Docker images
  volume      Manage volumes                            #数据卷管理

Commands:
    attach    Attach to a running container                 # 当前 shell 下 attach 连接指定运行镜像
    build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像
    commit    Create a new image from a container's changes # 提交当前容器为新的镜像
    cp        Copy files/folders from the containers filesystem to the host path
              # 从容器中拷贝指定文件或者目录到宿主机中
    create    Create a new container                        # 创建一个新的容器,同 run,但不启动容器
    diff      Inspect changes on a container's filesystem   # 查看 docker 容器变化
    events    Get real time events from the server          # 从 docker 服务获取容器实时事件
    exec      Run a command in an existing container        # 在已存在的容器上运行命令
    export    Stream the contents of a container as a tar archive   
              # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
    history   Show the history of an image                  # 展示一个镜像形成历史
    images    List images                                   # 列出系统当前镜像
    import    Create a new filesystem image from the contents of a tarball  
              # 从tar包中的内容创建一个新的文件系统映像[对应 export]
    info      Display system-wide information               # 显示系统相关信息
    inspect   Return low-level information on a container   # 查看容器详细信息
    kill      Kill a running container                      # kill 指定 docker 容器
    load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应 save]
    login     Register or Login to the docker registry server   
              # 注册或者登陆一个 docker 源服务器
    logout    Log out from a Docker registry server         # 从当前 Docker registry 退出
    logs      Fetch the logs of a container                 # 输出当前容器日志信息
    port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
              # 查看映射端口对应的容器内部源端口
    pause     Pause all processes within a container        # 暂停容器
    ps        List containers                               # 列出容器列表
    pull      Pull an image or a repository from the docker registry server
              # 从docker镜像源服务器拉取指定镜像或者库镜像
    push      Push an image or a repository to the docker registry server
              # 推送指定镜像或者库镜像至docker源服务器
    restart   Restart a running container                   # 重启运行的容器
    rm        Remove one or more containers                 # 移除一个或者多个容器
    rmi       Remove one or more images                 
              # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
    run       Run a command in a new container
              # 创建一个新的容器并运行一个命令
    save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应 load]
    search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像
    start     Start a stopped containers                    # 启动容器
    stop      Stop a running containers                     # 停止容器
    tag       Tag an image into a repository                # 给源中镜像打标签
    top       Lookup the running processes of a container   # 查看容器中运行的进程信息
    unpause   Unpause a paused container                    # 取消暂停容器
    version   Show the docker version information           # 查看 docker 版本号
    wait      Block until a container stops, then print its exit code   
              # 截取容器停止时的退出状态值
2、常用命令
指令描述
ls列出
bulid构建镜像来自Dockerfile
history查看镜像历史
inspect显示一个或多个镜像详细信息
pull从镜像仓库拉取镜像
push推送一个镜像到镜像仓库
rm移除一个或多个镜像
prune移除没有被标记或者没有被任何容器引用的镜像
tag创建一个引用源镜像标记目标镜像
save保存一个或多个镜像到一个tar归档文件
load加载镜像来自tar归档或标准输入
#列出运行的容器
[root@localhost ~]# docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
ec446d3ce93f   nginx     "/docker-entrypoint.…"   26 minutes ago   Up 26 minutes   80/tcp    web1

#查看镜像历史
[root@localhost ~]# docker history nginx
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
08b152afcfae   3 weeks ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B        
<missing>      3 weeks ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B        
<missing>      3 weeks ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
<missing>      3 weeks ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B        
<missing>      3 weeks ago   /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB    
<missing>      3 weeks ago   /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB    
<missing>      3 weeks ago   /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB    
<missing>      3 weeks ago   /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB     
<missing>      3 weeks ago   /bin/sh -c set -x     && addgroup --system -…   63.9MB    
<missing>      3 weeks ago   /bin/sh -c #(nop)  ENV PKG_RELEASE=1~buster     0B        
<missing>      3 weeks ago   /bin/sh -c #(nop)  ENV NJS_VERSION=0.6.1        0B        
<missing>      3 weeks ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.21.1     0B        
<missing>      3 weeks ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B        
<missing>      3 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      3 weeks ago   /bin/sh -c #(nop) ADD file:45f5dfa135c848a34…   69.3MB    #添加rootfs 

#查看镜像详细信息
docker inspect nginx
【可参考地址】https://www.cnblogs.com/poloyy/p/13994377.html

#在 https://hub.docker.com 免费注册一个 Docker 账号。
账户:jiawenchao
密码:xxxx521xxxx

#docker拉取镜像(docker pull 镜像名称:tag)
$ docker pull nginx:1.16

#仓库推送镜像,需要先登陆仓库(docker push 仓库地址/仓库名称/镜像名称:tag)
docker login -u jiawenchao -p maba521xxxx     #登陆成功
docker tag nginx:1.16  jiawenchao/nginx:1.16  #重新打包
docker push jiawenchao/nginx:1.16             #上传镜像到仓库
docker pull jiawenchao/nginx:1.16             #下载仓库镜像到服务器上

#删除镜像(docker image rm 镜像名称:tag)
docker image rm  jiawenchao/nginx:1.16
docker  rm  $(docker ps -aq)                  #删除所有没有使用的镜像
docker  rm -f $(docker ps -aq)                #强制删除所有镜像

#删除没被使用镜像
docker image prune
docker image prune -a                         #移除所有没被使用镜像

#重新打包(docker tag 初始镜像名称  更新的镜像名称  #重新打包)
docker tag nginx:1.16  jiawenchao/nginx:1.16  

#导出修改过后容器为新镜像压缩包
docker  export  容器_id  > cenos6.tar 			

#导入镜像压缩包为新镜像
cat centos.tar | docker import  -  centos6_newname  

#导出一个镜像为压缩包
docker image save nginx > nginx.tar

#导入压缩包为一个镜像
docker image load < nginx.tar

3、常用命令语法详解

https://blog.csdn.net/ljlfather/article/details/105532305


五、镜像存储核心技术

镜像怎么高效存储?

  • 引入联合文件系统(UnionFS),将镜像多层文件联合挂载到容器文件系统。
1、联合文件系统UnioFS

在这里插入图片描述

  • 一个典型的场景如下所示,一个镜像文件里面,里面分了多层,最下面的是基础镜像,这个基础镜像不包括内核文件,执行的时候他会直接调用宿主机的内核,因此他的空间并不大。在基础镜像上面,又分了很多层,每一层代表在dockerfile里面执行的一行命令。这整个镜像文件都是只读的。每个容器通过镜像创建自己的容器层,而容器层是可以读写的,修改的内容他们会保存在自己的目录下面。因此每个容器对自己的修改 不会影响到其他容器。
    在这里插入图片描述
    容器层读写:
  • 提供一个独立运行环境。
  • 同一个镜像启动的不同容器相互隔离。
  • 修改一个容器不会影响其他容器。
2、写时复制

了解联合文件系统,知道镜像只读,类似于共享形式让多个文件使用,如果修改1镜像里的文件,那该怎么办呢?

  • 引入写时复制(copy-on-write),需要修改文件操作时,会先从基础镜像把要修改的文件复制到自己文件系统(容器中),然后让其在自己容器中修改。
  • 修改过后并不影响基础镜像或者其他基于基础镜像启动容器。
  • 写时复制是通过驱动Storage Driver: overlay2实现,默认驱动overlay2性能最好。
    在这里插入图片描述
    三层说明:
  • merged #容器挂载层
  • upperdir #容器层
  • lowerdir #镜像层

【overlay工作原理】

我们通过镜像创建的容器包括了三层

  • 最下面的是一个只读的镜像层,第二层是容器层,在他上面最上面的容器挂载层。
  • 最上层显示的是我们在容器上直接看见的内容,他通过UnionFS,或者说类似软连接的方式,文件的路径指向了容器层或者是镜像层。

当我们尝试读取,修改或者创建一个新的文件时

  • 我们总是从上到下进行搜索,如果在容器层找到了,那么就直接打开。
  • 如果容器层没有,那就从镜像层打开。
  • 如果是一个新建的文档,那么就从镜像层拷贝到容器层,再打开操作。

读、写、删除:先查容器层——》镜像层——》结束

3、三层查看
#查看启动ID
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
f8733ed144ac   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web2
928f069f0180   nginx     "/docker-entrypoint.…"   About an hour ago    Up About an hour    80/tcp    web1

#查看web1存储模块
[root@localhost ~]# docker inspect f8733ed144ac |grep "overlay2"
        "Driver": "overlay2",
                "LowerDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff:/var/lib/docker/overlay2/d1495e59d7fde7382ba3a1eb2c388988be217d4ed3da62613c0b9f7a1025e740/diff:/var/lib/docker/overlay2/df3fb02cdb70a2b9b01af02b46829113d2b4ecba176535ad7d6883ece429cdac/diff:/var/lib/docker/overlay2/4897b0c4c60dd1ad2dbc431c6953c7641a9963c6386d7e75b38fac099613b0c7/diff:/var/lib/docker/overlay2/b6eecaa8517e940b9336d5204a56f5d5c8d4b626eee7798cd3fb85a126e94329/diff:/var/lib/docker/overlay2/6221fbd6852b12077fcf556e9b12ac69213c55002608a5ded6d0497884847132/diff:/var/lib/docker/overlay2/2e366ccc8ea25e13a9bbcf685c70e83c90ed2afc49089091a7a9bf08608b71fe/diff",
                "MergedDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/merged",
                "UpperDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff",
                "WorkDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/work"
            "Name": "overlay2"

#查看LowerDir(镜像层),
[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff
dev  etc
[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff/etc/
hostname  hosts  mtab  resolv.conf

容器首先会先挂载宿主机三个文件

  • hostname
  • hosts
  • resolv.conf
#容器层创建一个文件是否是存储1在对应的“UpperDir”层
[root@localhost ~]# docker ps|grep web2
f8733ed144ac   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   80/tcp    web2
[root@localhost ~]# docker inspect web2 |grep "overlay2"
        "Driver": "overlay2",
                "LowerDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33-init/diff:/var/lib/docker/overlay2/d1495e59d7fde7382ba3a1eb2c388988be217d4ed3da62613c0b9f7a1025e740/diff:/var/lib/docker/overlay2/df3fb02cdb70a2b9b01af02b46829113d2b4ecba176535ad7d6883ece429cdac/diff:/var/lib/docker/overlay2/4897b0c4c60dd1ad2dbc431c6953c7641a9963c6386d7e75b38fac099613b0c7/diff:/var/lib/docker/overlay2/b6eecaa8517e940b9336d5204a56f5d5c8d4b626eee7798cd3fb85a126e94329/diff:/var/lib/docker/overlay2/6221fbd6852b12077fcf556e9b12ac69213c55002608a5ded6d0497884847132/diff:/var/lib/docker/overlay2/2e366ccc8ea25e13a9bbcf685c70e83c90ed2afc49089091a7a9bf08608b71fe/diff",
                "MergedDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/merged",
                "UpperDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff",
                "WorkDir": "/var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/work"
            "Name": "overlay2"

[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff/
etc  root  run  var
[root@localhost ~]# docker exec -it web2 /bin/bash
root@f8733ed144ac:/# touch a
root@f8733ed144ac:/# exit
exit

#确认容器中修改文件是存储在容器层
[root@localhost ~]# ls /var/lib/docker/overlay2/85262d16542c936d2770237c87899b495c37893005c60dca30c42e7db952cf33/diff/
a  etc  root  run  var
4、优化建议
  • 追求磁盘读写IO比较高,使用ssd固态硬盘,放在 /var/lib/docker/overlay2此位置。
  • 使用卷作为频繁读写的工作目录,绕过存储驱动,减少抽象开销。
    • 绕过驱动是指将容器读写数据持久化到宿主机上
      • 持久化是指通过数据卷实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨话浮生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值