Docker能干什么?
虚拟机技术:
- 资源占用十分多
- 冗余步骤多
- 启动很慢
容器化技术:
不是模拟的一个完整的操作系统,每一个项目可以和自己的运行环境打包形成一个镜像,每个容器之间互相隔离,互不影响。
比较docker和虚拟机的不同
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机,容i去没有自己的内核,也没有虚拟机的硬件,所有更加轻便
- 每个容器都是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响
Docker安装
Docker的基本组成
镜像(image) :
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务
通过镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器( container) :
Docker利用容器技术,独立运行一个或者一 个组应用,通过镜像来创建的。
目前就可以把这个容器理解为就是一个简易的linux系统
仓库( repository) :
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub (默认是国外的)
阿里云...都有容器服务器(配置镜像加速! )
卸载旧版本
shell
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
需要的安装包
shell
yum install -y yum-utils
设置镜像的仓库
shell
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #默认是从国外,速度非常慢!
# 推荐使用阿里云镜像:
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker相关的
docker-ce:社区版的;docker-ee:企业版
shell
yum install docker-ce docker-ce-cli containerd.io
启动docker
systemctl start docker
查看docker版本,判断是否安装成功
docker version
测试hello world
docker run hello-world
查看一下下载的这个 hello-world镜像
shell
[root@iZf8z7tecpe8xbz6kq9e3eZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 2 years ago 13.3kB
卸载docker
shell
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
DockerServer接受到Docker-Client的指令,就会执行这个命令!
Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- Docker利用的是宿主机的内核,vm需要的是Guest OS。
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导性的操作。
虚拟机是加载Guest OS,而docker是利用宿主机的操作系统,省略了这个复杂的过程。
Docker常用命令
shell
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令--he1p #帮助命令
镜像命令
shell
docker images查看所有本地的主机上的镜像
[root@kuangshen /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf7 56fb1ae65 4 months ago 13.3kB
#解释
REPOSI TORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a,--a11 #列出所有镜像
q,--quiet #只显示镜像的id
docker搜索镜像
shell
[root@kuangshen /]# docker search mysq1
删除镜像
shell
docker rmi -f 容器id # 删除指定镜像
docker rmi -f 容器id 容器id 容器id 容器id# 删除多个镜像
docker rmi -f $(docker images -aq) # 删除全部的镜像
容器命令
说明:我们有了镜像才可以创建容器,linux下载一个centos镜像来测试学习
shell
docker pull centos
新建容器并启动
shell
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字
--d 后台运行方式
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p主机端口:容器端口(常用)
-p容器端口
容器端口
-P 随即指定端口
常用其他命令
后台启动容器
shell
#命令 docker run -d 镜像名
[root@iZf8z7tecpe8xbz6kq9e3eZ ~]# docker run -d centos
#问题docker ps.发现centos停止了
#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
查看日志
shell
docker logs -f -t --tail
#显示日志
-tf #显示日志
--tail number #要显示的日志条数
[root@iZf8z7tecpe8xbz6kq9e3eZ ~]# docker logs -tf --tail 10 5d39721d830c
查看容器中进程信息
shell
#命令 docker top 容器id
[root@iZf8z7tecpe8xbz6kq9e3eZ ~]# docker top 5d39721d830c
UID PID PPID C STIME
root 1355461 1355441 0 Aug23
101 1355507 1355461 0 Aug23
查看镜像的元数据
shell
# 命令
docker inspect 容器id
进入当前正在运行的容器
shell
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
#命令
docker exec -it 容器id bashShell
#测试
[root@iZf8z7tecpe8xbz6kq9e3eZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d39721d830c nginx "/docker-entrypoint...." 11 days ago Up 11 days 0.0.0.0:888->80/tcp, :::888->80/tcp nginx
[root@iZf8z7tecpe8xbz6kq9e3eZ ~]# docker exec -it 5d39721d830c /bin/bash
root@5d39721d830c:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var www
#方式二
docker attach 容器id
#测试
[root@iZf8z7tecpe8xbz6kq9e3eZ ~]# docker attach 5d39721d830c
正在执行当前的代码...
#区别
#docker exec #进入容器后开启一个新的终端,可以在里面操作
#docker attach #进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
shell
docker cp 容器id:容器内路径 目的的主机路径
部署Nginx
拉取nginx镜像
shell
# docker pull nginx
查看是否拉取成功
shell
# docker images
启动nginx(通过公网的3344端口可以访问到容器内部的80端口)
shell
# docker run -d --name nginx的名字 -p 8080(对于服务器web的端口号):80(容器内部的地址,默认80)