【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来获取仓库

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

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

bash 复制代码
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引擎

    bash 复制代码
     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. 删除资源

CentOS

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

  1. 卸载已经安装的版本

    shell 复制代码
    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
  2. 设置存储库

    shell 复制代码
    # 安装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,或者进入下一步安装特定版本:

      shell 复制代码
      # 安装最新Docker
      sudo yum install docker-ce docker-ce-cli containerd.io
  4. 更新yum软件包索引 yum makecache fast

  5. 安装Docker相关的

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

    shell 复制代码
    # 安装最新版本
    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的常用命令

帮助命令

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

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

镜像命令

docker images

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

解释:

shell 复制代码
# 解释
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

搜索镜像

shell 复制代码
# 可执行命令
lixiaolu@lixiaolu-VirtualBox:~$ sudo docker search --help

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -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

下载镜像

shell 复制代码
# 可执行命令
lixiaolu@lixiaolu-VirtualBox:~$ docker pull --help

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -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来删除

shell 复制代码
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镜像

shell 复制代码
docker pull centos
shell 复制代码
# 启动镜像
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报错的时候,可以使用这个命令
shell 复制代码
# 测试
# 启动镜像
docker run -it ubuntu /bin/bash # 运行后会进入docker中的ubuntu容器

root@lixiaolu-VirtualBox:/home/lixiaolu# docker run -it ubuntu /bin/bash

root@af5805d3c734:/# ls      进入容器
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr

# 从容器中退回主机 (查看正在运行的容器的时候不会显示这个,因为已经退出了)
exit

docker ps	 # 查看正在运行的容器,由于已经退出,所以并不在运行列表
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

docker 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

其他

后台启动容器

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

查看日志

shell 复制代码
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

shell 复制代码
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]

shell 复制代码
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
                }
            }
        }
    }
]

进入当前正在运行的容器

shell 复制代码
# 通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it [容器id] /bin/bash
docker attach [容器id]

# 两种命令比较
exec:进入容器后开启一个新的终端,可以在里面操作(常用)
attach:进入容器中正在执行的终端,不会启动新的进程

从容器内拷贝到主机上

shell 复制代码
docker cp 容器id:容器内文件路径 目的文件路径

docker cp [容器id]:/home/test.java /home

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

小结

shell 复制代码
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes
shell 复制代码
  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        # 截取容器停止时的退出状态值
shell 复制代码
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

shell 复制代码
# 1. 搜索镜像 search;建议去docker官网搜索,可以看到相应的帮助文档信息
# 2. 下载镜像 pull
# 3. 运行测试

# -d 后台运行
# --name 给容器命名
# -p 宿主机端口,容器内部端口

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

部署tomcat

shell 复制代码
# 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
部署
shell 复制代码
# 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(不是最佳选择,先用着)
shell 复制代码
# -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下之后,进行一次镜像的提交。

shell 复制代码
docker commit -a="aimer" -m="add for webapps" 815da7a018c3 tomcat01:1.0

docker commit -a="[作者信息]" -m="[提交信息] [镜像名称]:[镜像版本号]

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

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

相关推荐
_.Switch1 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_850410831 小时前
文件系统和日志管理
linux·运维·服务器
JokerSZ.1 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
芯盾时代2 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方3 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘3 小时前
NFS服务器
运维·服务器
南猿北者4 小时前
docker容器
docker·容器
苹果醋34 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
二十雨辰4 小时前
[linux]docker基础
linux·运维·docker
time never ceases5 小时前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle