Docker基础

Docker基础

Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以和管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,大大减少编写代码和在生产环境中运行代码之间的延迟。

Docker提供了在简单、隔离的环境(称为容器)中打包和运行应用程序的功能。隔离和安全性使您可以在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器。您甚至可以在虚拟机的主机中运行Docker容器!

Docker提供了工具和平台来管理容器的生命周期:

  1. 使用容器开发应用程序及其支持组件。
  2. 容器成为分发和测试应用程序的单元。
  3. 准备就绪后,可以将应用程序作为容器或协调服务部署到生产环境中。无您的生产环境是本地数据中心,云提供商还是两者的混合,其工作原理都相同。

Docker引擎

Docker是具有以下主要组件的客户端-服务器应用程序。

  • 以守护程序进程的方式运行。
  • 使用REST API与守护程序进行通信并指示其操作的接口。
  • 命令行界面(CLI)客户端(docker命令)。

Docker架构

Docker使用客户端-服务器架构。Docker 客户端与Docker 守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。

Docker安装

通常情况下,我们有两种安装Docker的方式,一种是:yum,另一种是二进制安装包。Docker一般情况下是安装在Ubuntu中,因为其内核版本比较高,本次咱们采用CentOS 7

在CentOS上安装

  1. 在阿里云上下载docker-ce.repo

    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoCopy to clipboardErrorCopied
    
  2. 安装基础包

    yum install -y yum-utils device-mapper-persistent-data lvm2Copy to clipboardErrorCopied
    
  3. 刷新缓存

    yum makecache fastCopy to clipboardErrorCopied
    
  4. 安装

    # 如果是CentOS 8需要安装下面的包
    wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm
    
    yum localinstall containerd.io-1.2.13-3.2.el7.x86_64.rpm -y
    
    yum -y install docker-ceCopy to clipboardErrorCopied
    
  5. 启动

    systemctl enable --now dockerCopy to clipboardErrorCopied
    
  6. 验证

    [root@localhost ~]# docker info
    Client:
     Debug Mode: false
    
    Server:
     Containers: 15
      Running: 5
      Paused: 0
      Stopped: 10
     Images: 26
     Server Version: 18.09.9
     Storage Driver: overlay2
      Backing Filesystem: xfs
      Supports d_type: true
      Native Overlay Diff: true
     Logging Driver: json-file
     Cgroup Driver: systemd
     Plugins:
      Volume: local
      Network: bridge host macvlan null overlay
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
     Swarm: inactive
     Runtimes: runc
     Default Runtime: runc
     Init Binary: docker-init
     containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
     runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f
     init version: fec3683
     Security Options:
      seccomp
       Profile: default
     Kernel Version: 4.18.0-80.11.2.el8_0.x86_64
     Operating System: CentOS Linux 8 (Core)
     OSType: linux
     Architecture: x86_64
     CPUs: 4
     Total Memory: 1.92GiB
     Name: localhost.localdomain
     ID: FLZM:42YD:NC2K:NATO:YPCA:T6IY:G647:OKPA:WJKK:Z4TQ:AN7R:TMSB
     Docker Root Dir: /var/lib/docker
     Debug Mode: false
     Registry: https://index.docker.io/v1/
     Labels:
     Experimental: false
     Insecure Registries:
      127.0.0.0/8
     Registry Mirrors:
      https://hjvrgh7a.mirror.aliyuncs.com/
     Live Restore Enabled: false
     Product License: Community EngineCopy to clipboardErrorCopied
    

在Ubuntu上安装

  1. 安装必要的一些系统工具

    apt-get -y install apt-transport-https ca-certificates curl software-properties-commonCopy to clipboardErrorCopied
    
  2. 安装GPG证书

    curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -Copy to clipboardErrorCopied
    
  3. 写入软件源信息

    sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"Copy to clipboardErrorCopied
    
  4. 更新并安装Docker-CE

    sudo apt-get -y update
    sudo apt-get -y install docker-ceCopy to clipboardErrorCopied
    
  5. 添加配置

添加配置

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://hjvrgh7a.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOFCopy to clipboardErrorCopied

基本使用

Docker容器中至少有一个应用程序运行在前台。

创建容器

docker run -it centos bashCopy to clipboardErrorCopied

docker run:有两个过程:

  1. 检测当前使用的镜像本地是否有,没有则去远程仓库拉取。
  2. 将镜像实例化成容器。

在docker容器中,至少要有一个应用程序运行在前台,否则在启动的一瞬间生命周期就结束了。

为什么加上-it参数之后,就可以了呢?因为伪终端是运行在前台的。

进入容器

在使用容器的过程中,我们难免需要进入容器进行排查问题。下面我们就来介绍进入容器的集中方式。

acctch

