Docker

Docker

Docker概述

  • Docker为什么出现?

    我电脑上可以运行!但是其他机器上跑不起来!

    环境配置是十分麻烦的,每个机器都要部署环境(集群redis、ES、Hadoop...)!费时费力!

    发布一个项目(jar + (Redis、MySQL、jdk ES)),项目能不能都带上环境安装打包!

    之前:开发jar,运维来做!

    现在:开发打包部署上线,一套流程做完!

    java --- apk --- 发布(应用商店)--- 张三使用apk --- 安装即可用!

    java --- jar(环境)--- 打包项目带上环境(镜像) --- (Docker仓库:商店) --- 下载我们发布的镜像 --- 直接运行即可!

  • Docker核心思想

    Docker的思想来自于集装箱

    隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。

    Docker通过隔离机制,可以将服务器利用到极致!

  • Docker的历史

    2010年,几个搞it的年轻人,就在美国成立一家公司dotCloud

    Docker刚刚诞生的时候,没有引起行业的注意,救火不下去!

    开源

    2013年 Docker开源!

    Docker越来越多人发现优点!火了!Docker每个月都会更新一个版本!

    2014年4月9日,Docker1.0发布!

    Docker为什么这么火?十分轻巧!

    在容器技术出来之前,我们都是使用虚拟机技术!

    虚拟机:在window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!

    虚拟机也是属于虚拟化技术。Docker容器技术,也是一种 虚拟机化技术!

    vm : linux centos原生镜像(一个电脑) 隔离:需要开启多个虚拟机! 几个G 启动几分钟
    docker:隔离,镜像(最核心的环境(linux) 4m + jdk + mysql)十分的小巧,运行镜像就可以了!小巧! 几个M 秒级启动!
    
  • 聊聊Docker

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

    官方地址:https://www.docker.com

    文档地址:https://docs.docker.com Docker的文档超级详细的!~

    仓库地址:https://hub.docker.com/ git push ; git pull

  • Docker能干嘛

之前的虚拟机技术

Docker

虚拟机技术缺点:

1、资源占用十分多

2、冗余步骤多

3、启动很慢

容器化技术

容器化技术不是模拟的一个完整的

Docker

比较Docker和虚拟机技术的不同:

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

DevOps(开发、运维)

应用更快速的交付和部署

传统:一堆帮助文档,安装程序

Docker:打包镜像 发布测试 一键运行

更便捷的升级和扩容

使用docker之后,我们部署应用就和搭积木一样!

Springboot 1.5 Redis 5 tomcat 8 以前一个一个升级 现在把他们都打成一个镜像

项目打包为一个镜像,扩展 服务器A ! 服务器B

更简单的系统运维

在容器化之后,我们的开发,测试环境都是高度一致的

更高效的计算资源利用

1核 2g的服务器 搞十几个redis没问题

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

Docker安装

Docker基本组成

Docker

镜像【image】

docker镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像》run》tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

容器【container】:

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

启动、停止、删除、基本命令!

目前就可以把这个容器理解为就是一个简易的linux系统

仓库【repository】:

仓库就是存放镜像的地方!

仓库分为公有仓库和私有仓库!

Docker Hub(默认是国外的)

阿里云...都有容器服务器(配置镜像加速)!

安装Docker

docker run hello-world

Docker

2、查看这个hello-world镜像

docker images

Docker

回顾HelloWorld启动流程

run的启动流程

Docker

底层上原理

Docker是怎么工作的?

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

Docker-Server接收到Docker-Client的指令,就会执行这个命令!

Docker

Docker为什么比虚拟机快?

1、Docker有着比虚拟机更少的抽象层

2、Docker利用的是宿主机的内核,VM需要的是Guest OS

Docker

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,分钟级别的,而docker是利用 宿主机的操作系统的,省略了这个复杂的过程,秒级!

Docker的常用命令

帮助命令

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

帮助文档的地址:https://docs.docker.com/engine/reference/run/

镜像命令

docker images #查看本地主机上的镜像

D:\component\Docker>docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   5 months ago   13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG		   镜像的标签
IMAGE ID   镜像的ID
CREATED    镜像的创建时间
SIZE	   镜像的 大小

#可选项
Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
List images

Options:
  -a, --all            #列出所有的镜像
  -q, --quiet          #只显示镜像id

docker search 搜索镜像

D:\component\Docker>docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11308     [OK]
mariadb                           MariaDB Server is a high performing open sou…   4294      [OK]

#可选项
D:\component\Docker>docker search mysql --filter=stars=5000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   11308     [OK]

