Docker笔记

B站遇见狂神说教学笔记,个人笔记

Docker和虚拟机的区别:
  • 虚拟机是虚拟出一个操作系统,然后才在操作系统上安装和运行软件;
  • 容器内的应用直接运行在宿主机的内核中, 容器是没有自己的内核的,也没有虚拟硬件,所以就轻便了;
  • 每个容器间都是相互隔离的,每个容器间互不影响;
  • Docker是内核级别的虚拟化,可以在一个物理机上运行多个容器实例;
Docker运行

在这里插入图片描述

Docker的组成
  • 镜像(image):
    docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像==> run==>tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
  • 容器(container):
    docker利用容器技术,独立运行一个或者一个组容器,通过镜像来创建的;
    启动、停止、删除、基本命令;
    可以把容器理解为一个简易的Linux系统
  • 仓库(repository):
    仓库就是存放镜像的地方,仓库分为公有仓库和私有仓库;
安装Docker

1.Linux系统
2.Xshell能正常连接Linux
3.系统内核需要3.10以上

#查看系统内核
uname -r

#卸载旧的docker版本
[root@izx4xwfjh1zsdsz /]# sudo yum remove docker \
                          docker-client \
                          docker-client-latest \
                          docker-common \
                          docker-latest \
                          docker-latest-logrotate \
                          docker-logrotate \
                          docker-selinux \
                          docker-engine-selinux \
                          docker-engine
#安装所需的软件包
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

#设置镜像仓库为阿里云仓库
$ sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新yum软件包索引
yum makecache fast

#安装docker社区版
$ sudo yum install docker-ce docker-ce-cli containerd.io

#可以指定docker版本安装    例如:docker-ce-18.09.1
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

#卸载docker
yum remove docker-ce docker-ce-cli containerd.io

#删除资源   /var/lib/docker是docker的默认配置路径
rm -rf /var/lib/docker

#启动docker
sudo systemctl start docker

#运行hello-world检查是否成功安装
sudo docker run hello-world

#查看docker中的镜像
docker images
配置阿里云加速器

1.登录阿里云服务器
2.打开控制台中的容器镜像服务>打开镜像加速器
3.选择对应的操作系统,根据提示去进行修改配置文件。
在这里插入图片描述

#每个人的账户配置不一样,所以需要查看自己对应账户的配置

#创建文件夹
sudo mkdir -p /etc/docker
#修改配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ukh1stsy.mirror.aliyuncs.com"]
}
EOF
#重启守护进程
sudo systemctl daemon-reload
#重启docker
sudo systemctl restart docker
Dcoker流程

1.运行时,docker会先在本地查找是否存在运行的镜像,如果存在就运行本地的镜像,如果没有就去Docker Hub上下载该镜像,如果线上仓库找到就下载镜像到本地,然后运行该镜像,如果没找到就报错。
在这里插入图片描述

Docker常用命令
#显示docker版本信息
docker version

#docker详细信息
docker info

#帮助命令
docker 命令 --help

官方帮助文档地址:https://docs.docker.com/reference/

镜像命令
#查询镜像命名
docker images

在这里插入图片描述

REPOSITORY 镜像的仓库
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小

#可选项
-a				显示所有镜像
-q				只显示镜像ID
docker search搜索镜像
#docker search 镜像名
docker search mysql

#通过收藏来过滤
docker search mysql --filter=3000			#搜索出来的镜像就是收藏大于3000的镜像
docker下载镜像
#下载镜像  docker pull 镜像名[:tag] 

[root@localhost ~]# docker pull mysql
Using default tag: latest				#如果不写 tag,默认下载latest版本
latest: Pulling from library/mysql
bf5952930446: Pull complete 			#分层下载,docker images 核心
8254623a9871: Pull complete 
938e3e06dac4: Pull complete 
ea28ebf28884: Pull complete 
f3cef38785c2: Pull complete 
894f9792565a: Pull complete 
1d8a57523420: Pull complete 
6c676912929f: Pull complete 
ff39fdb566b4: Pull complete 
fff872988aba: Pull complete 
4d34e365ae68: Pull complete 
7886ee20621e: Pull complete 
Digest: sha256:c358e72e100ab493a0304bda35e6f239db2ec8c9bb836d8a427ac34307d074ed
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest   	#真实地址

#等价于它
docker pull mysql
docker.io/library/mysql:latest
指定版本下载 docker pull 镜像:版本
#联合文件系统, 已存在的依赖文件下载时无需再重新下载

