文章目录
笔记来源:kuangstudy视频学习
学习链接
docker
1. docker安装-基于centOS
安装docker
- docker官方安装手册参考
- 根据官方文档要求,确认你是centos7以上系统
- yum安装gcc相关环境(需要确保 虚拟机可以上外网 )
yum -y install gcc
yum -y install gcc-c++
- 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装需要的软件包
yum install -y yum-utils
- 设置镜像仓库
# 错误
yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo
## 报错
[Errno 14] curl#35 - TCP connection reset by peer
[Errno 12] curl#35 - Timeout
# 正确推荐使用国内的
yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/
linux/centos/docker-ce.repo
- 更新yum软件包索引
yum makecache fast
- 安装docker CE
# docker ce 社区版 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
- 启动docker
systemctl start docker
# 启动之后
docker version # 查看是否安装成功
- 测试命令
docker run hello-world # 运行hello-world镜像
docker images # 查看本机镜像
- 卸载
# 停止docker服务
systemctl stop docker
# 卸载依赖
yum -y remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的工作路径
阿里云镜像加速
- 登录阿里云找到容器镜像服务
- 点击镜像加速器
- 配置使用
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://***.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
2. run做了什么
底层原理
docker为什么比虚拟机快
1、docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在
docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在
效率上有明显优势。
2、docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机
一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建
一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主
机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。
3. Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docekr 命令 --help # 帮助命令
镜像命令
docker images
docker images # 查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 14 months ago 13.3kB
# 解释
REPOSITORY # 镜像的仓库源
TAG # 镜像的标签
IMAGE ID # 镜像的ID
CREATED # 镜像的创建时间
SIZE # 镜像的大小
# 可选项
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的id
docker search 搜索镜像
[root@izbp18quije14hodxrcq6rz ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used... 10575 [OK]
mariadb MariaDB Server is ... 3954 [OK]
mysql/mysql-server Optimized… 774 [OK]
# 可选项,通过收藏来过滤
--filter=STARS=3000 # 会去找寻stars大于3000的
docker pull 下载镜像
docker pull 镜像名[:tag]
docker pull mysql # 下载mysql镜像,默认下载最新
Using default tag: latest # 如果不写tag,默认latest,下载最新
latest: Pulling from library/mysql
a076a628af6f: Pull complete # 以下是docker images核心,分层下载 联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
# digest: 签名信息
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 等价于
docker pull mysql
docker pull docker.io.library.mysql:latest
# 指定版本下载
docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists
f6c208f3f991: Already exists
88a9455a9165: Already exists
406c9b8427c6: Already exists
7c88599c0b25: Already exists
25b5c6debdaf: Already exists
43a5816f1617: Already exists
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
docker rmi -f 镜像id # 按照镜像id删除
docker rmi -f 镜像id 镜像id 镜像id # 通过空格隔开可以同时删除多个镜像
docker rmi -f $(docker images -q) # 直接查询所有镜像id删除所有镜像
此外,也可以通过镜像名删除,一般通过镜像id删除
容器命令
说明:有了镜像才可以创建容器,linux,下载一个centOS镜像进行学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" # 容器名字 tomcat1,tomcat2
-d # 后台方式运行
-it # 使用交互式方式运行,进入容器查看内容
-p # 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-P # 随机指定端口
# 测试, 启动并进入容器
[root@izbp18quije14hodxrcq6rz ~]# docker run -it centos /bin/bash
[root@7f3508517c41 /]#
ls # 查看容器内的centos,基础版本,很多命令都不完善
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器中退回主机
[root@7f3508517c41 /]# exit
exit
[root@izbp18quije14hodxrcq6rz ~]# ls /
bin boot data dev etc home lib lib64 lost+found media mnt opt patch proc root run sbin srv sys tmp usr var www
列出所有运行中的容器
docker ps
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 按个数显示最近创建的容器
-q # 只显示容器的编号
[root@izbp18quije14hodxrcq6rz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@izbp18quije14hodxrcq6rz ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f3508517c41 centos "/bin/bash" 5 minutes ago Exited (0) 2 minutes ago goofy_nightingale
9c231446c156 bf756fb1ae65 "/hello" 46 minutes ago Exited (0) 46 minutes ago great_bell
f482b40eb8fe bf756fb1ae65 "/hello" 23 hours ago Exited (0) 23 hours ago stoic_kirch
[root@izbp18quije14hodxrcq6rz ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f3508517c41 centos "/bin/bash" 8 minutes ago Exited (0) 5 minutes ago goofy_nightingale
[root@izbp18quije14hodxrcq6rz ~]# docker ps -aq
7f3508517c41
9c231446c156
f482b40eb8fe
退出容器
exit # 直接停止容器并退出
ctrl + p + q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的,如果要,rm -f 强制删除
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器(管道操作)
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前的容器
常用的其他命令
后台启动容器
# 命令
docker run -d 镜像名
docker run -d centos
# 通过docker ps发现问题,后台启动的centos停止了
# 常见的坑,docker 容器使用后台运行,就必须要有前台进程,docker发现前台没有应用,就会自动停止后台了
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail # 容器,没有日志
# 自己编写一段shell脚本
docker run -d centos /bin/sh -c "while true; do echo dashuaibi; sleep 1;done"
[root@izbp18quije14hodxrcq6rz ~]# docker ps
CONTAINER ID IMAGE
397810e44131 centos
# 显示日志
-tf # 显示日志
--tail number # 要显示的日志条数
docker logs -tf --tail 10 397810e44131
查看容器中的进程信息
top
[root@izbp18quije14hodxrcq6rz ~]# docker top 397810e44131
UID PID PPID C STIME TTY TIME CMD
root 29590 29554 0 00:14 ? 00:00:00 /bin/sh -c while true...
root 30547 29590 0 00:20 ? 00:00:00 /usr/bin/coreutils...
查看镜像的元数据
docker inspect 容器id
[root@izbp18quije14hodxrcq6rz ~]# docker inspect 397810e44131
[
# ...具体信息自行查看...
]
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
# 方式1
docker exec -it 容器id bashshell
[root@izbp18quije14hodxrcq6rz ~]# docker exec -it 397810e44131 /bin/bash
[root@397810e44131 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:14 ? 00:00:00 /bin/sh -c while true; do echo dashuaibi; sleep 1;done
root 789 0 0 16:28 pts/0 00:00:00 /bin/bash
root 812 1 0 16:28 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 813 789 0 16:28 pts/0 00:00:00 ps -ef
# 方式2
docker attach 容器id
# 测试
[root@izbp18quije14hodxrcq6rz ~]# docker attach 397810e44131
正在执行当前容器代码...
# 区别
# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的地主机路径
# 测试
# 进入docker容器内部
[root@izbp18quije14hodxrcq6rz zhangtong]# docker attach 39599f4029b9
# 在home目录创建test.java
[root@39599f4029b9 home]# touch /home/test.java
# exit 退出容器
[root@39599f4029b9 home]# exit
# 在主机执行复制操作
[root@izbp18quije14hodxrcq6rz zhangtong]# docker cp 39599f4029b9:/home/test.java /home
# 进入home目录查看文件是否存在
[root@izbp18quije14hodxrcq6rz zhangtong]# cd /home
[root@izbp18quije14hodxrcq6rz home]# ls
test.java
# 成功复制test.java到home目录
# 拷贝是一个手动的过程, 以后可以使用 -v卷的技术,可是实现
小结
常用命令
4. 练习
1. nginx安装
# 1. 搜索镜像,nginx
docker search nginx # 或者去docker搜索
# 2. 拉取镜像
docker pull nginx
# 3. 启动nginx
# 后台运行nginx,起名nginx01 开放端口3500,映射服务器内部80端口
docker run -d --name nginx01 -p 3500:80 nginx
# 4. 查询容器
docker ps
# 5. 运行测试
curl localhost:3500 # 回显welcome to nginx
端口解析
思考问题:每次改动nginx配置文件,都必须进入容器内部吗?
要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?
-v 数据卷方式
2. tomcat安装
# 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到
docker run -it --rm tomcat:9.0 容器停止运行后会删除容器
# 按照我们的逻辑,先下载在启动
docker pull tomcat:9.0
# 启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 测试访问没问题,但是404
# 进入容器
docker exec -it tomcat01 /bin/bash
# 发现问题:1. linux命令少了;2.没有webapps
# 原因:阿里云镜像的原因,默认是最小的镜像,所有不必要的东西都被剔除
# 保证最小可运行的环境
思考问题:以后要部署项目,如果每次都要进入容器是不是十分麻烦?
要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了
如果删除docker,tomcat就没了? 如果以后部署mysql呢,删了docker,mysql的内容也没了?删库跑路?
3. 部署ES+Kibana
# es 暴露的端口很多
# es 十分的耗内存
# es 的数据一般需要放置在安全目录,挂载
# 下载启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 启动了 linux就卡住了
docker stats # 查看cpu的状态
# 重启服务器
# 增加内存限制
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xms512m" elasticsearch:7.6.2
内部容器的交互
5. docker 可视化
- portainer
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- rancher
什么是portainer?
docker图形化界面管理界面!提供一个后台面板供我们操作!
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:ip:8088
6. 镜像相关
镜像是什么
镜像就是服务+环境打包的一个东西。
镜像加载原理
分层理解
commit镜像
docker commit # 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名[:tag]
实战测试
# 启动一个默认的tomcat
# 发现这个tomcat的webapps里面没有内容,这是因为官方镜像默认的
# 我自己拷贝进去了内容
# 将操作过的容器通过commit提交为一个新的镜像,以后就可以使用修改后的镜像即可
docker commit -a="zhangtong" -m="add webapps app" bb4c006ed616 mytomcat:1.0
如果想保存当前容器的状态,就可以通过 commit来提交,获得一个镜像