Docker学习笔记(一)

Docker学习笔记(一)

1.Docker概述

1.Docker为什么出现?

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

开发 — 运维。问题:我在我的电脑可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大?

环境配置时十分的麻烦,每一个机器都要部署环境(集群Redis、ES、Hadoop…)!费时实力。

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

之前在服务器配置一个应用的环境 Redis MySQL jdk ES Hadoop,配置超麻烦,不能够跨平台。

Windows,发布到Linux!

传统:开发jar,运维来做!

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

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

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

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

Docker的思想就是来自于集装箱

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

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

水果 生化武器

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

2.Docker的历史

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

做一些pass的云计算服务!LXC有关的容器技术!

他们将自己的技术 (容器化技术) 命名就是Docker!

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

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

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

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

聊聊Docker

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

官网:https://docker.com/

官方文档:https://docs.docker.com/ (超级详细!)

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

3.Docker能干嘛

虚拟机缺点

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

容器化技术

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

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

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

DevOps(开发、运维)

  • 应用更快速的交付和部署

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

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

  • 更便捷的升级和扩容

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

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

  • 更简单的系统运维

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

  • 更高效的计算资源利用

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

2.Docker安装

1.Docker的基本组成

在这里插入图片描述

1.镜像(image):

docker镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01 容器(提供服务器),

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

2.容器(container):

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

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

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

3.仓库(repository):

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

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

Docker Hub(默认是国外的)

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

2.安装Docker

1.环境查看
#系统内核是3.10以上的
[root@iZ2ze9gnryz4ce39n8s3g2Z /]# uname -r
3.10.0-1062.18.1.el7.x86_64
#系统版本
[root@iZ2ze9gnryz4ce39n8s3g2Z /]# 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"

2.安装
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  #国外的地址
    

 设置阿里云的Docker镜像仓库

yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #国外的地址
4.更新yum软件包索引
yum makecache fast
5.安装docker相关的配置

docker-ce 是社区版,docker-ee 企业版

 yum install docker-ce docker-ce-cli containerd.io

出现了completed即可成功。

6.启动docker
systemctl start docker
7.查看当前版本号,是否启动成功
docker version
8.设置开机自启动
systemctl enable docker

结果展示:

在这里插入图片描述

9.下载hello-world镜像进行测试

在这里插入图片描述