D:\component\Docker>docker search mysql --filter=stars=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   11308     [OK]
mariadb   MariaDB Server is a high performing open sou…   4294      [OK]

docker pull 下载镜像

#下载镜像 docker pull 镜像名[:tag]
D:\component\Docker>docker pull mysql
Using default tag: latest#如果不写tag 默认就是latest
latest: Pulling from library/mysql
e1acddbe380c: Pull complete #分层下载,docker image的核心 联合文件系统
bed879327370: Pull complete
03285f80bafd: Pull complete
ccc17412a00a: Pull complete
1f556ecc09d1: Pull complete
adc5528e468d: Pull complete
1afc286d5d53: Pull complete
6c724a59adff: Pull complete
0f2345f8b0a3: Pull complete
c8461a25b23b: Pull complete
3adb49279bed: Pull complete
77f22cd6c363: Pull complete
Digest: sha256:d45561a65aba6edac77be36e0a53f0c1fba67b951cb728348522b671ad63f926 #签名 防伪
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址

#等价
docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

#指定版本下载
D:\component\Docker>docker pull mysql:5.7
5.7: Pulling from library/mysql
e1acddbe380c: Already exists
bed879327370: Already exists
03285f80bafd: Already exists
ccc17412a00a: Already exists
1f556ecc09d1: Already exists
adc5528e468d: Already exists
1afc286d5d53: Already exists
4d2d9261e3ad: Pull complete
ac609d7b31f8: Pull complete
53ee1339bc3a: Pull complete
b0c0a831a707: Pull complete
Digest: sha256:7cf2e7d7ff876f93c8601406a5aa17484e6623875e64e7acc71432ad8e0a3d7e
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
D:\component\Docker>docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mysql         5.7       6c20ffa54f86   4 days ago     448MB
mysql         latest    5a4e492065c7   4 days ago     514MB
hello-world   latest    d1165f221234   5 months ago   13.3kB

docker rmi 删除镜像

docker rmi -f 镜像ID #删除指定的镜像
docker rmi -f 镜像ID 镜像ID 镜像ID ...#删除多个镜像
docker rmi -f $(docker images -aq) #删除所有镜像

容器命令

说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来学习

docker pull centos

新建容器并启动

docker run [可选参数] image
#参数说明
--name="Name" 容器名字tomcat01 tomcat02 用来区分容器
-d            后台方式运行
-it           使用交互方式运行,进入容器查看内容
-p            指定容器的端口 -p 8080:8080
	-p  ip:主机端口:容器端口
	-p  主机端口:容器端口 (常用)
	-p  容器端口
	容器端口
-P            随机指定端口(注意大P小p是有区别的)

#测试 启动并进入容器
D:\component\Docker>docker run -it centos /bin/bash
[root@2d16c66af894 /]# ls #查看容器内部的centos,基础版本,很多命令都是不完善的!
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
#从容器中退回主机
[root@2d16c66af894 /]# exit
exit

列出所有运行的容器

#docker ps 命令
	#列出当前正在运行的容器
-a  #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
-q   #只显示容器的编号

D:\component\Docker>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

D:\component\Docker>docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                          PORTS     NAMES
2d16c66af894   centos        "/bin/bash"   3 minutes ago   Exited (0) About a minute ago             hardcore_panini
7a1d82fcfc07   hello-world   "/hello"      2 hours ago     Exited (0) 2 hours ago                    awesome_almeida

退出容器

exit #直接容器停止退出
ctrl + p + 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	 #停止正在运行的容器
dokcer kill 容器id	 #强制杀掉正在运行的容器

常用的其他命令

后台启动容器

#命令 docker run -d 镜像名!
D:\component\Docker>docker run -d centos
31bc0b215d1aa72d8ddb1f43649a6dd3001343331f8462020a554896ace161fe

#问题 docker ps 发现 centos 停止了
D:\component\Docker>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

#常见的坑:docker 容器使用后天运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了

查看日志

docker logs -tf --tail 070b557c2ee3

#自己编写一段shell脚本
D:\component\Docker>docker run -d centos /bin/sh -c "while true; do echo summer;sleep 1;done"
27d74163158d8309d3b61d2b9f8ee55e2eab063b73e7f2b8ae504e7e96991835

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
27d74163158d   centos    "/bin/sh -c ‘while t…"   2 minutes ago   Up 2 minutes             naughty_ritchie

#显示日志
-tf           #显示所有日志
--tail [number] #要显示日志条数

