1. Docker概述
1.1 Docker为很么会出现
一套产品:开发–上线 两套环境!应用环境, 应用配置! 开发–运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大? 环境配置是十分麻烦的,每一个机器都要部署环境(集群redis,ES,Hadoop…)!费时费力 发布一个项目(jar+(redis mysql jdk es)),项目能不能都带上环境安装打包! 之前在服务器配置一个应用的环境,redis mysql jdk es hadoop,配置超麻烦了,不能跨平台。 windows,最后发布到Linux!
传统:开发jar,运维来做! 现在:开发打包部署上线,一套流程昨晚!
java – apk – 发布(应用商店)-- 张三使用apk – 安装即可用 java – jar(环境) – 打包项目带上环境(镜像)-- (docker仓库:商店)-- 下载我们发布的镜像 – 运行即可
docker给以上的问题,提出了解决方案! dokcer的思想来源于集装箱!
JRE – 多个应用(端口冲突)-- 原来都是交叉的! 隔离:docker 核心思想!打包装箱!每个箱子都是互相隔离的。 水果 生化武器 docker通过隔离机制,可以将服务器利用到极致!
本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习!
1.2 Docker的历史
Docker是基于Go语言开发的!开源项目! 官网:https://www.docker.com/ 文档地址:https://docs.docker.com/ Docker的文档是超级详细的! 仓库地址:https://hub.docker.com
简介
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。官网:https://docs.docker.com/
1.3 Docker能干嘛
之前的虚拟机技术
虚拟机技术缺点:
1.资源占用十分多 2. 冗余步骤多 3. 启动很慢
容器化技术
容器化技术不是模拟的一个完整的操作系统 比较docker和虚拟机技术的不同
2. Docker 安装
2.1 Docker的基本组成
2.2 安装Docker
环境准备
1、需要会一点点的Linux的基础 2、Centos7 3、我们使用xshell连接远程服务器进行操作
环境查看
查看系统内核
uname -r
系统版本
cat /etc/os-release
安装
官网安装地址:https://docs.docker.com/engine/install/centos/
非root权限,命令前加sudo 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 #国外的地址(下载慢)
# 设置阿里云的Docker镜像仓库(使用这个)
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国内的地址
更新yum软件包索引
yum makecache fast
4. 安装docker docker-ce 社区版 ee企业版
yum install docker-ce docker-ce-cli containerd.io
5.启动docker
systemctl start docker
开机自启动
systemctl enable docker
6.使用docker version查看是否安装成功 7.下载hello-world镜像测试
docker run hello-world
此命令下载测试映像并在容器中运行它。 8.查看一下下载的hello-world镜像
docker images
2.3 卸载docker
1.卸载 Docker Engine、CLI 和 Containerd 包
yum remove docker-ce docker-ce-cli containerd.io
2.删除资源
rm -rf /var/ib/docker
/var/ib/docker docker的默认工作路径
2.4 阿里云镜像加速
进入阿里云,搜索容器镜像服务 执行下面四条命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5aleeac1.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
回顾hello-world流程
2.5 容器运行流程图
2.6 底层原理
Docker是怎么工作的? Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!DockerServer接收到Docker-Client的指令,就会执行这个指令! Docker为什么比VM快? 1、Docker有着比虚拟机更少的抽象层。
2、docker利用的是宿主机的内核,VM需要的是Guest OS。 所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了复杂的过程,秒级。
3. docker的常用命令
帮助命令
docker version # docker版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令,(可查看某个命令的可选参数)
命令帮助文档的地址:https://docs.docker.com/engine/reference/commandline/docker/
3.1 镜像命令
3.1.1 查看所有本地的主机上的镜像
docker images
docker images
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
MAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a, --all Show all images (default hides intermediate images)
显示所有镜像(默认隐藏中间镜像)
--digests Show digests
显示摘要
-f, --filter filter Filter output based on conditions provided
根据所提供的条件过滤输出
--format string Pretty-print images using a Go template
格式化输出
--no-trunc Don't truncate output
不间断输出
-q, --quiet Only show image IDs
只显示镜像id
常用 -a -q 可同时使用 -aq
3.1.2 镜像搜索
docker search 镜像名:[tag]
可以在https://hub.docker.com上直接搜索 这是docker镜像的仓库,开发者将自己的镜像发布到仓库供他人使用,相当于github 也可以使用命令搜索
docker search mysql
可以看到搜出一堆,STARS类似于github上的star 通过help可以看到有个–filter的可选项 我们可以通--filter=STARS=3000 条件过滤出STARS大于3000的
可选项,通过STARS来过滤
--filter=STARS=3000 # 搜索出来的镜像就是STARS大于3000的
3.1.3 镜像下载
下载镜像 docker pull 镜像名:[tag]
docker pull mysql
如果不写tag,默认就是latest 上面多个pull complete,意思是分层下载, docker images的核心 ;联合文件系统
这是签名,防伪
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 #
docker.io/library/mysql:latest # 这是镜像的真实地址
docker pull mysql等价于docker pull docker.io/library/mysql:latest
下载mysql指定版本
docker pull mysql:5.7
可以看到,只有四个pull complete ,其余的在上个命令已经下载了,这就是分层下载的好处。共用,节省内存
3.1.4 镜像删除
删除镜像可以通过镜像名和镜像id 先查看有哪些镜像
docker iamges
通过镜像id删除mysql5.7
docker rmi -f c20987f18b13
i表示镜像,-f表示强制删除 可以看到只删除刚刚下载的,并没有删除mysql:lastet版本下载的内容
删除所有镜像
docker rmi -f $(docker images -aq)
3.2 容器命令
知识
docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,
只需要使用命令docker start 即可。
docker run相当于执行了两步操作:将镜像放入容器中(docker create),
然后将容器启动,使之变成运行时容器(docker start)。
而docker start的作用是,重新启动已存在的镜像。也就是说,
如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,
我们可以使用docker ps找到这个容器的信息。
说明:我们有了镜像才可以创建容器,下载一个centos镜像来测试学习 下载一个centos镜像
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
四种方式
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
3.2.1 run运行容器
docker run [可选参数] 容器名
运行centos
docker run -it centos /bin/bash
docker run -it centos 的意思是,为centos这个镜像创建一个容器
-it就等于 -i和-t,这两个参数的作用是,为该docker创建一个伪终端,
这样就可以进入到容器的交互模式(也就是直接进入到容器里面)
后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,
要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash。
查看容器内的centos ls
3.2.2 退出容器
exit #容器停止并退出(后台方式运行则仅退出)
ctrl + P + Q # 容器不停止并退出
3.2.3 列出所有运行的容器
列出所用正在运行的容器
-a 列出所用正在运行的容器+带出历史运行过的容器
-n=? 显示最近创建的容器
-q 只显示容器的编号
[root@cent /]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@cent /]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e191afc47d3 centos "/bin/bash" 10 minutes ago Exited (0) 4 minutes ago serene_sinoussi
[root@cent /]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e191afc47d3 centos "/bin/bash" 13 minutes ago Exited (0) 7 minutes ago serene_sinoussi
[root@cent /]
3e191afc47d3
[root@cent /]
3.2.4 删除容器
docker rm 容器id
docker rm -f 容器id
docker rm -f $(docker ps -aq)
docker ps -aq | xargs docker rm
3.2.5 启动和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
3.3 其他常用命令
3.3.1 后台启动容器
# 命令
docker run -d 镜像名
[root@cent /]# docker run -d centos
ea6d34da80894ac40d4b0258f511145c13a34a7e283daabe5f3b4824f4f34330
# 问题 docker ps ,发现centos停止了
# 常见的坑,docker 容器使用后台运行,就必须有一个前台进程,docker如果发现没有应用,就会自动停止
# nginx 容器启动后,发现自己没有提供服务,就会自动停止,就是没有程序了
3.3.2 查看日志
# 命令
docker logs -f -t --tail 10 容器id
发现没有日志
# 自己编写一段脚本 每隔一秒输出kuangshen
[root@cent /]# docker run -d centos /bin/bash -c "while true;do echo kuangshen;sleep 1;done"
ce52156179726c019f8037bfa7257ec6283c3587e8e77686ae2adaed71dfe3a0
[root@cent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce5215617972 centos "/bin/bash -c 'while…" 7 seconds ago Up 6 seconds youthful_chaplygin
[root@cent /]#
# 查看日志
-tf # 显示日志并显示时间戳
-tail number #要显示的日志条数
[root@cent /]# docker logs -tf --tail 10 ce5215617972
3.3.3 查看容器中进程信息
# 命令
docker top 容器id
[root@cent /]# docker top ce5215617972
UID PID PPID C STIME TTY TIME CMD
root 3451 3432 0 11:43 ? 00:00:00 /bin/bash -c while true;do echo kuangshen;sleep 1;done
root 4546 3451 0 12:00 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
3.3.4 查看容器的元数据
docker inspect 容器id
[root@cent /]
[
{
"Id": "ce52156179726c019f8037bfa7257ec6283c3587e8e77686ae2adaed71dfe3a0",
"Created": "2021-12-22T03:43:22.928043776Z",
"Path": "/bin/bash",
"Args": [
"-c",
"while true;do echo kuangshen;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 3451,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-12-22T03:43:23.521780276Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
省略。。。。。。。。。。。。。。
}
]
3.3.5 进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
################## 方式一
# 命令
docker exec -it 容器id /bin/bash
# 测试
[root@cent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce5215617972 centos "/bin/bash -c 'while…" 5 hours ago Up 5 hours youthful_chaplygin
[root@cent /]# docker exec -it ce5215617972 /bin/bash
[root@ce5215617972 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@ce5215617972 /]#
################## 方式二
# 命令
docker attach 容器id
# 测试
[root@ce5215617972 /]# exit
exit
[root@cent /]# docker attach ce5215617972
#######################################
# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程
3.3.6 容器内文件拷贝到主机上
# 命令
docker cp 容器id:容器内路径 目的主机路径
# 1.查看当前主机容器
[root@cent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce5215617972 centos "/bin/bash -c 'while…" 6 hours ago Up 6 hours youthful_chaplygin
# 2.进入docker容器内部,在home下创建文件
[root@cent /]# docker exec -it ce5215617972 /bin/bash
[root@ce5215617972 /]# cd /home
[root@ce5215617972 home]# touch test.java
[root@ce5215617972 home]# exit
exit
# 3.容器内文件拷贝到主机上
[root@cent /]# docker cp ce5215617972:/home/test.java /home
[root@cent /]# cd /home
[root@cent home]# ls
test.java
[root@cent home]#
小结
练习
Docker 安装Nginx
# 1、搜索镜像 docker search nginx 建议去dockerhub搜索,可以看到帮助文档
# 2、下载镜像 docker pull nginx
# 3、运行测试
# -d 后台运行
# --name 给容器取名
# -p 宿主机端口:容器内部端口
[root@cent home]
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6987c8d6ed5 31 hours ago 141MB
centos latest 5d0da3dc9764 3 months ago 231MB
[root@cent home]
feafe98a092e6c442f0c238243e0128b6dca994ca632e3a3a51943551d5aaef8
[root@cent home]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
feafe98a092e nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx01
ce5215617972 centos "/bin/bash -c 'while…" 6 hours ago Up 6 hours youthful_chaplygin
[root@cent home]
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@cent home]
[root@cent home]
root@feafe98a092e:/
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@feafe98a092e:/
root@feafe98a092e:/etc/nginx
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@feafe98a092e:/etc/nginx
root@feafe98a092e:/etc/nginx
exit
[root@cent home]
nginx01
[root@cent home]
端口暴露的概念 我用到外网的8080端口,如果要用别的端口,一是需要在安全组设置;二是防火墙设置该端口的访问或者关闭防火墙 浏览器访问 阿里云外网ip:8080
docker安装一个tomcat
# 官网的使用
docker run -it --rm tomcat:9.0
# 我我们之前的启动都是后台运行,停止了容器之后,使用docker ps -a 还是可以查的到停止运行的容器。但是docker run -it --rm ,是用完即删除(类似于删除历史访问记录),一般用来测试
# 1.下载镜像
docker pull tomcat
# 2.启动运行如果用别的端口进行映射例如,3344:8080 ,就需要去阿里云服务台设置安全组同时关闭防火墙
docker run -d -p 8080:8080 --name tomcat01 tomcat
# 3.访问阿里云ip:8080 测试访问没有问题,只是404,因为webapps里面啥也没有
# 4.进入容器
[root@cent home]# docker exec -it tomcat01 /bin/bash
root@d9c956a4d549:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
root@d9c956a4d549:/usr/local/tomcat# cd webapps
root@d9c956a4d549:/usr/local/tomcat/webapps# ls
root@d9c956a4d549:/usr/local/tomcat/webapps# cd ..
# 5.将webapps.dist下的所有文件复制到webapps目录下
root@d9c956a4d549:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@d9c956a4d549:/usr/local/tomcat#
6.再次访问访问阿里云ip:8080 ,可以看到那只猫
# 发现问题 1.linux 命令少了 2.没有webapps 。 阿里云镜像的原因,默认是最小的镜像,所有不必要的都被剔除掉了
# 包装最小可运行的环境
部署es+kibana
# es 暴露的端口很多!
# es 十分地耗内存
# es 的数据一般需要放置到安全目录!挂载
# --net somework ? 网络配置,暂时不用
# 启动 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的状态
# es是十分耗内存的 1.xG 我的服务器1核2G
# 查看 docker stats
# 增加内存限制 修改配置文件 -e 环境配置修改
# 1.正式启动
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 2.查看 docker stats
# 3.curl localhost:9200
测试一下es是否成功了
^C
[root@cent ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b60ad766823 elasticsearch:7.6.2 "/usr/local/bin/dock…" 4 minutes ago Up 4 minutes 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp elasticsearch
[root@cent ~]# curl localhost:9200
{
"name" : "7b60ad766823",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "OYMJGjzPRymdAGmvnub2UQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
[root@cent ~]#
3.3.7 docker可视化
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试 阿里云外网ip:8088
首次登陆需要设置密码 选择本地的
进入之后
4. docker 镜像
4.1 镜像是什么
4.2 镜像加载原理
UnionFS(联合文件系统)
Docker镜像加载原理
4.3 分层理解
分层的镜像 我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!
[root@cent ~]# docker image inspect redis:latest
[
{
"Id": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
"RepoTags": [
"redis:latest"
],
省略
}
]
理解
特点 Docker镜像都是可读的,当容器启动时,一个新的可写层被加载到镜像的顶部! 这一层就是我们通常说的容器层,容器之下的都叫镜像层!
如何提交一个自己的镜像
4.4 commit镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
实战测试
1.启动一个默认的tomcat
[root@cent ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 7614ae9453d1 26 hours ago 113MB
nginx latest f6987c8d6ed5 35 hours ago 141MB
tomcat latest 24207ccc9cce 13 days ago 680MB
centos latest 5d0da3dc9764 3 months ago 231MB
portainer/portainer latest 580c0e4e98b0 9 months ago 79.1MB
elasticsearch 7.6.2 f29a1ee41030 21 months ago 791MB
[root@cent ~]# docker run -it -p 8080:8080 tomcat
然后去访问ip:8080,发现404 2. 另起一个窗口进行查看,发现这个默认的tomcat 里webapps是空的,镜像的原因,官方的镜像默认webapps下面是没有文件的!
- 我们自己把webapps.dist下的文件拷贝到webapps下
[root@cent ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f013e9d7680 tomcat "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp distracted_turing
[root@cent ~]# docker exec -it 3f013e9d7680 /bin/bash
root@3f013e9d7680:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
root@3f013e9d7680:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@3f013e9d7680:/usr/local/tomcat#
4.将我们操作过的容器通过commit 提交为一个镜像!我们以后就可以用我们修改过的镜像tomcat02。以后启动就可以用docker run -it -p 8080:8080 tomcat:1.0
docker commit -a="wly" -m="add webapps app" 3f013e9d7680 tomcat02:1.0
如果你想保持当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比学习VM时,快照!
到了这里才是入门Docker! 狂神视频教程:https://www.bilibili.com/video/BV1og4y1q7M4
|