Doaker学习笔记
Docker的认知
-
核心概念
docker是一种linux容器技术。容器有效的将由单个操作系统挂管理的资源划分到孤立的组中,以便更好的在组之间平衡有冲突的资源使用需求。可简单理解为一种沙盒 。每个容器内运行一个应用,不同的容器之间相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,资源需求远远低于虚拟机。
Docker通过隔离机制,可以将服务器利用到极致。 -
基于GO语言开发的。
-
官网地址:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/ -
区别
-
传统的虚拟机,虚拟出一个硬件,运行一个完整的操作系统
-
容器内的应用直接运行在宿主机上,容器没有自己的内核,也没有虚拟硬件
每个容器是相互隔离的,每个容器都有属于自己的文件系统,互补影响
5.docker与虚拟化 -
虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器,网络,内存等抽象、转化后呈现出来,使用户以更好的方式来应用这些资源。虚拟化目标往往是为了在同一个主机上运行多个系统或者应用,从而提高资源的利用率,降低成本,方便管理及容错容灾。
-
操作系统级的虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。docker以及其他容器技术就属于此范畴。
-
传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。而docker容器是在操作系统层面上实现虚拟化,直接复用本地主机操作系统,更加轻量。
- 作用
1、应用可以更加快捷的交付和部署
2、使用的分层存储以及镜像的技术,更便捷的升级和扩容,轻松的迁移扩展
3、更简单的系统运维, 简单的更新管理
4、更高效的计算资源利用
5、能高效地构建应用。
6、更快速的启动时间,由于直接运行于宿主内核,无需启动完整的操作系统
一个虚拟机上可以运行多个容器实例 - 结构
镜像(image):可以看作一个模板,可以通过这个模板来创建容器服务
容器(container):独立运行一个或一个组应用,通过镜像创建,相当于一个实例
仓库(repository):存放镜像的地方
安装Docker
- 卸载旧的版本
$sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装
sudo yum install -y yum-utils
- 设置镜像地址
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo --- 推荐使用阿里云镜像
#https://download.docker.com/linux/centos/docker-ce.repo --国外镜像
- 更新软件索引
sudo yum makecache fast
- 安装docker相关内容
docker -ce 社区版
docker -ee 企业版
sudo yum install docker-ce docker-ce-cli containerd.io
- 启动Docker
sudo systemctl start docker
- 获取docker的版本
docker versiondock
- 测试
docker run hello-world
- 查看下载的 hello-world镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
nacos/nacos-server 2.0.1 90c4c6c5d925 7 months ago 1.04GB
卸载Docker
- 卸载依赖
yum remove docker -ce docker -ce-cli containerd,io
- 删除资源
rm -rf /var/lib/docker ---默认工作路径
阿里云镜像加速
- 阿里云 --容器服务
- 镜像加速器
- 配置使用
sudo mkdir -p ./etc/docker
sudo tee ./etc/docker/daemon.jsin<<-'EOF'
{
"registry-mirrors":["地址"]
}
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker的常用命令
帮助命令
docker version #显示docker的版本信息
docker info #docker的系统信息,包括镜像及容器的数量
docker help #帮忙命令
帮助文档地址:https://docs.docker.com/reference/
镜像命令
docker images 查看所有本地主机上的镜像
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATE 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all 列出所有的镜像
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet 只显示镜像的ID
docker search 搜索镜像
例子:docker serach mysql
添加参数:--filter=STARS=3000 # 搜索出来的镜像STARS大于3000
docker pull mysql #默认下载最新版
等价于:docker pull docker.io/library/mysql:latest
添加参数: :tag #添加版本信息
联合文件系统
docker rmi -f 镜像ID #删除镜像
docker rmi -f $(docker images -aq) #递归删除所有镜像
容器命令
#启动容器
docker run[可选参数] image
#参数说明
--name= "容器名称" 容器名称,用于区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
-P 随机指定端口
-e 环境配置
例子
##启动并进入容器
docker run -it 容器名称 /bin/bash
##退出并停止容器
exit
##容器不停止退出
Ctrl + P + Q
#查看运行的容器
docker ps
#查看曾经运行过的容器
docker ps -a
#显示最近创建的容器
-n = ?
#只显示容器的编号
-q
#删除容器(不能删除正在运行的容器,需加 rf -f)
docker rm 容器的ID
#删除所有容器
docker rm -f ¥(docker ps -aq)
docker ps -a -q|xargs docker rm
#启动容器
docker start 容器ID
#重启容器
docker restart 容器ID
#停止当前正在运行的容器
docker stop 容器ID
#Q强制停止当前容器
docker kill 容器的ID
commit镜像
docker commit -a = "提交用户名" -m= "日志" 镜像ID 目标镜像名称:【tag】
docker commit -a = "sun" -m= "add message to tomcat" 7easak434223 tomcat02:1.0
其他容器命令
docker run -d 镜像名称
问题: docker ps 发现镜像停止了
原因: docker 容器使用后台运行时,就必须有一个前台的进程,docker发现没有应用,就会自动停止
如 nginx容器启动后,法相自己没有提供服务,就会立即停止
#查看日志
docker logs -f -t --tail t条数 容器ID
#查看容器进程信息
docker top 容器ID
#查看容器内部的信息
docker inspect 容器的ID
#查看容器内部的信息
docker inspect 容器的ID
#查看状态
docker stats
进入当前正在运行的容器
#我们通常容器都是使用后台方式运行的,需要进入容器
#命令
方式一:进入容器后开启一个新的终端,可以在里面操作
docker exec -it 容器的ID bashShell
例子:
[root@localhost ~]# docker exec -it 90185ae982b0 /bin/bash
root@90185ae982b0:/apache-zookeeper-3.6.0-bin#
方式二:进入容器正在执行的终端,不会启动新的进程
docker attach 容器的ID
#从容器内拷贝文件到主机上
docker cp 容器的ID:容器内的路径 目标主机的路径
练习
安装Nginx
docker search nginx #搜索
docker pull nginx #拉取
docker run -d --name nginx01 -p :3344:80 nginx #启动
-d 后台运行
-p 宿主机端口:容器内部端口 暴漏端口于宿主机
curl localhost:3344 #测试
#进入容器
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@4200055aa7ae:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@4200055aa7ae:/# cd /etc/nginx
root@4200055aa7ae:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
安装tomcat
docker run -it --rm tomcat:9.0
该命令表示用完即删,一般用于测试
docker pull tomcat
docker run -d -p 3355:8080 --name tomcat01 tomcat
docker exec -it tomcat01 /bin/bash
发现 1:linux命令少了 2:没有webapps
原因:阿里云镜像的原因,默认是最小的镜像,所有不必要的都被剔除
解决方法:
docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps
部署es
[root@localhost ~]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.16.2
[root@localhost ~]# curl localhost:9200
{
"name" : "12c7a95dad74",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "OqhjqILdQ3SetCie7pnOSg",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
-e 添加环境配置
[root@localhost ~]# docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.16.2
配置可视化(pointainer)
docker run -d -p 8088:9000\
--restart=always -v /var/run/docker.sock:var/run/docker.sock --name portainer1 --privileged=true portainer/portainer