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能干嘛
虚拟机缺点:
- 资源占用十分多
- 冗余步骤多
- 启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统
比较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快?
- Docker有着比虚拟机更少的抽象层。
- 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)]