#查看一下下载的这个hello-world镜像
[root@iZ2ze9gnryz4ce39n8s3g2Z ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   5 months ago   13.3kB
10.了解:卸载docker
#1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2.删除资源
rm -rf /var/lib/docker

#  /var/lib/docker docker的默认工作路径!
11.配置阿里云镜像加速

(1)找到镜像加速器

在这里插入图片描述

(2)依次执行官方的这四条命令

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

3.Docker容器运行流程

启动一个容器,Docker的运行流程如下图:

在这里插入图片描述

4.Docker底层原理

Docker是怎么工作的?

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

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

Docker为什么比VM快?

  1. Docker有着比虚拟机更少的抽象层。
  2. docker利用的是宿主机的内核,VM需要的是Guest OS。
    在这里插入图片描述

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

分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!

在这里插入图片描述

3.Docker的常用命令

1.帮助命令

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

2.镜像命令

1.docker images 查看所有本地的主机上的镜像
[root@Sophie /]# docker search mysql
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                            MySQL is a widely used, open-source relation…   12283     [OK]       
mariadb                          MariaDB Server is a high performing open sou…   4723      [OK]       

#可选项,通过收藏来过滤

--filter = STARS=3000 #搜索出来的镜像就是STARS大于3000的镜像
#结果
[root@Sophie /]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   12283     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4723      [OK] 

2.docker pull 下载镜像
#下载镜像	docker pull 镜像名[:tag]
[root@Sophie /]# 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.io/library/mysql:latest

#指定版本下载(版本一定要来源于dockerhub)
[root@Sophie /]# 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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZ2ZBRGE-1647921745073)(C:\Users\20929\Desktop\md文档\dokcer md\picture\docker11.png)]

3.docker rmi 删除镜像
docker rmi -f IMAGE_ID						#删除指定的容器
docker rmi -f IMAGE_ID IMAGE_ID	IMAGE_ID	#删除多个的容器
docker rmi -f $(docker images -aq)			#删除全部的容器

3.容器命令

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

[root@Sophie /]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
1.新建容器并启动
docker run [可选参数] image

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



#测试,启动并进入容器
[root@Sophie /]# docker run -it centos /bin/bash
[root@5d615ea26c2b /]# ls	#查看容器内的centos。基础版本,很多命令都是不完善的。
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

2.列出所有运行的容器
#docker ps 命令
	#列出当前正在运行的容器
-a	#列出当前正在运行的容器+带出历史运行过的容器
-n=?#显示最近创建的容器(n=? -- 显示最新的几个容器信息)
-q	#只显示容器的编号


[root@Sophie /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@Sophie /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS                         PORTS     NAMES
5d615ea26c2b   centos         "/bin/bash"   2 minutes ago       Exited (0) 41 seconds ago                elastic_engelbart
c6f4d27c83d6   centos         "/bin/bash"   9 minutes ago       Exited (127) 4 minutes ago               bold_archimedes
948e1aa86918   feb5d9fea6a5   "/hello"      About an hour ago   Exited (0) About an hour ago             gracious_lichterman
3.退出容器
exit	#直接容器停止并退出
Ctrl + P + Q	#容器不停止退出
[root@Sophie /]# docker run -it centos /bin/bash
[root@f096bd8b01ce /]# [root@Sophie /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
f096bd8b01ce   centos    "/bin/bash"   11 seconds ago   Up 10 seconds             upbeat_snyder
4.删除容器
docker rm 容器id					#删除指定容器,不能删除正在运行的容器,如果强制删除, rm -f
docker rm -f $(docker ps -aq)	 #删除所有容器
docker ps -a|xargs docker rm	 #删除所有容器
5.启动和停止容器的操作
docker start 容器id		#启动容器
docker restart 容器id		#重启容器
docker stop 容器id		#停止当前正在运行的容器
docker kill 容器id		#强制停止正在运行的容器	

4.常用的其他命令

1.后台启动容器
#命令 docker run -d 镜像名!
[root@Sophie /]# docker run -d centos
a987a3c8a2990c49c36a1d61389efe444f441e919a6939d3cb872f94048d108e
[root@Sophie /]# 
#问题docker ps,发现centos停止了
#常见的坑:docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后发现自己没有启动服务,就会立刻停止,就是没有程序了
2.查看日志命令
docker logs -tf --tail 10 镜像id 

#自己编写一段shell脚本
docker run -d centos /bin/bash -c "while true;do echo sophie;sleep 1;done"

#docker ps
#显示日志
-tf				#显示日志
--tail number	#显示的日志条数
[root@Sophie /]# docker logs -tf --tail 10 镜像id 
3.查看容器中进程信息ps
#命令	docker top 容器id
[root@Sophie /]# docker top 6c88434d34b5
UID                 PID                 PPID                C                   STIME   
root                5997                5978                0                   11:22  
4.查看镜像的元数据
docker inspect 容器id
5.进入当前正在运行的容器
#因为通常我们的容器都是使用后台方式来运行的,有时需要进入容器修改配置
#方式一
docker exec -it 容器id bashShell
#测试
[root@Sophie /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
6c88434d34b5   centos    "/bin/bash"   19 minutes ago   Up 19 minutes             agitated_lichterman
f096bd8b01ce   centos    "/bin/bash"   31 minutes ago   Up 31 minutes             upbeat_snyder
[root@Sophie /]# docker exec -it 6c88434d34b5 /bin/bash
[root@6c88434d34b5 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@6c88434d34b5 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 03:22 pts/0    00:00:00 /bin/bash
root        15     0  0 03:41 pts/1    00:00:00 /bin/bash
root        30    15  0 03:42 pts/1    00:00:00 ps -ef
#方式二
docker attach 容器id
#测试
[root@Sophie /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
6c88434d34b5   centos    "/bin/bash"   23 minutes ago   Up 23 minutes             agitated_lichterman
f096bd8b01ce   centos    "/bin/bash"   35 minutes ago   Up 35 minutes             upbeat_snyder
[root@Sophie /]# docker attach 6c88434d34b5
正在执行当前的代码......

#区别
#docker exec		#进入容器后开启一个新的终端,可以再里面操作(常用)
#docker attach		#进入容器正在执行的终端,不会启动新的进程!
6.从容器内拷贝文件到主机上
docker cp 容器id:容器内路径	目的的主机路径

[root@Sophie home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
116a8be4d90b   centos    "/bin/bash"   49 seconds ago   Up 48 seconds             determined_cannon
f096bd8b01ce   centos    "/bin/bash"   41 minutes ago   Up 41 minutes             upbeat_snyder
#进入docker容器内部
[root@Sophie home]# docker attach 116a8be4d90b
[root@116a8be4d90b /]# cd /home
[root@116a8be4d90b home]# ls
#在容器内新建一个文件
[root@116a8be4d90b home]# touch test.java
[root@116a8be4d90b home]# ls
test.java
[root@116a8be4d90b home]# exit      
exit
[root@Sophie home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
f096bd8b01ce   centos    "/bin/bash"   43 minutes ago   Up 43 minutes             upbeat_snyder
[root@Sophie home]# docker rm -f f096bd8b01ce
f096bd8b01ce
[root@Sophie home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@Sophie home]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                        PORTS     NAMES
116a8be4d90b   centos         "/bin/bash"   2 minutes ago    Exited (0) 30 seconds ago 
#将这个文件拷贝出来到主机上
[root@Sophie home]# docker cp 116a8be4d90b:/home/test.java /home
[root@Sophie home]# ls
redis  sophie.java  test.java  www

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

5.常用的命令小结

在这里插入图片描述

m -f f096bd8b01ce
f096bd8b01ce
[root@Sophie home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@Sophie home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
116a8be4d90b centos “/bin/bash” 2 minutes ago Exited (0) 30 seconds ago
#将这个文件拷贝出来到主机上
[root@Sophie home]# docker cp 116a8be4d90b:/home/test.java /home
[root@Sophie home]# ls
redis sophie.java test.java www

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


### 5.常用的命令小结

[外链图片转存中...(img-GCt1SWMX-1647921745075)]



















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我会帮助你记录和学习Docker的知识点。下面是一份Docker学习笔记: 1. 什么是DockerDocker是一个开源的容器化平台,可以帮助开发者创建、打包、部署和运行应用程序,使应用程序可以在不同的环境中无缝运行。 2. Docker的优势有哪些? - 轻量化:Docker容器与虚拟机相比更加轻量级,启动和停止速度更快。 - 可移植性:Docker容器可以在任何支持Docker的平台上运行,无需担心环境不一致的问题。 - 隔离性:Docker使用容器技术进行隔离,每个容器之间相互独立,不会相互影响。 - 效率:Docker可以将应用程序及其依赖项打包为一个镜像,部署和扩展非常方便。 3. Docker常用的概念: - 镜像(Image):一个只读的模板,包含了运行应用程序所需的所有文件和依赖项。 - 容器(Container):基于镜像创建的可执行实例,可以运行、停止、删除等操作。 - 仓库(Registry):用于存储和分享镜像的地方,常用的有Docker Hub。 - Dockerfile:用于定义镜像构建过程的文本文件,包含了一系列的指令和配置。 4. Docker基本使用命令: - `docker pull <image-name>`:从仓库中拉取指定镜像。 - `docker run <image-name>`:创建并运行一个新的容器。 - `docker ps`:查看当前正在运行的容器。 - `docker stop <container-id>`:停止指定容器的运行。 - `docker rm <container-id>`:删除指定容器。 - `docker rmi <image-name>`:删除指定镜像。 5. Docker常见应用场景: - 镜像管理:可以通过Docker镜像进行应用程序开发、测试和部署。 - 微服务架构:通过容器化实现应用程序的模块化,方便管理和扩展。 - CI/CD:在持续集成和持续部署过程中使用Docker来构建、测试和发布应用程序。 这些是Docker学习过程中的一些基础知识点和常用命令。希望对你有帮助!如果你还有其他问题,可以随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值