【Docker】狂神说

图片后补
官网: https://www.docker.com/

Docker概述

Docker为什么出现

  1. 原因:环境配置不能跨平台

  2. 方案

    传统方式:jar(开发人员)+ 部署(运维人员)

    解决方式:开发打包上线一套流程

  3. Docker的思想来源于集装箱

    1. JRE — 多个应用(容易引起端口冲突/配置错误/连接错误)— 原来是交叉应用的
    2. 隔离:Docker核心思想,打集装箱,每个箱子都是互相隔离
  4. Docker通过隔离机制可以将服务器利用到极致

Docker历史

  1. Docker:容器化技术,
  2. 也是一种虚拟化技术,相对于虚拟机较为轻巧,
  3. 最核心的环境只有几兆,可以在这个基础上添加jdk和mysql环境,
  4. 运行的时候运行镜像就可以

Docker是基于Go语言开发的一个开源项目

官方文档: https://docs.docker.com/

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

Docker能做什么

虚拟机

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虚拟机技术缺点

  1. 资源占用多
  2. 冗余步骤多
  3. 启动较慢

容器化技术

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

容器化技术不是模拟的一个完整的操作系统

Docker 和 虚拟机技术 的不同

  1. 传统虚拟机:虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  2. 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以较为轻便
  3. 每个容器间是相互隔离,每个容器内都有一个属于自己的文件系统,互不影响

DevOps(开发+运维)

四个特点:

应用更快速的交付和部署

  1. 传统:一堆帮助文档,安装程序
  2. Docker:打包镜像 发布测试 一键运行

更快捷的升级和扩缩容

  1. 使用了Docker之后,部署应用就像搭积木一样
  2. 将项目打包为一个镜像(带着环境,可以直接运行),水平扩展 服务器A;服务器B(当服务器A遇到问题需要用负载均衡解决的时候可以在服务器B上直接运行镜像,这样就可以实现扩展)

更简单的系统运维

​ 容器化之后,开发、测试环境都是高度一致的

更高效的计算资源利用

​ Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例,服务器的性能可以被压榨到极致

Docker安装

Docker的基本组成

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

镜像(image)

Docker镜像好比是一个模板,可以通过这个模板来创建容器服务

tomcat镜像==》run==》tomcat01容器(提供服务器)

容器(container)

Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建。

基本命令:启动 停止 删除

目前可以将这个容器理解为一个简易的Linux系统

仓库(repository)

仓库是存放镜像的地方

仓库分为共有仓库和私有仓库

Docker Hub(默认是国外的)

阿里云,华为云等都有容器服务器(配置镜像加速)

安装

ubuntu

我的环境(换成centos了,教程在ubuntu后面):Oracle VM VirtualBox 虚拟机版本:Ubuntu 18.04??

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 卸载已经安装的版本:

    1. 命令:sudo apt-get remove docker docker-engine docker.io containerd runc
    2. 如果没有安装过,会报如下信息:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  2. 设置仓库

    1. 更新apt包索引:

      sudo apt-get update

    2. 安装apt依赖包,用于通过HTTPS来获取仓库

    sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release
    
    1. 添加gpc秘钥

      curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
      
    2. 使用aliyun镜像

echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/ubuntu/ \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装Docker引擎

     sudo apt-get update$ sudo apt-get install docker-ce docker-ce-cli containerd.io
    
  2. 启动Docker systemctl start docker

  3. 查看版本(是否安装成功) sudo docker version

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. 测试运行
    sudo docker run hello-world外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. 查看hello-world镜像 sudo docker images

  6. 了解:卸载

    1. 卸载依赖
    2. 删除资源
    3. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CentOS

Oracle VM VirtualBox 虚拟机版本:CentOS-7

  1. 卸载已经安装的版本

    1. sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
      
    2. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 设置存储库

    1. # 安装yum-utils包
      yum install -y yum-utils# 设置镜像仓库
      # 官方(不推荐,太慢)
      sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
      # 国内镜像(阿里云)
      yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      
  3. 安装Docker引擎

    1. 安装最新版本的 Docker Engine 和 containerd,或者进入下一步安装特定版本:
      # 安装最新Docker
      sudo yum install docker-ce docker-ce-cli containerd.io
      
  4. 更新yum软件包索引 yum makecache fast

  5. 安装Docker相关的

    1. docker-ce:社区版 ee:企业版

    2. # 安装最新版本
      yum install docker-ce docker-ce-cli containerd.io
      # 也可指定版本进行安装
      

