核心概念
docker是一种linux容器技术。容器有效的将由单个操作系统挂管理的资源划分到孤立的组中,以便更好的在组之间平衡有冲突的资源使用需求。可简单理解为一种沙盒 。每个容器内运行一个应用,不同的容器之间相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,资源需求远远低于虚拟机。
Docker通过隔离机制,可以将服务器利用到极致。
基于GO语言开发的。
官网地址:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
区别
传统的虚拟机,虚拟出一个硬件,运行一个完整的操作系统
容器内的应用直接运行在宿主机上,容器没有自己的内核,也没有虚拟硬件
每个容器是相互隔离的,每个容器都有属于自己的文件系统,互补影响
5.docker与虚拟化
虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器,网络,内存等抽象、转化后呈现出来,使用户以更好的方式来应用这些资源。虚拟化目标往往是为了在同一个主机上运行多个系统或者应用,从而提高资源的利用率,降低成本,方便管理及容错容灾。
操作系统级的虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。docker以及其他容器技术就属于此范畴。
传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。而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
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
docker versiondock
docker run 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
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 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 随机指定端口 例子 ##启动并进入容器 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
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:容器内的路径 目标主机的路径
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
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
[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
docker run -d -p 8088:9000\ --restart=always -v /var/run/docker.sock:var/run/docker.sock --name portainer1 --privileged=true portainer/portainer