单体Docker Docker Docker出现的契机:解决项目中的环境问题。docker的图标:鲸鱼上放了许多集装箱,也映射了docker的核心思想——隔离。每个箱子是互相隔离的。隔离机制也可以将linux服务器利用到极致 深究历史 2010年出现dotcloud,2013年开源后使用人数增多。2014年Docker1.0发布,基于Go语言开发。Docker优势是非常轻巧,在Docker之前一般都是使用虚拟机,非常笨重。Docker是容器技术,也属于一种虚拟化技术。一般linux最核心的环境不过4MB。 Docker与VM虚拟技术 虚拟机技术缺点:资源占用多、冗余步骤多、启动慢 容器化技术:不是模拟一个完整的操作系统 差异点:
传统虚拟机先虚拟出一套硬件,运行完整的操作系统,再在系统上运行软件
容器内的应用直接运行在宿主机的内容,容器本身无内核,也没有硬件,且容器间互相隔离,文件系统都是不一样的
优势:
应用更快速的交付和部署
* 传统交付需要借助文档、安装程序
更便捷的升级和扩缩容
* 部署应用快捷、项目打包为镜像后扩展方便
更简单的系统运维
* 开发、测试等环境高度一致
更高效的计算资源利用
* 内核级别的虚拟化,在一台物理机上可运行多个容器实例,服务器性能充分利用
Docker安装 架构图: 名词解释:
镜像:相当于一个模板,通过镜像来创建容器。一个镜像可以创建多个容器
容器:通过容器可以独立运行一个或一个组应用,有启动、停止、删除等基本操作
仓库:存放镜像的地方,有共有仓库和私有仓库
更换阿里云镜像地址:yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装教程(linux):https://docs.docker.com/engine/install/centos/ 配置阿里云镜像加速(教程地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /etc/ docker/daemon.json来使用加速器sudo mkdir -p /etc/ dockersudo tee /etc/ docker/daemon.json <<-'EOF' {"registry-mirrors" : ["https://1fd77tzz.mirror.aliyuncs.com" ] } EOFsudo systemctl daemon-reloadsudo systemctl restart docker
Docker命令 工作原理 docker是一个Client-Server结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问。DockerServer接收到DockerClient的指令,就会执行这个命令。docker中容器之间相互隔离,外部不能直接访问容器。 docker比vm快的原因 vm对比dc架构: docker比vm少了一层Guest OS。直接利用宿主机的内核。因此在新建容器时,无需想vm一样加载一个操作系统内核,省略了这个复杂的过程,加载时间是秒级的
帮助命令 docker version 版本信息 docker info 系统和容器相关信息 docker –help 帮助 ,官网文档地址:https://docs.docker.com/engine/reference/commandline/
镜像命令 docker images 查看所有本地的主机上的镜像 -a, –all Show all images (default hides intermediate images)# 列出所有镜像 –digests Show digests -q, –quiet Only show image IDs #只显示镜像ID
docker search 搜索镜像 -f, –filter filter Filter output based on conditions provided#过滤搜索 例如:docker search –filter=stars=5000 #寻找stars大于等于5000的镜像
docker pull 下载镜像 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 格式:docker pull镜像名[:tag](版本) Using default tag: latestlatest: Pulling from library/mysqla10c77af2613: Pull completeb76a7eb51ffd: Pull completef927e4: Pull completed2c75386df9: Pull completee92e4046c9: Pull completef5845c731544: Pull completebd0401123a9b: Pull completeef07ec35f1a: Pull completec93a31315089: Pull completeed800d44: Pull completed01857ca4c1: Pull completecc13890eda8: Pull completeDigest: sha256:aeecae58035f3868bf4f00e5fc623630d8b438db9d05f4d8c6538deb14d4c31b Status: Downloaded newer image formysql:latest docker.io/library/mysql:latest
docker rmi 删除镜像 rm代表删除,i代表image 1 2 3 4 5 -f, force Force removal of the image
例如: 删除指定镜像:docker rmi -f ID/image名, 删除全部镜像:docker rmi -f $(docker images -aq)
容器命令(有镜像才可以创建容器) docker run 启动容器 先在本机寻找镜像,找不到则去dockerHub上下载,还找不到就报错,找到了就下载到本地,并使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 docker run [可选参数] image --name ="Name" 容器名字,用于区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 - p 使用容器的端口,- p: - p ip: 主机端口: 容器端口 - p 主机端口: 容器端口(常用) - p 容器端口 容器端口 -P(大写) 随机指定端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 启动并进入镜像,交互工具使用bash [root@VM-0 -7 -centos ~]# docker run -it centos /bin/bash [root@ b902d8d2492 /]# ls #镜像内部是一个并不太完整的centos系统,很多命令是没有的 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
exit 退出至主机 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 exit 直接停止容器并退出 Ctrl + P + Q 容器不停止 [root@ b902d8d2492 /]exit [root@VM- - -centos ~] bin boot data dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@VM- - -centos ~]
docker ps 列出容器 1 2 3 -a 列出当前正在运行的容器和历史运行过的容器 -n=? 列出最近创建的容器 ?为个数 -q 只显示容器编号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [root @VM- 0- 7- centos ~] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root @VM- 0- 7- centos ~] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b902d8d2492 centos "/bin/bash" minutes ago Exited ( ) minutes ago vibrant_torvalds d14eb101f feb5d9fea6a5 "/hello" days ago Exited ( ) days ago stoic_fermi [root @VM- 0- 7- centos ~]
docker rm 删除容器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 docker rm 容器名 删除指定容器,不能删除正在运行的 docker rm -f 强制删除容器 docker rm -f $ ( docker ps -aq ) 强制删除所有容器,等同于docker ps -a -q | xargs rm 使用管道删除
容器基本操作命令 容器的启动、重启、停止和强制停止
1 2 3 4 5 6 7 8 9 docker start[ -i] id docker restart id docker stop id docker kill id
其他命令 后台启动容器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 当使用后台启动容器、且容器创建后没有对外的服务时(如nginx),创建后就会立刻停止容器。所以容器使用后台启动时,一定要有一个前台进程 [root @VM- 0- 7- centos ~] bcd96cf85f682b13b2346ef6701868981f68d4c4c2e0b4930c02e17a874 [root @VM- 0- 7- centos ~] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root @VM- 0- 7- centos ~] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcd96cf centos "/bin/bash" seconds ago Exited ( ) seconds ago eager_gauss 注意,这样是正常的。具体原因不详:docker run -d --name nginx74 -p : nginx
查看日志 1 2 3 4 5 6 docker logs -tf --tail 容器ID 查看最后 条实时日志 docker logs -tf 容器ID 查看所有日志、实时
查看容器中的进程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [root@VM- - -centos ~] UID PID PPID C STIME TTY TIME CMD root : ? : : /bin/ sh -c while true ;do echo yuanzhou;sleep ;done root : ? : : /usr/ bin /coreutils --coreutils-prog-shebang=sleep /u sr /bin/sleep
查看镜像元数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 docker inspect 容器ID [ {"Id" : "d3b2db3e0491e4caa4434343c2c8860db8442c6ac03295b46f7d679e1180066f " , " Created" : " 2021 -11 -30 T13:13 :56.884601581 Z" , " Path" : " /bin/sh" , " Args" : [ " -c" , " while true ;do echo yuanzhou;sleep 2 ;done" ], " State" : { " Status" : " running" , ………………
进入当前正在运行的容器 1 2 3 docker exec -it ID bashShell 开启一个新的终端,可以在里面操作(常用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [root@VM-- - centos ~]/ bin/ bash [root@d3b2db3e0491 / ] UID PID PPID C STIME TTY TIME CMDroot : ? : :/ bin/ sh - c whiletrue ; do echo yuanzhou;sleep ;doneroot : pts/0 00 :00 :00 / bin/bash root : ? : :/ usr/ bin/coreutils - -coreutils-prog-shebang= sleep /u sr/ bin/ sleep root : pts/ : : ps - ef
1 docker attach ID 进入容器正在执行的终端,不启动新进程,不常用
从容器内拷贝文件到主机 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [root@VM- - -centos ~] [root@ a7dca3d597 /] [root@ a7dca3d597 ~] anaconda-ks.cfg anaconda-post.log original-ks.cfg yuanhou.sh [root@ a7dca3d597 ~]exit [root@VM- - -centos ~] [root@VM- - -centos ~] 总用量 -rw-r--r-- root root 月 : single_table.sql drwxr-xr-x root root 月 : test -rw-r--r-- root root 月 : yuanhou.sh
查看docker的CPU状态
使用docker安装nginx、tomcat 注:容器中的命令较少,且tomcat中的镜像是保证最小可运行的镜像,连webapps都需要从其他目录copy过来 安装elasticsearch: docker run -d –name elasticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS=“-Xms64m -xmx512m” -e “discovery.type=single-node” elasticsearch:7.6.2 /bin/bash [root@VM-0-7-centos ~]# curl localhost:9200 { “name” : “dda2ff33a70e”, “cluster_name” : “docker-cluster”, “cluster_uuid” : “ECsYrnfeTl-hxGllhDXSvg”, “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” } [root@VM-0-7-centos ~]# ES+kibna:数据可视化,涉及到两个容器的网络连接。 安装docker可视化面板portainer(一般不会用)
1 2 3 4 5 6 7 8 9 10 11 docker run -d -p : --restart =always -v /var/run /docker.sock:/ var /run/ docker.sock --privileged=true portainer/portainer
注:针对容器启动后就停止有两种可能,一种是容器内部没有前台进程,如nginx这种,启动之后就会立刻退出。还有一种是ela这种需要超大内存的容器,启动之后直接把一核1G内存的云主机CPU挤爆了,这种就需要对其资源占用做限制,如添加 -e ES_JAVA_OPTS=“-Xms64m -xmx512m” 以限制jvm的资源
Docker镜像 联合文件系统:UFS是一种分层、轻量级、高性能文件系统,Union文件系统是镜像的基础,联合加载会把各层文件系统叠加起来,最终文件系统会包含所有底层文件和目录
镜像加载原理 bootfs包含加载系统,镜像的最底层。与典型的linux是一样的,包含boot加载器和内核,当boot加载完成后,整个内核都在内存中,此时内存的使用权就由boofs转交给内核,系统也会卸载bootfs rootfs:在bootfs之上,包含/dev、/proc、/etc等标准目录,就是不同操作系统发行版,如乌班图、centos等 Docker进项都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是通常说的容器层,容器之下的都叫镜像层
commit镜像 1 2 3 4 5 6 docker commit 提交容器称为一个新副本 -m 描述信息 -a 作者 容器id 目标镜像名:[tag]
修改原有镜像后,通过docker commit -m xxx -a xxx打包成一个新的镜像。因此如果想要保存一个容器当前的状态,必须通过commit来提交,获得新的镜像。类似虚拟机中的快照