一、安装
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、设置镜像仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #国外地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云
4、更新yum软件包索引
yum makecache fast
5、安装docker docker-ce社区版(ee是企业版)
yum install docker-ce docker-ce-cli containerd.io
6、启动Docker
systemctl start docker
7、查看docker版本
docker version
8、执行第一个docker hello-word
docker run hello-world
9、查看下载的hello-world镜像
docker images
二、卸载Docker
1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2、删除资源
rm -rf /var/lib/docker #docker默认工作路径
rm -rf /var/lib/containerd
三、阿里云镜像加速
1、配置镜像地址
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://po1qcvly.mirror.aliyuncs.com"]
}
EOF
2、重置守护进程
sudo systemctl daemon-reload
3、重启Docker
sudo systemctl restart docker
四、Docker底层原理
Docker是一个C/S结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
Client-Server接收到Client-Client的指令,就会执行这个命令
1、Docker为什么比VM快
1)Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
2)Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
总结:新建一个容器的时候,Docker不需要向虚拟机一样重新加载一个操作系统内核,避免引导,虚拟机是加载Guest OS,分钟级别的而Docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级!
五、Docker常用命令
1、帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息 包括镜像和容器的数量
docker 命令 --help #万能命令
帮助文档地址:https://docs.docker.com/reference/
2、镜像命令
docker images 查看所有本地的主机上的镜像
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 4 months ago 13.3kB
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
-a, --all 列出所有的镜像
-q, --quiet 只显示镜像的Id
docker search 搜索镜像
#搜索mysql镜像
docker search mysql
#可选项,通过搜藏来过滤
--filter =stars=3000 #搜索出来的镜像就是stars大于3000
docker pull 下载镜像
#下载镜像
docker pull 镜像名[:tag]版本默认最新版
[root@localhost /]# docker pull mysql
docker pull mysql === docker pull docker.io/library/mysql:latest
#指定版本下载
[root@localhost /]# docker pull mysql:5.7
docker rmi 删除镜像
#删除指定ID镜像
docker rmi -f 镜像ID
#删除指定ID镜像 (多个)
docker rmi -f 镜像ID 镜像ID 镜像ID 镜像ID
#递归删除所有镜像
docker rmi -f $(docker images -aq) 意思是全部镜像的id
3、容器命令
注意:有了镜像才能 通过镜像创建容器
docker run [可选参数] image 新建容器并启动
docker run [可选参数] image
#参数说明
--name=“Name” 容器名称 tomcat01
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口
#测试 进入容器 ,启动以交互方式运行后面是操作控制台 一般Linux的在这个路径
[root@localhost /]# docker run -it centos /bin/bash
#查看容器内的centos基础版本很多命令都是不完善的 (centos里面创建centos并进入)
[root@1797b984e8ee /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器中退回到主机
[root@1797b984e8ee /] exit # exit
[root@localhost /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
docker ps 列出所有正在运行的容器
# docker ps 命令
空 # 列出当前正在运行的容器
-a # 列出当前正在运行的容器 随便带出历史的内容
-n=?# 显示最近创建的容器 ?后面是显示的个数
-q # 只显示容器的编号
#列出当前在运行的容器 (下面表示没有)
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#查看曾经运行过的容器
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAME
Se270f5d60b2c centos "/bin/bash --name=ba…" 5 minutes ago Exited (2) 5 minutes ago recursing_gagarin
b80479a9e9b3 centos "/bin/bash" 9 minutes ago Exited (0) 7 minutes ago strange_jemison
fb14b327581a d1165f221234 "/hello" 8 hours ago Exited (0) 8 hours ago eager_varahamihira
exit、Ctrl + P + Q 退出容器
#退出容器
exit #停止容器并退出容器
Ctrl + P + Q #只是退出容器,容器仍在运行
docker rm 删除容器
docker rm #容器id 删除指定容器
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q|xargs docker rm #删除所有容器
docker start、docker stop 启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启动容器
docker stop 容器id #停止当前正在运行动容器
docker kill 容器id #强制停止当前容器
其他命令
#通过命令
docker run -d 镜像名
[root@bogon /]# docker run -d centos
#问题 docker ps 时候发现 centos停止了
#常见的坑,docker 容器后台运行,就必须要有一个前台进程 docker发现没有命令就会停止
#nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
docker logs 查看日志
docker logs -f -t --tail 10 #容器id 没有日志
# 自己编写一段shell脚本
[root@bogon /]# docker run -d centos /bin/sh -c "while true;do echo Sxr;sleep 1;done"
[root@bogon /]# docker ps
PORTS NAMES
d5d5d925582f centos
#显示日志
-tf #显示日志 f带上时间
--tail number #要显示的日志条数
[root@bogon /]# docker logs -f -t --tail 10 d5d5d925582f
[root@bogon /]# docker logs -tf --tail 10 d5d5d925582f
docker top 查看容器中的进程信息ps
top命令
[root@bogon /]# docker top 容器id
UID PID PPID C STIME TTY TIME
root 3064 3044 0 09:37 ? 00:00:00
root 3117 3064 0 09:38 ? 00:00:00
docker inspect 查看进行的源数据
[root@bogon /]# docker inspect
docker exec 进入当前正在运行的容器
#我们通常容器都是使用后台方式运行的需要进入容器,修改一些配置
#命令
docker exec -it 容器id bashshell
# bashshell 操作 linux或者别的操作命令
#测试
[root@bogon /]# docker exec -it d5afb8e77654 /bin/bash
[root@d5afb8e77654 /]# ls
bin etc lib lost+found mnt proc run srv tmp vardev home lib64 media opt root sbin sys usr
[root@d5afb8e77654 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:37 ? 00:00:00 /bin/sh -c while true;d
root 1945 0 0 02:10 pts/0 00:00:00 /bin/bashroot 1976 1945 0 02:10 pts/0 00:00:00 ps -ef
root 1977 1 0 02:10 ? 00:00:00 /usr/bin/coreutils --co
#方式二
[root@bogon /]# 正在执行当前代码...
#docker exec :进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach :进入容器正在执行的终端,不会启动一个新的进程
docker cp 从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
[root@bogon /home]# docker cp 容器id:/容器路径 /主机路径
#测试
[root@bogon /home]# docker cp 24fe5f78c8af:/home/test.java /home/
//先在容器内创建文件或目录
[root@24fe5f78c8af home]#touch test.java
[root@24fe5f78c8af home]# lstest.java
Ctrl+p+q
[root@bogon /home]# docker cp 24fe5f78c8af:/home/test.java /home/
[root@bogon /home]# ls
Sxr.java test.java www yacon
[root@bogon /home]# rm -rf Sxr.java
[root@bogon /home]# ls
test.java www yacon
#拷贝是一个手动过程未来使用
-v 数据卷的技术,可以实现数据同步
六、操作实例
1、docker部署nginx
2、docker部署tomcat
3、docker部署es+kibana
# es 暴露的端口很多
# es 非常的耗内存
# es的数据一般要放置到安全目录:挂载
# --net somenetwork 网络配置
# 启动ES
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
#启动了 linux 就卡住了 docker stats 查看内存状态
# 测试一下es是否启动成功
curl localhost:9200
# 赶紧关闭,增加内存的限制
docker stop 容器id
# 修改配置文件 -e 环境配置修改(使用-e限制,最高512M)
docker run -d --name elasticsearch03 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 查看使用情况
docker stats 容器id