虚拟机技术 vs Docker
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,在这之上安装运行软件
- 容器的应用直接运行在宿主内,没有自己的内核,也没有虚拟我们的硬件,所以轻便了
- 每个容器相互隔离,每个容器内都有自己的文件系统
优点:
- 更快的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
- 便捷的升级和扩缩容
部署应用如同搭积木,项目打包成一个镜像,可以扩展到各个服务器
- 更简单的运维系统
在容器化之后,开发测试环境都是高度一致
- 更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多容器实例
名词解析
- 镜像(image):docker镜像好比一个模板,通过这个模板来创建容器服务,通过这个镜像可以创建多个容器
- 容器(Container):Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建的,可以理解为一个简易的linux
- 仓库(repository):存放镜像的地方,分为私有和公有仓库
- Docker Damon: dockerd,用来监听 Docker API 的请求和管理 Docker 对象,比如镜像、容器、网络和 Volume。
- Docker Client: docker client 是我们和 Docker 进行交互的最主要的方式方法,比如我们可以通过 docker run 命令来运行一个容器,然后我们的这个 client 会把命令发送给上面的 Dockerd,让他来做真正事情。
- Docker Registry:用来存储 Docker 镜像的仓库,Docker Hub 是 Docker 官方提供的一个公共仓库,而且 Docker 默认也是从 Docker Hub 上查找镜像的,当然你也可以很方便的运行一个私有仓库,当我们使用 docker pull 或者 docker run 命令时,就会从我们配置的 Docker 镜像仓库中去拉取镜像,使用 docker push 命令时,会将我们构建的镜像推送到对应的镜像仓库中。

安装
。。。。。。。
Docker常用命令
帮助命令
docker verison # 显示docker版本信息docker info # 显示docker系统信息docker 命令 --help # 帮助命令
镜像命令
查看主机上的镜像
#[root@izuf65mhum14tjzqrobqrsz ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEhello-world latest d1165f221234 2 months ago 13.3kB# 可选项-a, --all # 列出所有镜像-q, --quiet # 只列出镜像id
搜索容器
[root@izuf65mhum14tjzqrobqrsz ~]# docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 10842 [OK]mariadb MariaDB Server is a high performing open sou… 4091 [OK]mysql/mysql-server Optimized MySQL Server Docker images. Create… 800 [OK]# 可选项,通过搜索过滤--filter=STARS=3000 #START大于3000的
下载镜像
# 下载镜像 docker pull 镜像名 [:tag][root@izuf65mhum14tjzqrobqrsz ~]# docker pull mysqlUsing default tag: latest # 不写tag默认latestlatest: Pulling from library/mysqlf7ec5a41d630: Pull complete # 分层下载,docker image的核心,联合文件系统9444bb562699: Pull complete6a4207b96940: Pull complete181cefd361ce: Pull complete8a2090759d8a: Pull complete15f235e0d7ee: Pull completed870539cd9db: Pull complete493aaa84617a: Pull completebfc0e534fc78: Pull completefae20d253f9d: Pull complete9350664305b3: Pull completee47da95a5aab: Pull completeDigest: sha256:04ee7141256e83797ea4a84a4d31b1f1bc10111c8d1bc1879d52729ccd19e20aStatus: Downloaded newer image for mysql:latestdocker.io/library/mysql:latest # 真实地址
删除镜像
docker rmi -f 镜像id ... # 删除制定的镜像
docker rmi -f $(docker images -aq) # 删除全部的镜像
容器命令
说明:我们有了镜像才可以创建容器`docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数
--name="Name" # 容器名字
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
[root@izuf65mhum14tjzqrobqrsz ~]# docker run -it centos /bin/bash
[root@6b215ff1a432 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 退出
exit
Ctrl + P + Q # 容器不停止退出
列出所有的运行容器
docker ps # 列出当前正在运行的容器
docker ps -a # 列出当前正在运行的容器,带出历史运行过的容器
docker ps -n=? # 显示最近创建的容器
docker ps -q # 只显示容器编号
删除容器
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器,包括正在进行的
启动和停止容器
docker start 容器id # 启动容器
docker stop 容器id # 停止当前运行容器
docker restart 容器id # 重启容器
docker kill 容器id # 强制停止
常用其他命令
后台启动容器
# 命令 docker run -d 镜像名
docker run -d centos
发现centos停止
docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有就会停止
查看日志
[root@ ~]# docker run -d centos /bin/sh -c "while true; do echo helloWorld; sleep 1; done"
d8df7e2b197acf010c1e76b1f13c82a4b73f8411a510221678476ae58368331e
[root@ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8df7e2b197a centos "/bin/sh -c 'while t…" 6 seconds ago Up 6 seconds condescending_dirac
docker logs -t -f d8df7e2b197a
2021-05-09T15:16:56.213965958Z helloWorld
2021-05-09T15:16:57.217005415Z helloWorld
2021-05-09T15:16:58.220298597Z helloWorld
2021-05-09T15:16:59.223080338Z helloWorld
2021-05-09T15:17:00.225780271Z helloWorld
2021-05-09T15:17:01.228778258Z helloWorld
2021-05-09T15:17:02.232387663Z helloWorld
...
查看容器中的进程信息
# docker top 容器id
查看镜像的元素数据
# docker inspect 容器id
进入正在运行的容器
# 我们通常容器在后台方式运行,需要进入容器,修改一些配置
方式一:进入容器开始一个新的终端,可以在里面操作
# docker exec -it 容器id bashShell
docker exec -it dc48sdjlwq /bin/bash
方式二:进入容器正在执行的终端,不会启动新的进程
# docker attach 容器id
从容器上拷贝到主机上
docker cp 61d070035384:/home/hello.java /home/hqw/Documents/Java/