之后的步骤参考ubuntu

docker的默认工作路径:/var/lib/docker ;查看的时候需要权限sudo

配置阿里云镜像加速

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回顾HelloWorld流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

底层原理

Docker是怎么工作的

  1. Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问
  2. Docker-Server接收到Docker-Client的指令,就会执行这个命令

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker为什么比VM快?

  1. Docker有着比虚拟机更少的抽象层
  2. Docker利用的是宿主机的内核,VM需要的是Guest OS

所以新建一个容器的时候,docker不需要虚拟机一样重新加载一个操作系统的内核,避免引导。

虚拟机是加载Guest OS,是分钟级别的;Docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker的常用命令

帮助命令

docker version  	# 显示Docker版本信息
docker info			# 显示Docker的系统信息,包括镜像和容器的数量
docker --help   	# 帮助命令

帮助文档:: https://docs.docker.com/engine/reference/commandline/

镜像命令

docker images

查看所有本地的主机上的镜像

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解释:

# 解释
REPOSITORY			# 镜像的仓库源
TAG 				# 镜像的标签
IMAGE ID 			# 镜像的id
CREATED				# 镜像的创建时间
SIZE				# 镜像的大小# 可选项
-a,--all			# 列出所有镜像
-q,--quiet 			# 只显示镜像的id# 测试运行:
lixiaolu@lixiaolu-VirtualBox:~$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   2 months ago   13.3kB
lixiaolu@lixiaolu-VirtualBox:~$ sudo docker images -a
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   2 months ago   13.3kB
lixiaolu@lixiaolu-VirtualBox:~$ sudo docker images -q
d1165f221234

docker search

搜索镜像

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# 可执行命令
lixiaolu@lixiaolu-VirtualBox:~$ sudo docker search --helpUsage:  docker search [OPTIONS] TERMSearch the Docker Hub for imagesOptions:-f, --filter filter   Filter output based on conditions provided--format string   Pretty-print search using a Go template--limit int       Max number of search results (default 25)--no-trunc        Don't truncate output# 可选项,通过收藏来过滤;搜索收藏超过4000的
lixiaolu@lixiaolu-VirtualBox:~$ sudo docker search mysql --filter=stars=4000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   10944     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4137      [OK]  

docker pull

下载镜像

# 可执行命令
lixiaolu@lixiaolu-VirtualBox:~$ docker pull --helpUsage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]Pull an image or a repository from a registryOptions:-a, --all-tags                Download all tagged images in the repository--disable-content-trust   Skip image verification (default true)--platform string         Set platform if server is multi-platform capable-q, --quiet                   Suppress verbose output# 下载镜像,docker pull 镜像名[:tag]
# 下载mysql,不写tag的时候默认下载的是最新版
lixiaolu@lixiaolu-VirtualBox:~$ sudo docker pull mysql
Using default tag: latest  # 不写tag,默认最新版
latest: Pulling from library/mysql
69692152171a: Pull complete # 分层下载,docker images 的核心,联合文件系统
1651b0be3df3: Pull complete 
951da7386bc8: Pull complete 
0f86c95aa242: Pull complete 
37ba2d8bd4fe: Pull complete 
6d278bb05e94: Pull complete 
497efbd93a3e: Pull complete 
f7fddf10c2c2: Pull complete 
16415d159dfb: Pull complete 
0e530ffc6b73: Pull complete 
b0a4a1a77178: Pull complete 
cd90f92aa9ef: Pull complete 
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest# 等价于
sudo docker pull mysql
sudo docker pull docker.io/library/mysql:latest
# 指定版本下载,所指定的版本需要在docker官网也能找到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看安装结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

docker rmi

删除镜像(rm image)

删除的时候可以通过镜像的id或者name来删除

