Docker(狂神)
创始人
2024-01-28 05:15:30

Docker概述

Docker为什么出现?

一款产品:开发,上线,两套环境,应用环境,应用配置

开发,运维

环境配置十分麻烦,每一个机器都要部署环境,费时费力。

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

在服务器配置一个应用的环境,配置超麻烦,不能够跨平台

Window,最后发布到Linux,环境有天壤之别

传统:开发jar,运维来做

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


Docker给以上的问题,提出了解决方案

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

Docker的思想就来自于集装箱

JRE --- 多个应用(端口冲突)--- 原来都是交叉的

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

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

本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习。


Docker的历史

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

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

虚拟机是虚拟化技术,Docker容器技术,也是一种虚拟化技术

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

Vmware:Linux centos原生镜像(一个电脑),隔离需要开启多个虚拟机,几个G,几分钟

Docker:隔离,镜像(最核心的环境 jdk,mysqll)十分小巧,运行镜像就可以了,几个M,秒级启动


聊聊Docker

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

官网:Docker: Accelerated, Containerized Application Development

文档地址:Docker Documentation | Docker Documentation

 仓库地址:Docker Hub


 Docker能干嘛

之前的虚拟机技术

虚拟机技术缺点:

1.资源占用十分多

2.冗余步骤多

3.启动很慢 

 容器化技术

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

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

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

DevOps(开发,运维)

应用更快速的交付和部署

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

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

更便捷的升级和扩缩容

使用了Docker之后,部署应用和搭积木一样

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

更简单的系统运维

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

更高效的计算资源利用

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


Docker基本组成

镜像(image):

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

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

通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

容器(container):

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

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

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

仓库(repository): 

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

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

Docker Hub(默认是国外的)

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


安装Docker

环境准备

 1.需要一点点的Linux的基础

2.CentOS

3.shell远程连接服务器进行操作

环境查看

#系统内核时3.10以上的
[root@localhost /]# uname -r
3.10.0-957.el7.x86_64
#系统版本
[root@localhost /]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

帮助文档:

#1.卸载旧的版本
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine#2.需要的安装包
yum install -y yum-utils#3.设置镜像的仓库
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#推荐使用阿里云的,十分的快#更新yum软件包索引
yum makecache fast#4.安装docker docker-ce社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin#5.启动docker
systemctl start docker#6.查看docker版本,是否启动成功
docker version#7.启动hello-world镜像
docker run hello-world#8.查看hello-world镜像
docker images#9.docker run hello-world
docker run hello-world#卸载docker
#1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin#2.删除资源
#/var/lib/docker docker的默认工作路径
rm -rf /var/lib/docker

阿里云镜像加速

1.登录阿里云找到容器服务

2.找到镜像加速地址

 3.配置使用

sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://6a7n8bhy.mirror.aliyuncs.com"]
}
EOFsudo systemctl daemon-reloadsudo systemctl restart docker

 回顾HelloWorld流程

 


底层原理

Docker是怎么工作的?

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

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

 Docker为什么比VM快?

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

2.Docker利用的是宿主机的内核,vm需要是Guest OS。

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


Docker的常用命令

帮助命令

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

帮助文档地址:Reference documentation | Docker Documentation

镜像命令

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