docker logs -tf --tail 100  27d74163158d

查看容器中的进程信息

# docker top 容器id
D:\component\Docker>docker top 27d74163158d
UID         PID            PPID       C      STIME               TTY     
root        2044           2024       0      08:49               ?       
root        2475           2044       0      08:55               ?           
#UID 当前用户id
#PID 父id
#PPID 进程id

查看镜像的元数据

#命令
docker inspect 容器id
#测试
D:\component\Docker>docker inspect 27d74163158d
[
    {
        "Id": "27d74163158d8309d3b61d2b9f8ee55e2eab063b73e7f2b8ae504e7e96991835",
        "Created": "2021-08-22T08:49:08.4758738Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true; do echo summer;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2044,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-08-22T08:49:08.8838869Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/27d74163158d8309d3b61d2b9f8ee55e2eab063b73e7f2b8ae504e7e96991835/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/27d74163158d8309d3b61d2b9f8ee55e2eab063b73e7f2b8ae504e7e96991835/hostname",
        "HostsPath": "/var/lib/docker/containers/27d74163158d8309d3b61d2b9f8ee55e2eab063b73e7f2b8ae504e7e96991835/hosts",
        "LogPath": "/var/lib/docker/containers/27d74163158d8309d3b61d2b9f8ee55e2eab063b73e7f2b8ae504e7e96991835/27d74163158d8309d3b61d2b9f8ee55e2eab063b73e7f2b8ae504e7e96991835-json.log",
        "Name": "/naughty_ritchie",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "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": [
                35,
                122
            ],
            "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/d42a9289bcc5fdbe03c603fa55f4481c10da96f2a2dbfb5daae5549090d2ec08-init/diff:/var/lib/docker/overlay2/8c2b6e75bd894730e473521dfacb843e578ae938004b3d9da550a9003bb61195/diff",
                "MergedDir": "/var/lib/docker/overlay2/d42a9289bcc5fdbe03c603fa55f4481c10da96f2a2dbfb5daae5549090d2ec08/merged",
                "UpperDir": "/var/lib/docker/overlay2/d42a9289bcc5fdbe03c603fa55f4481c10da96f2a2dbfb5daae5549090d2ec08/diff",
                "WorkDir": "/var/lib/docker/overlay2/d42a9289bcc5fdbe03c603fa55f4481c10da96f2a2dbfb5daae5549090d2ec08/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "27d74163158d",
            "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/sh",
                "-c",
                "while true; do echo summer;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201204",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "70b04e3cc7e4081e118702a40d6bbb0d3e4b4143bee7eea936b51b561cfd1f38",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/70b04e3cc7e4",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "9e22dbccce17c8d814238d6b42eebe2102be8bec43497ef7a65a60e60a62e8b4",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "6249d12665277ae8bdc8a67de3558072a7ac79704b469bc9db992a0673964143",
                    "EndpointID": "9e22dbccce17c8d814238d6b42eebe2102be8bec43497ef7a65a60e60a62e8b4",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器 修改一些配置

#命令
docker exec -it 容器id /bin/bash

#方式二:
docker attach 容器id
正在执行当前的代码

#区别
docker exec   #进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach #进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机路径

#测试
D:\component\Docker>docker exec -it 1231abb1bc75 /bin/bash
[root@1231abb1bc75 /]# cd /home/
[root@1231abb1bc75 home]# ls
[root@1231abb1bc75 home]# touch summer.java
[root@1231abb1bc75 home]# ls
summer.java
[root@1231abb1bc75 home]# exit
D:\component\Docker>docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
1231abb1bc75   centos    "/bin/bash"   3 minutes ago   Up 3 minutes             stupefied_engelbart

D:\component\Docker>docker cp 1231abb1bc75:/home/summer.java D:\component\Docker

#拷贝是一个手动过程,未来我们使用-v 卷的技,可以实现

练习

Docker来安装nginx

#搜索镜像
docker search nginx
#下载镜像
docker pull nginx
#启动容器
docker run -d --name nginx01 -p 3344:80 nginx
# 输入localhost:3344验证

端口暴露的概念

外网3344--》通过阿里云映射linux3344 --》 linux宿主机上3344和docker中的容器80映射上

#测试 可以看到nginx的配置
D:\component\Docker>docker exec -it 84aa0c78ee53  /bin/bash
root@84aa0c78ee53:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@84aa0c78ee53:/# cd /etc/nginx
root@84aa0c78ee53:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

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

Docker装Tomcat

Docker

上一篇:word2vec


下一篇:按钮、单选框、复选框