sudo docker rmi -f [imageId]        # -f表示强制删除(force)
sudo docker rmi -f [imageName]      # -f表示强制删除(force)
sudo docker rmi -f [imageId] [imageId] # 删除多个镜像sudo docker rmi 2c9028880e58		# 删除5.7版本的MySQL
sudo docker rmi -f $(sudo docker images -aq)	# 删除所有镜像 sudo docker images -aq表示查出所有镜像id(注意权限问题)

容器命令

有了镜像才可以创建容器,现在在虚拟机下使用docker下载一个centos镜像

docker pull centos
# 启动镜像
docker run [可选参数] image# 参数说明
--name="[NANE]"			# 容器名字
-d						# 后台方式运行
-it						# 使用交互方式运行,进入容器查看内容
-p						# (小写p)指定容器的端口 -p 8080:8080-p ip:主机端口:容器端口-p 主机端口:容器端口-p 容器端口容器端口
-P						# (大写P)随机指定端口# 查看运行中的容器
docker ps# docker ps命令# 列出正在运行的容器
-a  	# 列出当前正在运行的容器+带出历史运行过的容器
-n ?	# 显示最近创建的?个容器
-q		# 只显示容器的编号# 退出容器
exit	# 直接停止容器并退出
(ctrl+p) + (ctrl+q) # 退出,不停止容器# 删除容器
docker rm [容器id]    # 删除指定的容器,不能删除正在运行的容器,如果要强制删除,需要使用 rm -f
docker rm -f $(docker ps -aq)    # 删除所有容器
docker ps -a -q | xargs docker rm	# 删除所有的容器# 启动和停止容器的操作
docker start [容器id]		# 启动容器
docker restart [容器id]	# 重启容器
docker stop [容器id]		# 停止当前正在运行的容器
docker kill [容器id]		# 强制停止当前容器,当正常stop报错的时候,可以使用这个命令
# 测试
# 启动镜像
docker run -it ubuntu /bin/bash # 运行后会进入docker中的ubuntu容器root@lixiaolu-VirtualBox:/home/lixiaolu# docker run -it ubuntu /bin/bashroot@af5805d3c734:/# ls      进入容器
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr# 从容器中退回主机 (查看正在运行的容器的时候不会显示这个,因为已经退出了)
exitdocker ps	 # 查看正在运行的容器,由于已经退出,所以并不在运行列表
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMESdocker ps -a # 查看曾经运行的容器
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
af5805d3c734   ubuntu         "/bin/bash"   5 minutes ago    Exited (0) 15 seconds ago             practical_engelbart
90f7bf65d193   ubuntu         "/bin/bash"   5 minutes ago    Exited (0) 5 minutes ago              stupefied_davinci
35fe86bf7e73   d1165f221234   "/hello"      37 minutes ago   Exited (0) 37 minutes ago             elastic_pascal
21f199c76de6   d1165f221234   "/hello"      37 minutes ago   Exited (0) 37 minutes ago             epic_hertz
96ae1378194a   d1165f221234   "/hello"      22 hours ago     Exited (0) 22 hours ago               xenodochial_carson
7a6d8766b878   d1165f221234   "/hello"      23 hours ago     Exited (0) 23 hours ago               tender_ellis
a88af85a2739   d1165f221234   "/hello"      23 hours ago     Exited (0) 23 hours ago               practical_brown

其他

后台启动容器

# 命令 docker run -d 镜像名
docker run -d ubuntu
# 问题:使用docker ps之后发现ubuntu停止了
# 常见坑:若docker容器使用后台运行,则必须要有一个前台进程,docker发现没有应用,就会自动停止
# 如果装了Nginx,容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了

查看日志

docker logs -f -t --tail [容器id]
# 如果没有日志,可以自己编写一段shell脚本
docker run -d ubuntu /bin/bash -c "while true;do echo lxl;sleep 1;done"
# 再次查看的时候
docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
27f9c2dc0e69   ubuntu    "/bin/bash -c 'while…"   5 seconds ago    Up 4 seconds              blissful_mestorf
566fd24f8905   ubuntu    "/bin/bash"              12 minutes ago   Up 12 minutes             peaceful_babbage# 查看日志
docker logs -f -t --tail 20 27f9c2dc0e69
# 会先出20条,然后接着往后打印日志