使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作,当所有窗口退出时,容器结束。

[root@instance-gvpb80ao docs]# docker attach nginx
127.0.0.1 - "GET / HTTP/1.1" 308 171 "-" "curl/7.59.0" 0.000 - .Copy to clipboardErrorCopied

exec

这个命令相当于在容器中执行一个命令。官方推荐

[root@instance-gvpb80ao docs]# docker exec -it nginx /bin/bash
nginx [ / ]$
nginx [ / ]$Copy to clipboardErrorCopied

nsenter

需要配合docker inspect来使用(企业当中最长用的方式之一),Docker是用golang语言开发,所以它也支持go语言的摸版语法。

[root@instance-gvpb80ao docs]# nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
root@6f99ae8757f7:/#Copy to clipboardErrorCopied

SSH

在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容器内。

总结

进入docker container中一般情况下有4种方式,最常用的是exec和nsenter这两种。

  • Nsenter和exec之间的区别?
    • Exec是docker自带的命令,Nsenter是Linux提供的命令。
    • Exec相当于在容器内执行一个命令,而Nsenter是仅仅进入容器之中而已。

端口映射

docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

固定端口

指定端口映射

[root@instance-gvpb80ao docs]# docker run -d -p 8099:80 nginx
5e3c9d5eba477dc7a0e23cc661916d2a7545bc6e65a2de5660e2e20d0abf6fe2
[root@instance-gvpb80ao docs]# docker ps | grep 8099
5e3c9d5eba47 nginx    "/docker-entrypoint.…" 10 seconds ago  Up 9 seconds  0.0.0.0:8099->80/tcp   cool_williamsonCopy to clipboardErrorCopied

随机端口

[root@instance-gvpb80ao docs]# docker run -d --name ppp -P nginx
914e31c98f9b7c3df226076272f4d5b9a2cf99ff3b578baf792eaace4ea6dc7e
[root@instance-gvpb80ao docs]# docker ps | grep ppp
914e31c98f9b  nginx   "/docker-entrypoint.…"   6 seconds ago Up 5 seconds  0.0.0.0:32768->80/tcp  pppCopy to clipboardErrorCopied

复制文件

我们在使用容器的过程中,难免的想临时的与宿主主机之间交换文件。

从容器内复制到容器外

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

[root@instance-gvpb80ao docs]# docker cp daf9c3656be3:/usr/share/nginx/html/index.html .
[root@instance-gvpb80ao docs]# ll | grep index
-rw-r--r-- 1 root root    612 8月  11 22:50 index.htmlCopy to clipboardErrorCopied

从容器外复制到容器内

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
[root@instance-gvpb80ao docs]# docker cp test.yaml daf9c3656be3:/usr/share/nginx/html/
[root@instance-gvpb80ao docs]# docker exec daf9c3656be3 ls /usr/share/nginx/html
50x.html
index.html
test.yamlCopy to clipboardErrorCopied

镜像的导入与导出

有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一个文件,再拷贝到另一台电脑上导入使用。

对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。

使用 export 和 import

export 和 import的针对点是容器,将本机的容器导出为镜像包。

  • 使用export保存容器为镜像
[root@instance-gvpb80ao docs]# docker export daf9c3656be3 > nginx.tar
[root@instance-gvpb80ao docs]# ll | grep nginx.tar
-rw-r--r-- 1 root root 135117824 9月  24 20:51 nginx.tarCopy to clipboardErrorCopied
  • 使用import导入包为镜像
[root@instance-gvpb80ao docs]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
[root@instance-gvpb80ao docs]# docker images | grep test
test/nginx                                                        v1                         02107323de1b        22 seconds ago      131MBCopy to clipboardErrorCopied

使用 save 和 load

save 和 load的正对点是镜像,将本机的镜像导入、导出为镜像包。

  • 使用save保存镜像
[root@instance-gvpb80ao docs]# docker save 6858809bf669 > busybox.tar
[root@instance-gvpb80ao docs]# ll | grep busy
-rw-r--r-- 1 root root   1458176 9月  24 21:01 busybox.tarCopy to clipboardErrorCopied
  • 使用save保存多个镜像
[root@instance-gvpb80ao docs]# docker save -o test.tar busybox nginx:1.18.0
[root@instance-gvpb80ao docs]# docker load < test.tar
Loaded image: busybox:latest
Loaded image: nginx:1.18.0Copy to clipboardErrorCopied
  • 使用load导入镜像
[root@instance-gvpb80ao docs]# docker load < busybox.tar
[root@instance-gvpb80ao docs]# docker load -i busybox.tar
Loaded image ID: sha256:6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
[root@instance-gvpb80ao docs]# docker images | grep 685880
busybox                                                           latest                     6858809bf669        2 weeks ago         1.23MBCopy to clipboardErrorCopied

