docker是什么?先装个B
Build,Ship and Run Any App,Anywhere 一次封装,到处执行
安装docker
官方文档:https://docs.docker.com/engine/install/centos/
// 卸载旧版本docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
// 需要的安装包
sudo yum install -y yum-utils
// 设置镜像的仓库 阿里云的
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
// 更新软件包索引
sudo yum makecache fast
// 安装docker相关内容 docker-ce社区版 docker-ee企业版
sudo yum install docker-ce docker-ce-cli containerd.io
// 安装指定版本的docker
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
// 启动docker
sudo systemctl start docker
// 判断是否启动成功
docker version
// 老规矩 hello-world程序
docker run hello-world
到这一步,恭喜你!安装成功!
// 查看hello-world镜像
docker images
// 卸载docker 卸载依赖,删除目录
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
腾讯云加速镜像的配置
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
Run的流程
Docker底层原理
docker是怎么工作的?
docker是一个client-server结构的系统,docker的守护进程运行在主机上。
通过socket从客户端访问!
docker-server接受到docker-client的指令,就会执行这个命令!
docker为什么比vm快?
1.docker有着更少的抽象层
2.docker利用的是宿主机的内核,vm需要的是Guest os,所以说新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest os,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,是秒级的!
docker的常用命令
// 显示docker的版本信息
docker version
// 显示docker系统信息
docker info
// 查看所有命令
docker --help
镜像命令
// 查看所有镜像
docker images
#
repository 镜像的仓库源
tag 镜像的标签
image id 镜像id
created 镜像创建时间
size 镜像的大小
# 可选项
-a, --all 列出所有的镜像
-q, --quiet 只显示镜像的id
一般结合使用 docker images -aq
// 搜索命令
docker search
# 可选项
// 过滤stars小于3000的
--filter=stars=3000
// 下载镜像 docker pull 镜像名[:tag]
docker pull
// 删除镜像
docker rmi -f id
// 删除多个镜像
docker rmi -f id id id id
// 全部删除
docker rmi -f $(docker images -aq)
容器命令
说明:我们有了镜像才可以创建容器
// 新建容器并启动
docker pull centos
// 启动容器
docker run [可选参数] image
# 参数说明
--name="name" 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-P 随机指定端口
// 启动并进去容器
docker run -it centos /bin/bash
// 从容器中退出
exit 容器停止并退出
Ctrl + P + Q 容器不停止退出
// 列出所有的运行中容器
docker ps
# 参数
-a 列出当前正在运行的容器 + 历史运行过得容器
-n=? 显示最近创建的容器
-q 只显示容器的编号 docker ps -aq 显示所有容器的编号
// 删除容器
docker rm 容器id
// 删除所有的容器
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容器使用后台运行,就必须要一个前台进程,docker发现没有应用,就会自动停止;
nginx,容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序了
// 查看日志
docker logs -f -t --tail 1000f 镜像id
// 查看进程信息
docker top 容器id
// 查看容器元数据
docker inspect 容器id
进入容器的命令和拷贝的命令
# 我们通常都是使用后台方式运行的容器,需要进入容器,修改一些配置
# 命令
// 进入容器
// 方式一
docker exec -it 容器id /bin/bash
// 方式二
docker attach 容器id
区别: exec常用,进入容器后开启一个新的终端,可以再里面操作
attach不会启动新的进程
// 从容器内拷贝文件到主机上
docker cp 容器id:容器内的路径 目的主机的路径
小结
练习:
docker安装nginx
1.docker search
2.docker pull nginx
3.运行测试
docker images
# -d 后台运行 --name取别名 -p 3344机器端口 80容器端口
docker run -d --name nginx01 -p 3344:80 nginx
# 测试是否成功
curl localhost:3344
端口暴露的概念:
安装tomcat
// 用完即删除
docker run -it --rm tomcat:9.0
// 下载
docker pull tomcat
// 跑项目
docker run -d -p 3355:8080 --name tomcat01 tomcat
// 问题:访问是404
// 进容器看一下
docker exec -it tomcat01 /bin/bash
// 因为linux命令少了;没有webapps
// 测试的话可以把webapps.dist 文件全部复制到webapps就可以
部署es + kibana
# es暴露的端口很多
# es十分的耗内存
# es的数据一般需要放置到安全目录!挂载
// 启动
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
// 问题启动了,linux卡的要死要死的...
// 看cpu的状态
docker stats
// 解决方案:增加内存的限制
-e 环境参数修改
docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
网络部分
使用kibana连接es
可视化面板
portainer(先用这个)
Rancher(CI/CD再用)
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
// 访问测试:外网:8000
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[tag]
// commit修改过的tomcat
docker commit -a="vito" -m="add webapps" 4b084d56493a tomcat02
容器数据卷
如果数据在容器中,那么容器被删除后,数据就丢失了!
所以:我们需要数据持久化
需求:容器之间可以由一个数据共享的技术!docker中产生的数据,同步到本地!
容器数据卷: 将容器内的目录,挂载到linux上面
当然,容器间也是可以数据共享的
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录 -p 主机端口:容器端口
// 测试
docker run -it -v /home/ceshi:/home centos /bin/bash
// 查看是否挂载成功 在Mounts字段中查看
docker inspect id
测试具体效果
实战:部署mysql
// 下载
docker pull mysql:5.7
// 注意点:一定要设置密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your-password --name mysql01 mysql:5.7
测试连接
本地创建数据库,查看映射文件是否ok
具名挂载和匿名挂载
# 匿名挂载
-v 容器内路径!
docker run -d -p --name nginx02 -v /etc/nginx nginx
# 具名挂载
docker run -d -p --name nginx02 -v name:/etc/nginx nginx
# 查看具体挂载位置
docker volumn inspect name
# 所有的卷没有指定目录的话都会挂载在/var/lib/docker/volumn/xxx/data
设置读写权限
docker run -d -p --name nginx02 -v name:/etc/nginx nginx:ro 或者rw
ro read only (路径只能通过宿主机来操作,容器内容是不可以操作的)
rw read write (默认)
DockerFile
dockerFile:就是用来构建docker镜像的构建文件,命令脚本,启动执行即可,通过这个脚本可以生成镜像
# 测试
// vim dockerfile 1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
CMD /bin/bash
// 执行
docker build -f /home/docker-test-volumn/dockerfile1 -t vito/centos:1.0 .
查看构造的镜像
# 启动自己生成的容器
docker run -it c3c9ef88c226 /bin/bash
这个目录就是我们生成镜像的时候自动挂载的,也就是我们的数据卷目录,一定和外部有一个同步的目录!!!
VOLUME [‘test1’,‘test2’] ----> 匿名挂载
数据卷容器
多个mysql同步数据
# 启动三个容器,通过我们自己写的镜像启动
docker run -it --name docker01 vito/centos:1.0
// docker01创建的目录挂载到了docker02上面
# --volumes-from
docker run -it --name docker02 --volumes-from docker01 vito/centos:1.0
# 创建docker3
docker run -it --name docker03 --volumes-from docker01 vito/centos:1.0
结论:数据卷的生命周期一直持续到没有容器为止
一旦持久化到了本地,那么数据就不会被删除了!
dockerFile详解
在docker hub中搜索一下centos的镜像
# 官方实例
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
dockerFile构建过程
指令
# FROM 基础镜像
# MAINTAINER 镜像是谁写的 姓名+邮箱
# RUN docker镜像构建的时候需要运行的命令
# ADD 步骤,tomcat镜像压缩包等。。。添加的内容
# WORKDIR 镜像的工作目录
# VOLUME 设置挂载卷
# EXPOSE 对外指定端口
# CMD 指定这个容器启动的时候要运行的命令 bin/bash等
# ENTRYPOINT 可以直接追加命令,cmd只有最后一个会生效
# ONBULID 当构建一个被继承 dockerFile 这个时候就会运行onbuild指令
# COPY 类似add指令,复制
# ENV 构建时候设置环境变量
练习:构建一个自己的centos
docker hub 百分之99的镜像都是从FROM scratch过来的,然后配置需要的软件和配置来进行构建
# 1.编写dockerfile文件
FROM centos
MAINTAINER vito<2031647829@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
# 2.构建镜像
docker build -f dockerCentos -t mycentos:0.1 .
# 3.测试运行
docker images
实战:tomcat镜像
// 准备镜像文件 tomcat压缩包,jdk的压缩包
// 编写dockerFile文件
# 命名用官方可以省略-f Dockerfile
// Dockerfile
FROM centos
MAINTAINER vito<2031647829@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u60-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.40.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.40
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.40
ENV PATH $PATH:$JAVA_HOME/bin:CATALINA_HOME/lib:CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.40/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.40/bin/logs/catalina.out
// step2
docker build -t diytomcat .
# docker images
docker run -d -p 9090:8080 --name diytomcat -v /home/vito/tomcat/test:/usr/local/apache-tomcat-9.0.40/webapps/test -v /home/vito/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.40/logs diytomcat
# 进入容器
docker exec -it id /bin/bash
发布镜像
docker hub 中
1.注册账号
2.登录
docker login -u username
3.发布
docker push name:version
4.添加tag
docker tag id othername
docker push othername
小节
Docker 网络
理解docker0
docker会给创建的容器自动分配网卡 evth-pair技术 成对出现
本地可以ping通容器
查看地址 ip addr
查看容器的 docker exec -it name ip addr
结论:docker01和docker02是公用的一个路由器:docker0
所有的容器不指定网络的情况下, 都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
# --link解决网络连通问题
ocker exec -it tomcat13 ping tomcat12
# 13可以ping通12,但是12ping13不行
docker network ls
// 查看详情
docker network inspect containerid
自定义网络
网络模式
bridge:桥接 docker默认
none:不配置网络
host:和宿主机共享网络
测试
# 创建
# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# docker network ls
用自定义的网络创建的容器
好处:解决了docker0的缺陷,不同的集群使用不同的网络,保证集群的健康
docker exec -it tomcat-net-01 ping tomcat-net-02 就可以ping通了
网络连通的操作
# connect
# 测试打通tomcat01 -> mynet
docker network connect mynet tomcat01
实战:Redis集群部署(分片+高可用+负载均衡)
docker network create redis --subnet 172.38.0.0/16
docker network ls
#NETWORK ID NAME DRIVER SCOPE
047b3b360fd5 bridge bridge local
14397616fd18 host host local
65c6f4b08ebf mynet bridge local
d3ac1503fb1f none null local
8641b8ac22e5 redis bridge local
# shell脚本创建6个redis
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 开启服务 举一个例子,剩下的6372,16372,redis-2,node-2,172.38.0.12 ......
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 进入一个redis
docker exec -it redis-1 /bin/sh
# 创建集群的配置
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
ok,玩一下
set a b 之后停掉容器,测试get a发现就是可以的,ok 实现
Docker进阶
docker-compose:轻松高效的管理容器,通过编写yaml文件定义运行多个容器。
安装
# 一定要换成国内的镜像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 权限
sudo chmod +x docker-compose
# 查看是否安装成功docker-compose -version
docker-compose初体验
官方实例
https://docs.docker.com/compose/gettingstarted/
步骤:
1.应用 app.py
2.Dockerfile 应用打包为影响
3.Docker-compose yaml文件 定义整个服务,需要的环境
4.启动compose项目 docker-compose up
5.停止服务:在当前文件夹下 docker-compose down
yaml规则
# 3层
1.version : 版本
2.services : 服务
服务1: web
# 配置规则
images
build
network
...
3.其他配置 #网络/卷 全局规则
volumes
networks
configs