查看容器中进程信息ps

docker top [容器id]# docker top 27f9c2dc0e69
UID                 PID                 PPID                C                   STIME     
root                8551                8514                0                   17:16
root                9452                8551                0                   17:29    
# UID:用户ID
# PID:进程ID
# PPID:父进程ID

查看镜像的元数据

docker inspect [容器id]

docker inspect 27f9c2dc0e69
# 运行结果:
[{"Id": "27f9c2dc0e69b49529ac5238798cb17e3e8eccc8fb4c67e35c475db78b2b95b0","Created": "2021-06-03T09:16:37.861735346Z","Path": "/bin/bash","Args": ["-c","while true;do echo lxl;sleep 1;done"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 8551,"ExitCode": 0,"Error": "","StartedAt": "2021-06-03T09:16:38.617115427Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:7e0aa2d69a153215c790488ed1fcec162015e973e49962d438e18249d16fa9bd","ResolvConfPath": "/var/lib/docker/containers/27f9c2dc0e69b49529ac5238798cb17e3e8eccc8fb4c67e35c475db78b2b95b0/resolv.conf","HostnamePath": "/var/lib/docker/containers/27f9c2dc0e69b49529ac5238798cb17e3e8eccc8fb4c67e35c475db78b2b95b0/hostname","HostsPath": "/var/lib/docker/containers/27f9c2dc0e69b49529ac5238798cb17e3e8eccc8fb4c67e35c475db78b2b95b0/hosts","LogPath": "/var/lib/docker/containers/27f9c2dc0e69b49529ac5238798cb17e3e8eccc8fb4c67e35c475db78b2b95b0/27f9c2dc0e69b49529ac5238798cb17e3e8eccc8fb4c67e35c475db78b2b95b0-json.log","Name": "/blissful_mestorf","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "docker-default","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/159275e02c9c12f8ee3bbda8d79ba0bf4211d5290298a89d7eadab01b2ecdb7c-init/diff:/var/lib/docker/overlay2/0d62b2366981a626370d43ec7c59a01fa99e33f0302a56d2d643a97e22840906/diff:/var/lib/docker/overlay2/b51ad877af70eb99fe7f1777b916a8b873070e7d58b753daaeb0ff830a4fe9b1/diff:/var/lib/docker/overlay2/7d928819ea5e4b1d1ee7b39146acc51f06bfdcdde9f66a5ca1d27b4c1a5661c8/diff","MergedDir": "/var/lib/docker/overlay2/159275e02c9c12f8ee3bbda8d79ba0bf4211d5290298a89d7eadab01b2ecdb7c/merged","UpperDir": "/var/lib/docker/overlay2/159275e02c9c12f8ee3bbda8d79ba0bf4211d5290298a89d7eadab01b2ecdb7c/diff","WorkDir": "/var/lib/docker/overlay2/159275e02c9c12f8ee3bbda8d79ba0bf4211d5290298a89d7eadab01b2ecdb7c/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "27f9c2dc0e69","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash","-c","while true;do echo lxl;sleep 1;done"],"Image": "ubuntu","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {}},"NetworkSettings": {"Bridge": "","SandboxID": "4a26baa40decaac8c7705a8332b6b8e1912aca682b6e331cd31f8ab394667805","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/4a26baa40dec","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "6b9dff60a69acb594e7bb64fad367258e9d67bb1a1497ee85fa9e46ab31216c6","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:03","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "c0c65d41628b363a565b17e46b027e1d0372cc728277678d3a4042665b517f06","EndpointID": "6b9dff60a69acb594e7bb64fad367258e9d67bb1a1497ee85fa9e46ab31216c6","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:03","DriverOpts": null}}}}
]

进入当前正在运行的容器

# 通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it [容器id] /bin/bash
docker attach [容器id]# 两种命令比较
exec:进入容器后开启一个新的终端,可以在里面操作(常用)
attach:进入容器中正在执行的终端,不会启动新的进程

从容器内拷贝到主机上

docker cp 容器id:容器内文件路径 目的文件路径docker cp [容器id]:/home/test.java /home

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拷贝是一个手动过程,未来可以使用 -v 卷(volumn)技术实现目录自动同步

小结

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  attach      Attach local standard input, output, and error streams to a running containerbuild       Build an image from a Dockerfilecommit      Create a new image from a container's changescp          Copy files/folders between a container and the local filesystemcreate      Create a new containerdiff        Inspect changes to files or directories on a container's filesystemevents      Get real time events from the serverexec        Run a command in a running containerexport      Export a container's filesystem as a tar archivehistory     Show the history of an imageimages      List imagesimport      Import the contents from a tarball to create a filesystem imageinfo        Display system-wide informationinspect     Return low-level information on Docker objectskill        Kill one or more running containersload        Load an image from a tar archive or STDINlogin       Log in to a Docker registrylogout      Log out from a Docker registrylogs        Fetch the logs of a containerpause       Pause all processes within one or more containersport        List port mappings or a specific mapping for the containerps          List containerspull        Pull an image or a repository from a registrypush        Push an image or a repository to a registryrename      Rename a containerrestart     Restart one or more containersrm          Remove one or more containersrmi         Remove one or more imagesrun         Run a command in a new containersave        Save one or more images to a tar archive (streamed to STDOUT by default)search      Search the Docker Hub for imagesstart       Start one or more stopped containersstats       Display a live stream of container(s) resource usage statisticsstop        Stop one or more running containerstag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGEtop         Display the running processes of a containerunpause     Unpause all processes within one or more containersupdate      Update configuration of one or more containersversion     Show the Docker version informationwait        Block until one or more containers stop, then print their exit codes
  attach      # 当前shell下attach连接指定运行镜像		build       # 通过Dockerfile定制镜像				commit      # 提交当前容器为新的镜像				cp          # 从容器中拷贝指定文件或者目录到宿主机中	create      # 创建一个新的容器,同run,但是不启动容器 diff        # 查看docker容器变化events      # 从docker服务获取容器事实事件exec        # 在已存在的容器上运行命令export      # 导出容器的内容为一个tar 归档文件【对应import】history     # 展现一个镜像形成历史images      # 列出系统当前镜像import      # 从tar包中的内容创建一个新的文件系统镜像【对应export】info        # 展示系统相关信息inspect     # 查看容器详细信息kill        # kill指定docker容器load        # 从一个tar包中加载一个镜像【对应save】login       # 注册或登录一个docker源服务器logout      # 从当前Docker registry退出logs        # 输出当前容器日志信息pause       # 暂停容器port        # 查看映射端口对应的容器内部源端口ps          # 列出容器列表pull        # 从docker镜像源服务器拉取指定镜像push        # 推送指定镜像或者库镜像至docker源服务器rename      # 重命名容器的名称restart     # 重启运行的容器rm          # 移除一个或多个容器rmi         # 移除一个或多个镜像【无容器使用该镜像才可以删除,否则需要删除相关容器才可继续;或者使用-f强制删除】run         # 创建一个新的容器并运行一个命令save        # 保存一个或多个镜像为一个tar包【对应load】search      # 在docker hub中搜索镜像start       # 开启一个或多个未运行的容器stats       # 显示容器的实时流资源使用统计信息stop        # 停止一个或多个容器tag         # 源中镜像打标签top         # 查看容器中运行的进程信息unpause     # 取消暂停容器update      # 更新一个或多个容器的配置。version     # 查看docker版本号wait        # 截取容器停止时的退出状态值
docker启动命令,docker重启命令,docker关闭命令启动 systemctl start docker守护进程重启 sudo systemctl daemon-reload重启docker服务 systemctl restart docker重启docker服务 sudo service docker restart关闭docker service docker stop关闭docker systemctl stop docker

作业练习

安装Nginx

# 1. 搜索镜像 search;建议去docker官网搜索,可以看到相应的帮助文档信息
# 2. 下载镜像 pull
# 3. 运行测试# -d 后台运行
# --name 给容器命名
# -p 宿主机端口,容器内部端口

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

思考:我们每次改动nginx配置文件,都需要进入容器内部,十分麻烦,能否在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改? -v 数据卷技术!

部署tomcat

# 1. 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到    
# docker run -it --rm 一般用来测试用完就删除# 2. 下载再启动
docker pull tomcat
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 访问3355的时候如果显示404,则是因为tomcat不全,说明测试是没有问题的# 进入容器
docker exec -it tomcat01 /bin/bash# 发现问题:1. linux命令少了   2. 没有webapps 是阿里云镜像的原因,默认是最小的镜像,所以不必要的都剔除掉 (保证最小可运行的环境!!!)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

webapps.dist下的root文件如果放到webapps下就可以在网页中看到效果

思考:我们以后部署项目,如果每次都进入容器是十分麻烦的,要是可以在容器外部提供一个映射路径如webapps,在外部放置项目,自动同步内容就好了

部署ES+Kibana

什么是es kibana

ES:Elasticsearch6搜索引擎,Kibana是它的可视化操作界面

ES:全文检索
  1. Elasticsearch是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
  2. Elasticsearch是用java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业搜索引擎。
  3. ES用于云计算中,能够达到实时搜索、稳定、可靠、快速、安装使用方便
  4. 客户端安装在java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和其他语言中都是可用的
  5. docker中的文档位置:https://hub.docker.com/_/elasticsearch
Kibana
  1. Kibana是一个开源的分析与可视化平台,设计出来用于和ES一起使用
  2. 可以使用Kibana搜索,查看存放在ES中的数据。Kibana与ES的交互方式是各种不同的图表、表格、地图等直观的展示数据,从而达到高级的数据分析和可视化的目的
  3. ELK技术栈:ES、Logstash、Kibana。
    1. 这三个技术的组合是大数据领域中一个很巧妙的设计,是一种典型的MVC思想,模型持久层、视图层、和控制器层。
    2. Logstash担任控制层的角色,负责搜集和 过滤数据;ES担任数据持久层的角色,负责存储数据;Kibana担任视图层角色,拥有各种维度的查询和分析,并使用图形化的界面展示存放在ES中的数据
    3. docker中的文档位置:https://hub.docker.com/_/kibana
部署
# es 暴露的端口很多
# es 十分耗内存
# es 的数据一般需要防止到安全目录!挂载# --net somenetwork:网络配置(暂时用不到)
# -p 9200:9200 -p 9300:9300:暴露的端口
# -e "discovery.type=single-node" :集群
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag# 启动es
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2# 启动了es之后linux就卡住了  可使用docker stats查看cpu的状态
# es是十分耗内存的,启动的时候会占用约两个G的内存
# 解决卡顿方式:停止整个docker(不建议)
# 当测试es安装成功后,立刻关闭,然后增加内存的限制
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 查看docker stats [容器id]

我curl不上啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊(在centos上可以成功curl)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

思考:如何使用Kibana连接es?网络如何连接?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化

  • portainer(不是最佳选择,先用着)
# -p 8088:9000 内网访问:9000;外网访问:8088
# -v /var/run/docker.sock 挂载
# --privileged=true 授权可访问
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock --privileged=true portainer/portainer
  • Rancher(持续集成(CI)/持续部署(CD) 的时候用)
  • 浏览器访问:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Docker镜像讲解

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件

所有的应用,直接打包成为一个docker镜像,就可以直接跑起来

如何得到镜像

  • 从远程仓库下载
  • 他方拷贝
  • 自己制作一个镜像DockerFile

Docker镜像加载原理

UnionFS(联合文件系统)

下载时候的分层下载就是这个

  1. Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
  2. UnionFS是Docker镜像的基础。
  3. 镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
  4. 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加速原理

  1. Docker镜像实际上是由一层一层

  2. bootFS(boot file system)

    • 系统的启动需要引导加载
    1. 主要包含bootloader(加载器)kernel(内核),bootloader主要是引导加载kernel,Linux刚启动的时候会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。
    2. 当boot加载完成之后整个内核都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs
  3. rootFS(root file system)在bootFS至上,包含的就是典型Linux系统中的/dev,/proc,/bin

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

底下的层是共用的

平时安装进虚拟机的CentOS都是好几个G

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序即可,因为底层直接用Host的Kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

虚拟机是分钟级别的,

分层理解

以拉取redis为例

拉取:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看镜像元数据(inspect):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分层信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

理解:

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

如下图:基于ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加python包,该镜像当前包含3个镜像层。如下图(好比windows中的安全补丁)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在添加额外镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点很重要,下图中举了一个简单的例子,每个镜像层包含3个镜像,而镜像包含了来自两个镜像层的6个文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图的镜像层跟之前图中的略有区别,主要目的是便于展示文件。

下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,是因为最上层的文件7是文件5的一个更新版本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件,这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。

Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。

Linux上可用的存储引擎有AUFS、OverLay2、Driver Mapper、Btrfs及ZFS。每种存储引擎都技术Linux中对应的文件系统或者块设备技术,且都有其独特的特点。

Docker在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。

下图展示了与系统显示相同的三层镜像,所有镜像层堆叠并合并,对外提供统一的视图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分层的好处:下载的时候分层下载,当遇到和其他应用相同的层的时候可以直接复用已经存在的

特点

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部

这一层就是我们通常说的容器层,容器之下的都是镜像层。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

commit镜像

docker commit 提交成为一个新的副本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

启动tomcat后发现,webapps下是空的,webapps.dist有运行tomcat所需要的文件。

将webapps.dist下的文件复制到webapps下之后,进行一次镜像的提交。

docker commit -a="aimer" -m="add for webapps" 815da7a018c3 tomcat01:1.0docker commit -a="[作者信息]" -m="[提交信息] [镜像名称]:[镜像版本号]

提交成功之后,查看一下镜像

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

tomcat01即提交的镜像,并没有将原来的镜像覆盖,而是新建了一个镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt SQLite的创建和使用

重点: 1.SQLite创建数据库内容方法 链接:SQLite Expert Personal的简单使用-CSDN博客 2.和数据库进行链接方法 QSqlDatabase DB; //数据库连接bool MainWindow::openDatabase(QString aFile) {DBQSqlDatabase::addDatabase("QSQLITE"); /…

使用uniapp开发时自定义tabbar

预览图: 一、配置page.jsong中的tabbar(这一步是必须的,因为我们在使用uni.switchTab()时必须要用到) "tabBar": {"list": [{"pagePath": "pages/index/index","iconPath": &…

java回顾总结--代理模式

目录 一、代理模式1.1 静态代理示例 1.2 动态代理示例 二、总结 一、代理模式 1.1 静态代理 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。比如你按照小卡片上的电话打过去寻求服务&#…

C# 学习第四弹——字符串

一、char类型的使用 字符使用单引号,单个字符 转义字符是一种特殊的字符变量,以反斜线开头,后跟一个或多个字符。 输出多级目录可以使用 二、字符串的声明和初始化 1、引用字符串常量 引用字符串常量初始化——字符使用单引号&#xff0…

加密与安全_探索常用编码算法

文章目录 概述什么是编码编码分类ASCII码 (最多只能有128个字符)Unicode (用于表示世界上几乎所有的文字和符号)URL编码 (解决服务器只能识别ASCII字符的问题)实现:编码_URLEncoder实现&#xf…

K8S常用kubectl命令汇总(持续更新中)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【Prometheus】基于Altertmanager发送告警到多个接收方、监控各种服务、pushgateway

基于Altertmanager发送报警到多个接收方 一、配置alertmanager-发送告警到qq邮箱1.1、告警流程1.2、告警设置【1】邮箱配置【2】告警规则配置【3】 部署prometheus【4】部署service 二、配置alertmanager-发送告警到钉钉三、配置alertmanager-发送告警到企业微信3.1、注册企业微…

量子算法入门—4.量子比特与量子门(1)

1.量子比特 经典比特和量子比特 经典比特只有0、1两种取值,非黑即白,有n位即 2 n 2^n 2n种可能量子比特使用0、1的量子态描述量子比特的状态,可以通过线性组合形成新的量子态,就像光谱可以调节成分 引入线代记法,0、…

ARK:《BIG IDEAS 2024》

Cathie Wood所带领的方舟投资(ARK)发布了年度重磅研究报告《BIG IDEAS 2024》,该报告指出人工智能、公共区块链、多组学测序、能源存储和机器人技术这五大板块的融合将带来全球经济活动的改变。 这五个创新平台正在融合并定义这个技术时代&am…

92. 递归实现指数型枚举 刷题笔记

思路 dfs 考虑选或者不选每个位置 用0表示未考虑 1表示选 2表示不选 用u表示搜索状态 u>n时 已经搜到底层了 需要输出当前方案 遍历 如果选了则输出 #include<iostream> using namespace std; int n; const int N16; int st[N]; void dfs(int u){ //u来记…

Git自动忽略dll文件的问题

检查了半天发现是sourcetreee的全局忽略文件导致&#xff0c; 从里面删除dll即可。 我是干脆直接删了全局忽略&#xff0c;太恶心了&#xff0c;如下&#xff1a; #ignore thumbnails created by windows Thumbs.db #Ignore files build by Visual Studio *.exe .vsconfig .s…

fastAdmin表格列表的功能

更多文章&#xff0c;请关注&#xff1a;fastAdmin后台功能详解 | 夜空中最亮的星 FastAdmin是一款基于ThinkPHP5Bootstrap的极速后台开发框架。优点见开发文档 介绍 - FastAdmin框架文档 - FastAdmin开发文档 在这里上传几张优秀的快速入门图: 一张图解析FastAdmin中的表格列…

Linux网络编程(四-TCP协议)

目录 一、TCP概念 二、TCP的首部格式 三、TCP可靠传输机制 3.1 确认应答机制 3.2 超时重传机制 3.3 连接管理 3.3.1 三次握手 3.3.2 四次挥手 3.4 流量控制 3.5 拥塞控制 四、TCP效率机制 4.1 滑动窗口 4.2 重发控制 4.3 延迟应答 4.4 捎带应答 五、TCP的…

大数据分布式计算工具Spark实战讲解(数据输入实战)

Python数据容器转RDD对象 PySpark支持通过SparkContext对象的parallelize成员方法&#xff0c;将&#xff1a; - list - tuple - set - dict - str 转换为PySpark的RDD对象 注意&#xff1a; •字符串会被拆分出1个个的字符&#xff0c;存入RDD对象 •字典仅有key会被存入…

Open Harmony开发之分布式账本

简介 Demo基于Open Harmony系统使用ETS语言进行编写&#xff0c;本Demo主要通过设备认证、分布式拉起、分布式数据管理等功能来实现。 应用效果 设备认证,获取同一个局域网内的设备ID&#xff0c;并拉起应用 添加数据并在另一台设备显示该数据 开发步骤 1.新建Openharmony…

安卓使用okhttpfinal下载文件,附带线程池下载使用

1.导入okhttp包 implementation cn.finalteam:okhttpfinal:2.0.7 2.单个下载 package com.example.downloading;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.util.Log; import android.view.View;import java.io.File;import c…

大数据分布式计算工具Spark数据计算实战讲解(map方法,flatmap方法,reducebykey方法)

数据计算 map方法 PySpark的数据计算&#xff0c;都是基于RDD对象来进行的&#xff0c;那么如何进行呢&#xff1f; 自然是依赖&#xff0c;RDD对象内置丰富的&#xff1a;成员方法&#xff08;算子&#xff09; 功能&#xff1a;map算子&#xff0c;是将rdd的数据一条条处…

Java 小项目开发日记 01(注册接口的开发)

Java 小项目开发日记 01&#xff08;注册接口的开发&#xff09; 1.项目需求 完成注册接口 2.项目目录 3. 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

NWatch-Alarm闹钟功能实现

文章目录 W25Q64初始化SPI初始化W25Q初始化 AlARM模块初始化AlARM模块绘制Draw函数AlARM的更新函数AlARM中最重要的函数 W25Q64初始化 W25Q64用来存储用户设置的闹钟值&#xff0c;开机的时候自动读取闹钟记录。 SPI初始化 使用CubeMx自动配置。 #define SPI1CS_ON HAL_GP…

3d模型导出简单线条的步骤---模大狮模型网

导出简单线条的3D模型通常涉及以下步骤&#xff1a; 创建线条模型&#xff1a;首先&#xff0c;在您的3D建模软件中创建或导入包含线条的模型。这可以是简单的线框模型&#xff0c;也可以是由线条构成的复杂形状。确保您的模型中只包含您希望导出的线条部分。 选择导出格式&am…