两种方案的差别

  • 文件大小不同
    • export导出的镜像文件体积小于 save 保存的镜像
  • 是否可以对镜像重命名
    • docker import可以为镜像指定新名称
    • docker load不能对载入的镜像重命名
  • 是否可以同时将多个镜像打包到一个文件中
    • docker export不支持
    • docker save支持
  • 是否包含镜像历史
    • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。

    • save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

      [root@instance-gvpb80ao docs]# docker history 6858809bf669cc5da7cb6af83d0fae838284d12e1be0182f92f6bd96559873e3
      IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
      6858809bf669        2 weeks ago         /bin/sh -c #(nop)  CMD ["sh"]                   0B
      <missing>           2 weeks ago         /bin/sh -c #(nop) ADD file:72be520892d0a903d…   1.23MBCopy to clipboardErrorCopied
      
  • 应用场景不同
    • docker export的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
    • docker save的应用场景:如果我们的应用是使用docker-compose.yml编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。

docker地址参考

# docker官网:
	https://docs.docker.com/
# docker github地址:
	https://github.com/docker/docker
# docker hub 官网
	https://registry.hub.docker.com
# 镜像加速器地址:
	https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

docker使用语法

# 镜像
	查看官网镜像:docker search centos	
	下载镜像:docker pull centos
	查看镜像:docker images
	删除镜像:docker rmi centos

启动容器

	#以交互式方式启动并进入到容器(ctrl+p,ctrl+q退出容器或者输入exit,这样容器可以在后台运行):
		docker run --name=hello -it centos /bin/bash
	# 以守护进程方式启动容器
		docker run --name=hello1 -itd centos /bin/bash
	# 查看正在运行的容器
		docker ps
	# 停止容器
		docker stop 容器名
	# 启动已经停止的容器
		docker start 容器名
	# 进入容器
		docker exec -it hello /bin/bash
	# 查看端口映射情况
		docker port nginx
	# 创建一个映射了80端口的交互式容器
		docker run --name nginx -p 88:80 -itd centos /bin/bash 
	

进入容器

# 进入容器名为nginx的容器
	docker exec -it nginx /bin/bash 

Docker容器的数据卷

数据卷特点描述

# 设计目的:
	在于数据永久性,docker不会在容器删除时删除其挂载的数据卷,同一个数据卷可以支持多个容器的访问。
	
# 特点:
	1.数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中
	2.数据卷可以在容器之间共享和重用
	3.可以对数据卷里的内容直接进行修改
	4.数据卷的变化不会影像镜像的更新
	5.卷会一直存在,即使挂载数据卷的容器已经被删除

数据卷的使用

# 为容器添加数据卷(宿主机/datavolue挂载到容器/data目录)
docker run -v /datavolume:/data -it centos /bin/bash

# 为数据卷添加访问权限(docker容器/data目录下不能创建文件,仅只读,宿主机/datavolue1可创建文件)
docker run --name volume1 -v ~/datavolume1:/data:ro -itd centos  /bin/bash

容器挂载数据卷

# 什么是数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器

容器挂载数据卷方式

docker run --volumes-from [container name]

# 例:
` 创建centos容器,将宿主机挂载至容器中`
docker run --name data-volume -v ~/datavolume1:/data -itd centos
` 创建一个新的容器挂载刚才data-volume这个容器的数据卷`
docker run --name data-volume2 --volumes-from data-volume -itd centos /bin/bash
` 验证`(查看在容器2中是否存在容器1目录)
docker exec -it data-volume2 /bin/bash

docker数据卷的备份和还原

# 实现原理(备份)
	创建新容器时挂载基于需要备份容器,在新容器中即可共享老容器数据,并且在启动新容器时再次创建一个挂载,进入新容器,将老容器的数据备份,存放至新容器的挂载点,同时,数据也就保存到了宿主机
	
# 实现原理(还原)
	创建新容器时挂载基于需要备份容器,在新容器中即可共享老容器数据,并且在启动新容器时再次创建一个挂载,进入新容器,将宿主机挂载到新容器数据还原至共享老容器数据存储目录。
	
# 备份方式
docker run  --volumes-from [container name] -v $(pwd):/backup centos tar czvf /backup/backup.tar [container data volume]

# 例:
docker run --volumes-from 老容器名  -v  /root/backup:/backup --name 新容器名称 centos tar zcvf /backup/data-volume2.tar.gz /datavolume6

# 备份数据还原:
docker run --volumes-from [container name] -v $(pwd):/backup centos tar xzvf /backup/backup.tar.gz -C [container data volume]
posted @ 2020-10-17 20:59  元气少女郭德纲!!  阅读(310)  评论(0编辑  收藏  举报