【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://xiahunao.cn/news/2815756.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

LeetCode238题:除自身以外数组的乘积(python3)

代码思路&#xff1a; 当前位置的结果就是它左部分的乘积再乘以它右部分的乘积&#xff0c;因此需要进行两次遍历&#xff0c;第一次遍历求左部分乘积&#xff0c;第二次遍历求右部分的乘积&#xff0c;再将最后的计算结果一起求出来。 class Solution:def productExceptSelf(…

redis中的分布式锁(setIfAbsent)(expire)

目录 应用场景 代码实例1&#xff1a; 代码实例2&#xff1a; setIfAbsent&#xff1a; expire&#xff1a; 举例说明&#xff1a; 代码实例3&#xff1a; 代码实例4&#xff1a; 还是一个同事问的一个问题&#xff0c;然后闲着没事就记录下来了。多人操作同一个保单&a…

K8S存储卷与PV,PVC

一、前言 Kubernetes&#xff08;K8s&#xff09;中的存储卷是用于在容器之间共享数据的一种机制。存储卷可以在多个Pod之间共享数据&#xff0c;并且可以保持数据的持久性&#xff0c;即使Pod被重新调度或者删除&#xff0c;数据也不会丢失。 Kubernetes支持多种类型的存储卷…

【大数据架构(2)】kappa架构介绍

文章目录 一. Kappa架构1. Speed Layer (Stream Layer) - The Foundation of Kappa Architecture2. Stream Processing: The Heart of Kappa Architecture 二. Benefits of Kappa and Streaming Architecture1. Simplicity and Streamlined Pipeline2. High-Throughput Process…

数据服务安全的重要性

数据服务安全在当今信息化社会显得尤为重要。随着大数据、云计算、人工智能等技术的飞速发展&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;数据服务安全也面临着前所未有的挑战。本文将从数据服务安全的重要性、常见威胁、防护策略以及未来发展趋势等方面进行探讨…

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记

在ROS中&#xff0c;计算图&#xff08;ROS Compute Graph&#xff09;是一个核心概念&#xff0c;它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络&#xff0c;它也反映了ROS设计哲学的核心——灵活性、模块化和可重用性。通过细致探讨计算图的高级特性和实…

2024年小程序云开发CMS内容管理无法使用,无法同步内容模型到云开发数据库的解决方案,回退老版本CMS内容管理的最新方法

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之FlowItem容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之FlowItem容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、FlowItem组件 子组件 可以包含子组件。 接口 FlowItem() 使用该接口来…

Android14之解决编译报错:bazel: no such file or directory(一百八十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Stable Diffusion WebUI 图库浏览器插件:浏览器以前生成的图片

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本文介绍的插件叫图库浏览器&#xff0c;是一个用于浏览器以前生成的图片信息的插件。本文将介绍该插件的安装和使用&#xff0c;希望能够对你有所帮助。 文章…

GitHub宣布GitHub Copilot Enterprise的全面发布;使用Python与Gemma和MongoDB构建RAG系统的全过程

&#x1f989; AI新闻 &#x1f680; GitHub宣布GitHub Copilot Enterprise的全面发布 摘要&#xff1a;GitHub Copilot Enterprise是一款基于OpenAI的GPT-4模型的代码助手&#xff0c;它结合了十多年的真实、安全可靠的代码数据进行开发。该工具可以通过文本提示来获取、审核…

JavaEE进阶(7)Spring Boot 日志(概述、用途、使用:打印日志,框架介绍,SLF4J 框架介绍、更简单的日志输出)

接上次博客&#xff1a;JavaEE进阶&#xff08;6&#xff09;SpringBoot 配置文件&#xff08;作用、格式、properties配置文件说明、yml配置文件说明、验证码案例&#xff09;-CSDN博客 目录 日志概述 日志的用途 日志使用 打印日志 在程序中获取日志对象 使用日志对象…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方&#xff0c;试一下一句话木马 txt 不让传txt 另存为tlyjpg&#xff0c;木马文件上传成功 给出了存放目录&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

Python的自然语言处理库NLTK介绍

NLTK&#xff08;Natural Language Toolkit&#xff09;简介 NLTK是Python中一个领先的自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了文本处理的基础设施&#xff0c;包括分词&#xff08;tokenization&#xff09;、词性标注&#xff08;part-of-speech tag…

云计算与边缘计算:有何不同?

公共云计算平台可以帮助企业充分利用全球服务器来增强其私有数据中心。这使得基础设施能够扩展到任何位置&#xff0c;并有助于计算资源的灵活扩展。混合公共-私有云为企业计算应用程序提供了强大的灵活性、价值和安全性。 然而&#xff0c;随着分布在全球各地的实时人工智能应…

亚马逊自养号测评:如何安全搭建环境,有效规避风险

要在亚马逊上进行自养号测评&#xff0c;构建一个真实的国外环境至关重要。这包括模拟国外的服务器、IP地址、浏览器环境&#xff0c;甚至支付方式&#xff0c;以创建一个完整的国际操作环境。这样的环境能让我们自由注册、养号并下单&#xff0c;确保所有操作均符合国际规范。…

十三、Qt多线程与线程安全

一、多线程程序 QThread类提供了管理线程的方法&#xff1a;一个对象管理一个线程一般从QThread继承一个自定义类&#xff0c;重载run函数 1、实现程序 &#xff08;1&#xff09;创建项目&#xff0c;基于QDialog &#xff08;2&#xff09;添加类&#xff0c;修改基于QThr…

微软广告和网络服务CEO承认OpenAI的Sora将加入Copilot,但需要一些时间

事情的起因是一名网友询问 Sora 是否会加入 Copilot&#xff0c;微软广告和网络服务CEO首席执行官——Mikhail Parakhin 回应说&#xff1a;“最终&#xff0c;但这需要时间。”毕竟投了几十个亿美金进去&#xff0c;不亏是金主爸爸。 图为Mikhail Parakhin Sora是OpenAI开发的…

2024年阿里云2核4G配置服务器测评_ECS和轻量性能测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…