Docker概述
1、简介
docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,并且容器开销极其低。
docker官网:/
docker文档:/
docker hub:/
2、Docker VS 虚拟机
虚拟机:虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。包含系统内核、lib、app等,相对更加重量级
虚拟机的缺点:
资源占用多冗余步骤多启动慢
Docker:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
两者的不同:
传统虚拟机会虚拟出一个硬件,运行一个完整的操作系统,然后再这个系统上安装和运行环境Docker内的容器直接运行在宿主机的内核上,容器自己是没有内核的,也没有虚拟硬件每个容器间是相互隔离的,每个容器都有自己的文件系统,相互隔离
3、Docker基本概念
1)镜像(image)
docker镜像就是一个只读模板,比如,一个镜像可以包含一个完整的centos,里面仅安装apache或用户的其他应用,镜像可以用来创建docker容器,另外docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下周一个已经做好的镜像来直接使用
2)容器(Container)
docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序
3)仓库(repostory)
仓库是集中存储镜像文件的地方,registry是仓库主从服务器,实际上参考注册服务器上存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下周,国内的阿里云,这里仓库的概念与Git类似,registry可以理解为github这样的托管服务
4、Docker安装
参考文档
下面以CentOS 7做安装说明,其他系统可以再参考文档中找到相关教程
# 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、设置docker下载地址yum-config-manager \--add-repo \/linux/centos/docker-ce.repo #国外镜像不推荐yum-config-manager \--add-repo \/docker-ce/linux/centos/docker-ce.repo #阿里云镜像 推荐#4、更新yum软件包索引yum makecache fast# 5、安装Docker ce是社区版,ee是企业版yum install docker-ce docker-ce-cli containerd.io# 6、启动dockersystemctl start docker#7、hello world测试docker run hello-world
出现下面的内容表示安装成功:
docker run hello-world
的运行流程:
5、Docker卸载
#1、卸载依赖yum remove docker-ce docker-ce-cli containerd.io#2、删除资源rm -rf /var/lib/docker
6、阿里云镜像加速
1)、登录阿里云
产品与服务->容器镜像服务->镜像加速器
按照上述步骤打开页面,可以看到加速地址和步骤
2)、配置
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://**你自己的路径**."]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
Docker基本使用
1、底层原理
Docker是一个C/S架构的系统,Docker的守护进程运行在主机上,可以通过Socket从客户端进行访问,Docker-Server可以接收Docker-Client的指令并执行。
2、常用命令
1)帮助命令
docker version # 显示docker的版本信息docker info # 显示docker的版本信息docker 命令 --help # 查看相关命令的说明
docker命令的官方文档:/reference/
2)镜像命令
docker images
查看下载的镜像
[root@Eva overlay2]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmysqllatest 8e8c6f8dc9df 8 weeks ago 546MBtomcatlatest 31a47677561a 8 weeks ago 529MB#解释REPOSITORY镜像的仓库源TAG镜像的版本IMAGE ID 镜像的idCREATED精选的创建时间SIZE精选的大小#可选项-a, --all Show all images (default hides intermediate images) #显示所有镜像-f, --filter filter Filter output based on conditions provided #过滤-q, --quiet Only show numeric IDs #只显示id
docker search 名称
在docker hub中查询镜像
[root@Eva overlay2]# docker search mysqlNAMEDESCRIPTION STARSOFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 9629[OK]mariadb MariaDB is a community-developed fork of MyS… 3497[OK]mysql/mysql-serverOptimized MySQL Server Docker images. Create… 702 [OK]percona Percona Server is a fork of the MySQL relati… 490 [OK]centos/mysql-57-centos7 MySQL 5.7 SQL database server 77 mysql/mysql-clusterExperimental MySQL Cluster Docker images. Cr… 69#可选项--filter=STARS=3000 #只搜索STARS是3000以上的
docker pull
下载镜像
docker pull 名称[:版本] #版本可省略,默认是最新版[root@Eva overlay2]# docker pull mysql:5.75.7: Pulling from library/mysql #版本号,以及地址8559a31e96f4: Pull complete #分层下载,docker image的核心 联合文件系统d51ce1c2e575: Pull complete c2344adc4858: Pull complete fcf3ceff18fc: Pull complete 16da0c38dc5b: Pull complete b905d1797e97: Pull complete 4b50d1c6b05c: Pull complete d85174a87144: Pull complete a4ad33703fa8: Pull complete f7a5433ce20d: Pull complete 3dcd2a278b4a: Pull complete Digest: sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854#签名Status: Downloaded newer image for mysql:5.7docker.io/library/mysql:5.7#真实地址
docker rmi
删除镜像
[root@Eva overlay2]# docker rmi 9cfcce23593aUntagged: mysql:5.7Untagged: mysql@sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854Deleted: sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46aDeleted: sha256:98de3e212919056def8c639045293658f6e6022794807d4b0126945ddc8324beDeleted: sha256:17e8b88858e400f8c5e10e7cb3fbab9477f6d8aacba03b8167d34a91dbe4d8c1Deleted: sha256:c04c087c2af9abd64ba32fe89d65e6d83da514758923de5da154541cc01a3a1eDeleted: sha256:ab8bf065b402b99aec4f12c648535ef1b8dc954b4e1773bdffa10ae2027d3e00Deleted: sha256:09687cd9cdf4c704fde969fdba370c2d848bc614689712bef1a31d0d581fDeleted: sha256:b704a4a65bf536f82e5d8b86e633d19185e26313de8380162e778feb285aDeleted: sha256:c37206160543786228aa0cce738e85343173851faa44bb4dc07dc9b7dc4ff1c1Deleted: sha256:12912c9ec523f648130e663d9d4f0a47c1841a0064d4152bcf7b2a97f96326ebDeleted: sha256:57d29ad88aa49f0f439592755722e70710501b366e2be6125c95accc43464844Deleted: sha256:b17c024283d0302615c6f0c825137da9db607d49a83d2215a79733afbbaeb7c3Deleted: sha256:13cb14c2acd34e45446a50af25cb05095a17624678dbafbcc9e26086547c1d74docker rmi 镜像ID或者名称docker rmi 镜像ID 镜像ID 镜像ID #删除多个镜像docker rmi -f $(docker images -aq) #删除全部的镜像
3)容器命令
说明:首先需要下载镜像,之后才能运行成容器,下面以运行CentOS为例:
首先下载镜像:
[root@Eva overlay2]# docker pull centosUsing default tag: latestlatest: Pulling from library/centos8a29a15cefae: Pull complete Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700Status: Downloaded newer image for centos:latestdocker.io/library/centos:latest
新建并启动容器:
docker run [可选项] 镜像名称或ID# 可选项--name="name"#指定容器名称-d#后台运行-it#使用交互模式运行,进入容器查看内容-p#指定运行的端口 -p 8080:8080 主机端口:容器端口-p 8080容器端口(不对外暴露)#测试:[root@Eva overlay2]# docker run -it centos /bin/bash #启动并进入容器内部[root@a82a3f30cdba /]# ls #查看容器内部的centos,基础版本bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var[root@a82a3f30cdba /]# exit #退出容器exit
退出容器内部:
exit#推出容器内部,并停止容器ctrl + p + q#退出但不停止容器
docker ps
查看正在运行的容器
[root@Eva overlay2]# docker psCONTAINER ID IMAGECOMMAND CREATED STATUS PORTSNAMESf3b47f4d17b8 mysql"docker-entrypoint.s…" 8 weeks ago Up 47 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
docker ps -a
查看所有容器,包括没有运行的:
[root@Eva overlay2]# docker ps -aCONTAINER ID IMAGECOMMAND CREATED STATUS PORTSNAMESa82a3f30cdba centos"/bin/bash" 7 minutes ago Exited (0) 3 minutes agoloving_mclean#其他可选项-n=?#只显示最近运行的n个容器-q#只显示容器编号-ap#组合,获取所有容器的id,可用于删除
docker rm 容器ID
删除容器
[root@Eva overlay2]# docker rm f01613c648be e41ffbe686ff #删除指定容器,不能删除正在运行的容器f01613c648bee41ffbe686ffdocker rm -f $(docker ps -aq) #删除所有容器
启动和停止容器
docker start 容器ID#启动一个停止的容器docker restart 容器ID#重启一个容器docker stop 容器ID#停止一个正在运行的容器docker kill 容器ID#强制停止容器
4)其他常用命令
后台启动容器
docker run -d 镜像名称[root@Eva overlay2]# docker run -d centosc324f4e0e0bc6ce5347ffc02f0ab63a33b9ce5e7f37029ca2fc6fab6d38ecf8c#问题:使用docker ps 发现容器停止了#原因:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用就停止了#例如nginx 容器启动之后,发现自己没有提供服务,就会立即停止
查看日志
[root@Eva overlay2]# docker logs -tf --tail 10 f3b47f4d17b8 #查看mysql日志,--tail后跟需要从看到的行数-06-16T04:22:28.400711646Z -06-16T04:22:28.390264Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.-06-16T05:24:04.958498064Z -06-16 05:24:04+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.-06-16T05:24:05.106042194Z -06-16 05:24:05+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'...
查看容器中的进程
docker top 容器ID[root@Eva overlay2]# docker top f3b47f4d17b8 #UID PID PPIDC STIMETTY TIMECMDsystemd+ 21118211010 13:24? 00:00:45 mysqld
查看镜像元数据
docker inspact 容器ID[root@Eva overlay2]# docker inspect f3b47f4d17b8[{"Id": "f3b47f4d17b84e449b6475ff781574e896e60cdf73a5282bfa6e1d7150afa60f","Created": "-04-19T16:23:49.741963292Z","Path": "docker-entrypoint.sh","Args": ["mysqld"],"State": {"Status": "running","Running": true,....
进入当前正在运行的容器
通常我们的容器都是后台运行的,需要进入容器修改一些配置时可以使用该命令
#方法一docker exec -it 容器ID /bin/bash[root@Eva overlay2]# docker exec -it f3b47f4d17b8 /bin/bashroot@f3b47f4d17b8:/# lsbin boot devdocker-entrypoint-initdb.d entrypoint.sh etchome lib lib64 media mnt opt proc root run sbin srv sys tmp usr varroot@f3b47f4d17b8:/# exitexit#方法二docker attach 容器ID#区别# docker exec#进入容器后开启一个新的终端,可以在里面操作# docker attach#进入容器正在执行的终端
容器和主机之间相互拷贝文件
#从容器中拷贝文件到主机docker cp 容器ID:容器内路径 主机目的路径#例子[root@Eva ~]# docker exec -it f3b47f4d17b8 /bin/bash#进入容器内部root@f3b47f4d17b8:/# lsbin boot devdocker-entrypoint-initdb.d entrypoint.sh etchome lib lib64 media mnt opt proc root run sbin srv sys tmp usr varroot@f3b47f4d17b8:/# mkdir hello.world#创建文件夹root@f3b47f4d17b8:/# ls bin boot devdocker-entrypoint-initdb.d entrypoint.sh etchello.world home liblib64 media mnt optproc root run sbin srv sys tmp usr varroot@f3b47f4d17b8:/# exitexit[root@Eva ~]# docker cp f3b47f4d17b8:/hello.world ./ #将容器中的hello.world文件夹拷贝到当前路径[root@Eva ~]# lshello.world #从主机中拷贝文件到容器。也可以使用后面介绍的挂载 -v 实现docker cp 主机目的路径 容器ID:容器内路径
查看容器的性能使用情况
[root@Eva ~]# docker statsCONTAINER ID NAMECPU %MEM USAGE / LIMITMEM %NET I/O BLOCK I/O PIDSf3b47f4d17b8 mysql0.49%369MiB / 1.795GiB20.08% 0B / 0B 0B / 0B 39
5)小结
管理命令: config管理Docker配置container 管理容器image 管理镜像network管理网络node 管理Swarm节点plugin管理插件secret管理Docker安全service管理服务swarm 管理Swarm集群system管理Docker系统trust Manage trust on Docker images volume管理卷命令: attach将标准输入和标准输出连接到正在运行的容器build 使用dockerfile文件创建镜像commit从容器的修改项中创建新的镜像cp将容器的目录或文件复制到本地文件系统中create创建一个新的镜像diff 检查容器文件系统的修改events实时输出docker服务器中发生的事件exec 从外部运行容器内部的命令export将容器的文件系统到处为tat文件包history显示镜像的历史images输出镜像列表import从压缩为tar文件的文件系统中创建镜像info 显示当前系统信息、docker容器与镜像个数、设置信息等inspect使用JSON格式显示容器与镜像的详细信息kill 向容器发送kill信号关闭容器load 从tar文件或标准输入中加载镜像login 登录docker注册服务器logout退出docker注册服务器logs 输出容器日志信息pause 暂停容器中正在运行的所有进程port 查看容器的端口是否处于开放状态ps输出容器列表pull 从注册服务器中拉取一个镜像或仓库push 将镜像推送到docker注册服务器rename重命名一个容器restart重启一个或多个容器rm删除一个或多个容器,若没有指定标签则删除lastest标签。rmi 删除一个或多个镜像,若没有指定标签则删除lastest标签。 run 在一个新容器中中运行命令,用于指定镜像创建容器。save 将一个或多个镜像保存为tar包 search从Docker Hub中搜索镜像start 启动一个或多个已经停止的容器stats Display a live stream of container(s) resource usage statistics stop 停止一个或多个正在运行的容器tag 设置镜像标签top 显示容器中正在运行的进程信息unpause重启pause命令暂停的容器update更新一个或多个容器的配置version显示docker版本信息wait 等待容器终止然后输出退出码