[root@localhost /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   13 months ago   13.3kB#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
CREATED 镜像的创建时间
SIZE 镜像的大小#可选项
Options:-a, --all             # 列出所有镜像-q, --quiet           # 只显示镜像的id

docker search 镜像名 搜索镜像

[root@localhost ~]# docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13472     [OK]       
mariadb                         MariaDB Server is a high performing open sou…   5142      [OK]       
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   689       [OK]       
percona                         Percona Server is a fork of the MySQL relati…   593       [OK]       
bitnami/mysql                   Bitnami MySQL Docker Image                      79                   [OK]#可选项,通过搜索来过滤
--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   13472     [OK]       
mariadb   MariaDB Server is a high performing open sou…   5142      [OK] 

docker pull 镜像名[:tag]下载镜像

#下载镜像 docker pull 镜像名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest #如果不写 tag,默认就是latest
latest: Pulling from library/mysql
72a69066d2fe: Pull complete  #分层下载,docker image的核心,联合文件系统
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址#等价命令
docker pull mysql
docker pull docker.io/library/mysql:latest#指定版本下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists 
93619dbc5b36: Already exists 
99da31dd6142: Already exists 
626033c43d70: Already exists 
37d5d7efb64e: Already exists 
ac563158d721: Already exists 
d2ba16033dad: Already exists 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

 docker rmi  -f  镜像id/镜像名  删除镜像

[root@localhost ~]# docker rmi -f 镜像id #删除指定的镜像[root@localhost ~]# docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像[root@localhost ~]# docker rmi -f $(docker images -aq) #删除全部的容器

容器命令

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

docker pull centos

新建容器并启动

docker run [可选参数] image

#参数说明
--name="Name" 容器名字 tomcat01 tomcat02,用来区分容i去
-d  后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p  指定容器的端口 -p 8080:8080
  -p ip:主机端口:容器端口
  -p 主机端口:容器端口(常用)
  -p 容器端口
-p 随机指定端口

#测试,启动并进入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@8bfe65458325 /]# ls #查看容器内的centos,基础版本,
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var# 从容器中退回主机
[root@a84b2702bfe0 /]# exit
exit
[root@localhost /]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

列出所有运行的容器

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

[root@localhost /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS                         PORTS     NAMES
a84b2702bfe0   centos         "/bin/bash"   8 minutes ago       Exited (0) 8 minutes ago                 great_elgamal

退出容器

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 #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器

常用其他命令

后台启动容器

docker run -d 镜像名

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

查看日志

docker logs -tf --tail 容器id

#自己编写一段shell脚本
[root@localhost bin]# docker run -d centos /bin/sh -c "while true;do echo kuangshen;sleep 1;done"#docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
8d2913187b91   centos    "/bin/sh -c 'while t…"   14 seconds ago   Up 14 seconds             eloquent_shamir#显示日志
-tf #显示日志
--tail number #显示日志条数
[root@localhost bin]# docker logs -tf --tail 10 8d2913187b91

查看容器中进程信息 ps

docker top 容器id

#命令docker top 容器id
[root@localhost /]# docker top 8d2913187b91
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                32058               32037               0                   01:14               ?                   00:00:00            /bin/sh -c while true;do echo kuangshen;sleep 1;done
root                40447               32058               0                   01:23               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像的元数据

docker inspect 镜像id

[root@localhost /]# docker inspect 5d0da3dc9764
[{"Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","RepoTags": ["centos:latest"],"RepoDigests": ["centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"],"Parent": "","Comment": "","Created": "2021-09-15T18:20:05.184694267Z","Container": "9bf8a9e2ddff4c0d76a587c40239679f29c863a967f23abf7a5babb6c2121bf1","ContainerConfig": {"Hostname": "9bf8a9e2ddff","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","#(nop) ","CMD [\"/bin/bash\"]"],"Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"DockerVersion": "20.10.7","Author": "","Config": {"Hostname": "","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"],"Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"Architecture": "amd64","Os": "linux","Size": 231268856,"VirtualSize": 231268856,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/9372640e37b7350657b835f7866b3ca75df7ea4caabb33ea88194e057e899bd9/merged","UpperDir": "/var/lib/docker/overlay2/9372640e37b7350657b835f7866b3ca75df7ea4caabb33ea88194e057e899bd9/diff","WorkDir": "/var/lib/docker/overlay2/9372640e37b7350657b835f7866b3ca75df7ea4caabb33ea88194e057e899bd9/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}
]

 进入当前正在运行的容器

docker exec -it 容器id bashShell

[root@localhost /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
8d2913187b91   centos    "/bin/sh -c 'while t…"   30 minutes ago   Up 30 minutes             eloquent_shamir
[root@localhost /]# docker exec -it 8d2913187b91 /bin/bash
[root@8d2913187b91 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@8d2913187b91 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 06:14 ?        00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;don
root       1877      0  0 06:45 pts/0    00:00:00 /bin/bash
root       1922      1  0 06:46 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /
root       1923   1877  0 06:46 pts/0    00:00:00 ps -ef

docker attach 容器id

[root@localhost /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
8d2913187b91   centos    "/bin/sh -c 'while t…"   40 minutes ago   Up 40 minutes             eloquent_shamir
[root@localhost /]# docker attach 8d2913187b91
kuangshen
kuangshen
kuangshen

docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)

docker attach 进入容器正在执行的终端,不不会启动新的进程

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

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

拷贝是一个手动过程,未来使用-v数据卷的技术,可以实现同步

相关内容

热门资讯

万的繁体字怎么写 繁体字怎么写... 一、繁体字大全简化偏旁讠[訁] 饣[飠] [昜] 纟[糹] [臤] 只[戠] 钅[釒] 呙[咼]A爱...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
桂林市属于哪个省 桂林为什么划... 桂林 [guì lín]广西壮族自治区下辖市桂林,简称桂,是世界著名风景游览城市、全国重要高新技术产...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...