[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bf5952930446: Already exists 
8254623a9871: Already exists 
938e3e06dac4: Already exists 
ea28ebf28884: Already exists 
f3cef38785c2: Already exists 
894f9792565a: Already exists 
1d8a57523420: Already exists 
5f09bf1d31c1: Pull complete 
1b6ff254abe7: Pull complete 
74310a0bf42d: Pull complete 
d398726627fd: Pull complete 
Digest: sha256:da58f943b94721d46e87d5de208dc07302a8b13e638cd1d24285d222376d6d84
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
删除docker镜像
docker rmi -f 镜像id		#删除指定镜像
docker rmi -f  镜像id 镜像id 镜像id   		#删除多个镜像
docker rmi -f $(docker images -aq)			#查出所有镜像id,然后删除所有镜像
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
#docker run [可选参数] image

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


#启动并进入容器
docker run -it centos /bin/bash    #启动centos这个容器
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
#从容器中返回
exit
列出所有的运行的容器
#docker ps 参数
为空时  #列出当前正在运行的容器
-a			#列出当前正在运行的容器和历史运行的容器
-n=?			#显示最近创建的容器
-q			#只显示容器的编号
退出容器
exit		#退出容器并结束容器
Ctrl + P +Q #退出容器不停止
删除容器
docker rm 容器id			#删除指定的容器,不能删除正在运行的容器,如果要强制删除需要 docker rm -f
docker rm -f $(docker ps -aq)		#删除所有的容器
启动和停止容器
docker start 容器id		#启动容器
docker restart 容器id	#重启容器
docker stop 容器id		#停止容器
docker kill 容器id			#强制停止容器
常用的其他命令
后台启动容器
#docker run -d 镜像名
docker run -d centos

#问题 docker ps ,发现centos停止了

#因为docker容器使用后台运行,就必须要有一个前台程序,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
#docker logs --help 查看帮助文档
#参数说明
-tf		#显示日志和时间
--tail	number	#要显示的日志行数

#打印日志,如果日志没有内容就没有东西输出
#docker logs -f -t --tail 行数 容器id

#可以结束原有的容器,启动循环输出内容的容器
[root@localhost ~]# docker run -d centos /bin/sh -c "while true;do echo ceshi;sleep 1;done" 

#输出10行 logs
docker logs -tf --tail 10 容器id
查看容器中进程信息
docker top 容器id
查看容器的详细信息
docker inspect 容器id
进入当前正在运行的容器
#以交互的模式进入对应的容器,修改一些配置
docker exec -it 容器id /bin/bash

#方式二
docker attach 容器id /bin/bash

#区别
#docker exec  #进入容器后开启一个新的终端,可以在里面操作(常用)
注意:如果从这个容器中退出不会导致容器停止。
#docker attach  #进入容器正在执行的终端,不会启动新的进程
注意:如果在容器中退出exit,会导致容器停止。
复制容器内的文件到主机上
docker cp 容器id:容器文件所在路径 主机路径

[root@localhost home]# ls
test
#把容器中的文件复制到当前主机的home目录下
[root@localhost home]# docker cp 5224603343ef:/home/test.py /home/
#复制成功
[root@localhost home]# ls
test  test.py
常用命令图示

在这里插入图片描述

作业练习
练习1:安装nginx
#1.搜索nginx
docker search nginx

#2.安装nginx
docker pull nginx    #默认安装最新的版本

#3.启动nginx镜像并启动容器和重命名容器
docker run -d --name nginx01 -p 3344:80 nginx

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

#4.本机自测查看是否正常运行
curl localhost:3344

#5.进入nginx
docker exec -it nginx01 /bin/bash

#部署完成后可以在Windos端访问本地IP+3344端口号访问,可以看到Nginx部署成功页面.

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

端口暴露的概念

在这里插入图片描述

练习2:安装tomcat
1.安装tomcat镜像,并启动容器(如果本地仓库找不到,会自动去线上下载)
#tomcat默认端口为8080,然后把容器外部3355端口映射到容器内部的8080端口
docker run -it  --name tomcat01 -p 3355:8080 tomcat /bin/bash

1-1. 官方的使用
#我们之前的启动都是在后头,停止了之后容器还可以找到. 官方的是用完即删除, 一般用于测试
docker run -it --rm tomcat:9.0

1-2.本地运行测试
curl localhost:3355
Linux本地访问没有问题,但是在window外部访问失败 

2.进入到tomcat容器下
docker exec -it tomcat01 /bin/bash


#发现问题, Linux命令缺少了一部分,webapps目录下没有文件,原因是阿里镜像,默认是最小镜像,所有不必要的都剔除掉了,保证最小可运行环境.
#可以从容器下的webapps.dist,把里面的文件复制到webapps下

cp -r ./webapps.dist/* ./webapps/

思考问题:我们以后要部署项目,如果每次都要进入容器内部是不是十分麻烦? 我要是可以在容器的外部提供一个映射路径, webapps, 我们在外部放置项目,就自动同步到内部就好了!

练习3: 部署ES(elasticsearch)+Kibana
  • es暴露的端口多
  • es十分耗内存
  • es的数据一般需要放置到安全目录 ! 挂在
  • –net somenetwork ? 网络配置

#下载 启动 ES

docker run -d  -p 9200:9200 -p 9300:9300 -e "discovery.ytpe=single-node" elasticsearch

#ES 启动之后就很容易Linux卡死 docker stats 查看cpu状态

#es是十分耗内存

#docker ps 查看是否成功启动和映射

#安装成功就马上关闭,然后增加内存限制, 修改配置文件 -e 环境配置修改

#限制启动大小为64m 最大为512m

docker run -it --name ES02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch

#容器启动成功,可以docker stats 查看下内存状态
在这里插入图片描述

#连接下ES,查看是否启动成功
curl localhost:9200

#启动成功
在这里插入图片描述

可视化UI

1.portainer
#下载启动可视化面板

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试:http://ip:8088

  • 成功后的登录界面
    在这里插入图片描述
  • 创建账号登录后进入仓库选择界面,一般选择本地
    在这里插入图片描述
  • 选择仓库后进入就能看到如下界面
    在这里插入图片描述
  • 可视化面板,一般较少使用,可以了解一下.
Dokcer commit 镜像提交

1.了解镜像的提交前首先要了解Dokcer操作的一个特点;
2.docker镜像是只读的,用户的操作不会对原有的镜像产生改变;当启动容器时,一个新的可写层被加载到镜像的顶部,这一层就是我们通常说得容器层,容器层之下的都叫镜像层;
在这里插入图片描述
3.docker commit镜像命令

docker commit -a="制作者" -m="提交信息" 容器id 目标镜像名:[TAG]

#例如
docker commit -a="ZongJie" -m="test commit" 963379f7e0a5 tomcat01:1.0
实战演练commit 镜像

1.启动一个镜像

2.官方下载的tomcat镜像中的webapps是没有文件的

3.我们自己拷贝webapps.dist中的基本文件到webapps下

4.提交镜像,然后查看当前images中是否正常生成了一个新的镜像; 新提交的镜像因为比原镜像多了基础文件所以大小会大一点;
在这里插入图片描述

容器数据卷

1.容器间可以有一个数据共享的技术,Docker容器中产生的数据同步到Linux本地!
这就是卷的技术;

总结: 容器数据持久化和同步操作! 容器间也是可以数据共享的!
在这里插入图片描述

使用数据卷
#方式一 : 直接使用命令来挂载
docker run -it -v 主机目录:容器内目录

#1.启动一个镜像容器,然后挂载容器内的目录到本地目录下

docker run -it -p 8088:8080 -v /home/test:/home tomcat /bin/bash
  • 当挂载完毕后可以在本地home目录下看到多出了一个test目录
    在这里插入图片描述
  • 我们可以通过docker inspect查看挂载卷的详细信息
    在这里插入图片描述
  • 然后我们可以尝试在本地或者容器内创建文件,可以看到文件创建后是会被同步到共享目录下的;

在这里插入图片描述
再次测试

1.先停止容器
2.然后在本地对文件进行修改
3.再次启动容器
4.启动容器后,在本地中修改的文件仍然会同步到容器中;
在这里插入图片描述
5.挂载卷后的好处是,以后我们只需要在本地进行容器配置的一个修改,不需要每次都要进入容器内;
6.假设我们删除了容器,但是本地数据卷仍旧不会丢失,这就实现了容器数据持久化的功能 !

实战安装Mysql

1.启动mysql -e MYSQL_ROOT_PASSWORD=password , 这个参数是设置数据库的密码的;
2.挂载mysql中的配置目录和数据库表目录;
3. -v 挂载卷; -e 环境配置

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
具名挂载和匿名挂载
#匿名挂载
# -P是随机映射 -v中没有设置本地的挂载路径,直接填写容器中需要挂载的路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

#运行容器后,我们可以使用volume 查看容器的挂载卷信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值