docker学习

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值