安装Docker
[root@localhost /]# cat /etc/os-release
#查看系统版本信息
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装
Install Docker Engine | Docker Documentation
#下载环境所需要的安装包
yum install -y yum-utils
#设置镜像仓库
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo#这个仓库是国外的,十分慢
#使用阿里云镜像地址
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#国内阿里云镜像地址
#安装docker引擎
yum install docker-ce docker-ce-cli containerd.io
#启动docker
systemctl start docker
#查看版本
docker version
#hello world
docker run hello-world
#卸载docker
#卸载引擎
yum remove docker-ce docker-ce-cli containerd.io
#清楚资源目录
rm -rf /var/lib/docker
配置阿里云镜像加速
#登录阿里云找到容器服务 每个人都不一样
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
------》
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://a7bcnywy.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker镜像命令
镜像相当于一个模板,就像java中的class一样
#查看镜像
docker images
#帮助命令
docker 命令 --help
#搜索镜像命令
docker search ..
#下载镜像
docker pull ..
docker pull 镜像名[tag版本]
#删除镜像
docker rmi -f 镜像名||镜像id
docker容器命令
容器:我们有了镜像之后才可以创建容器,容器就相当于对象,一个镜像可以创建出多个容器
docker run [可选参数] 镜像名字
#下载一个镜像
docker pull centos
#创建一个容器
docker run [可选参数] 镜像名字
#参数说明
--name 给容器取个名字
-d 后台运行
-it 使用交互的方式运行,进入容器查看内容
-P 将容器的端口和宿主机映射 -p 8080:8088 ,否则外部无法访问
-p 随机指定端口
#测试
启动并接入容器内部交互运行
[root@localhost ~]# docker run -it centos /bin/bash
[root@7f1d84721458 /]#
#退出容器到主机
exit
注意事项:
1、docker run -it --name rongqi cenos:7 /bin/bash 为交互式容器 ,exit 之后容器就会停止
2、通常使用 docker run -id --name rongqi1 cenos:7 为后台运行容器,exit后不会停止容器
3、进入容器:docker exec -it 容器名:版本号或者容器id
docker ps列出运行容器
#列出正在运行的容器
docker ps
#显示出正在运行的容器,也历史使用过的容器 ,up为正在运行的容器
docker ps -a
-n=? ?=1,2,3 显示最近创建的容器
#显示当前运行的容器的所有id
docker -ps -aq
docker rm 删除容器
#删除指定的容器
docker rm 容器id
#删除所有容器
docker rm -f $(docker ps -aq)
或者
docker rm `docker ps -aq`
docker start 、restart
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
数据卷映射 重要
Docker容器在删除之后,在容器中产生的数据也会被删除,为了避免这种情况,有了数据卷,就是宿主机的目录映射到容器的目录,宿主机和容器内的目录是同步的,多个容器可以绑定一个数据卷
数据卷的作用
1、容器数据持久化
2、外部机器和容器间接通信
3、容器之间数据交换
常用其他命令
#查看日志
docker logs -f --tail 容器
#写一段shell脚本
docker run -d centos /bin/bash -c"while true;do echo shilei;sleep 1;done"
#查看容器的进程
docker top 容器id
#查看镜像源数据 显示所有信息
docker inspect 容器id
#进入正在运行的容器
docker exec -it 容器id /bin/bash
或者可以通过docker attach
#从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
[root@localhost home]# docker cp eaebdd3cfa0e:/home/test.java /home
[root@localhost home]# ls
app app.tar.gz shilei.java test.java
[root@localhost home]#
docker部署nginx
------->
#下载镜像
docker pull nginx
#查看镜像是否存在
docker images
#启动容器
docker run -d --name nginx01 -p3344:80 nginx
#查看容器是否正在启动
docker ps
------
#本机测试访问 测试地址
curl localhost:3344
#进入容器
docker exec -it nginx01 /bin/bash
#找到nginx的配置文件
where is nginx
cd /etc/nginx
思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦
解决问题: 在容器外部提供一个映射路径,达到在容器外部修改文件名,容器内部就可以自动修改,用到的 -v数据卷
docker部署Tomcat
#简化版,一步到位 docker run 就可以帮我们自动下载镜像
#这里有个官方的坑,我们之前的启动都是后台,停止之后容器还在,用完即删,用于测试
docker run -it --rm tomcat
#不建议这样使用,按照我们的逻辑,先下载在使用
docker pull tomcat
docker run -d --name tomcat01 -p 3355:8080 tomcat
#测试访问
#如果在外网访问的话,没有界面,因为官方的tomcat是阉割版的,webapps目录是空的
#进入容器
docker exec -it tomcat01 /bin/bash
#进入tomcat目录 将webapps.dist 拷贝到webapp就能访问,或者改名字
cp -r webapps.dist/* webapps
#这样外部就可以访问了
思考问题: 如果每次部署项目,如果每次都进入容器是十分麻烦的,在外面映射 webapps,在外部放项目,就自动同步到内部就好了
解决问题:-v 数据卷
docker镜像原理(联合文件系统ufs 分层)
docker镜像是什么,镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含软件的所有东西,就是软件打包之后的轻量级软件包
所有的应用,直接打包docker镜像,就可以直接跑起来
如何得到镜像呢
第一种从远程仓库下载 ,别人拷贝给你 ,自己制作一个镜像DockerFile
UnionFS(联合文件系统)
UnionFS是一种分层,轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统之下,如下载一次,在下高版本的,存在的就可以不用下载啦,这就是联合文件系统节省内存。
docker的底层 bootfs,是共用的底层,系统加载完底层之后就删掉了,这就是为什么在docker里的镜像会很小的原因
rootfs很小,只包含了一些最基本的命令和类库,就可以啦,由此可见不同版本的rootfs是一样的,所以可以共用rootfs
分层 通过基础镜像层去床架,每层之间是没有冲突的。
制作镜像
如何提交自己的镜像
#容器改为镜像
docker commit 容器id 目标镜像名:版本号
#打包镜像压缩文件
docker save -o 压缩文件名称 镜像名称 :版本号
#加载镜像
docker load -i 压缩文件名称
容器数据卷
容器数据卷,在容器中产生的数据保存到本地,如果容器丢失,则不会造成数据丢失,这就是卷技术(目录挂载,容器内挂载到容器外)
方式一 命 令挂载
#使用数据卷
docker run -it -v 主机目录:容器目录
#目录挂载
docker run -it -v /home/ceshi:/home tomcat /bin/bash
#启动起来,查看容器信息,看是否挂载
docker inspect 容器id
实战测试(mysql)
#获取镜像
docker pull mysql
#创建容器 配置密码 目录挂载
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=123456 --name mysql01 mysql
#测试连接端口号nervcat
#这样就实现了数据库的持久化
多个mysql实现数据共享
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=123456 --name mysql01 mysql
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql
##这个时候就可以实现两个数据之间数据同步
具名和匿名挂载
#匿名挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx
#docker volume ls 查看所有的卷
docker volume ls
#会看到一堆数字,这就是挂载的目录
#具名挂载
docker run -d -p --name nginx02 -v juming_nginx:/etc/nginx nginx
#推荐使用具名挂载
#挂载
匿名 -v 容器内路径
具名 -v 卷名:容器内路径
指定路径挂载 -v 宿主机路径:容器内路径
拓展
#通过-v 容器内路径:ro rw 改变读写权限
ro 只读 rw 只写
docker run -d -p --name nginx02 -v juming_nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming_nginx:/etc/nginx:rw nginx
DockerFile制作镜像
构建的步骤
-
编写一个脚本文件
-
docker bulid 构建成为一个镜像
-
docker run 运行镜像
-
docker push 发布镜像(发布到DockerHub、阿里云镜像仓库!)
DockerFile是用来制作镜像
#自己创建镜像
#创建目录
mkdir docker-test-volume
#进入这个目录写脚本文件,通过这个脚本生成镜像
vi dockerfile1
--------------------------------------------------
FROM centos #镜像以centos为基础
VOLUME ["volume01","volume02"] #镜像挂载
CMD echo "--end--"
CMD /bin/bash #完毕之后打印---end--- 走的是bash
--------------------------------------------------
#构建镜像
docker bulid -f /home/docker-test-volume/dockerfile1 -t shilei/centos .
#查看自己的镜像
docker images
#dockerfile编写的命令
FROM #这个镜像的基础镜像是谁
MAINTAINER #镜像是谁写的 姓名+邮箱
ADD #步骤 tomcat镜像,这个tomcat压缩包就是要ADD的
WORKDIR #镜像的工作目录
VOLUME #挂载的位置
EXPOSE #暴露端口
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBULID #当构建的时候,就会触发这个指令
ENV #构建的时候设置环境目录
RUN #想让他干点啥
实战测试(Docker Hub中百分之九十九的镜像都是从整个基础镜像来的 FROM scratch)
#创建自己的centos
vi mycentos
-------------------------------------
FROM centos
MAINTAINER shilei<1483642069@qq.com>
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y insatll vim
RUN yum -y insatll net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "--end--"
CMD /bin/bash
------------------------------------
docker build
#tomcat 镜像 准备镜像文件 tomcat压缩包 jdk压缩包
---------------------------------------
FROM centos
MAINTAINER shilei<1483642069@qq.com>
COPY readme.txt /user/local/readme.txt
ADD jdk-8ull-linux-x64.tar.gz /user/local #加入jdk压缩包
ADD apache-tomcat-9.0.22.tar.gz /user/local #加入tomcat压缩包
RUN yum -y insatll vim #加入vim命令
ENV MYPATH /user/local #以下是tomcat和jdk的环境变量配置
WORKDIR $MYPATH
ENV JAVA_HOME /user/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /user/local/apache-tomcat-9.0.22
ENV CATALINA_BASE /user/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /user/local/apache-tomcat-9.0.22/bin/startup.sh&& tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out
-------------------------------------------
#构建镜像
docker build
#发布镜像 注册自己的账号
#先命令行登录
docker login -u 账号 -p 密码
docker push 镜像名
#发布到阿里云镜像仓库
#登录阿里云 找到镜像服务,创建命名空间,创建镜像仓库
docker login --username=122555 registry.cn-beijing.aliyuncs.com 输入密码登录成功
docker push
dockerfile是面向开发的,我们要发布项目,作镜像,就需要编写dockerfile文件,这个文件十分简单!Docker镜像已经成为企业交付的标准,开发 部署 运维
-
Dockerfile:构建文件,编写代码的步骤在这里
-
Docker 镜像:通过Dockerfile构建生成的镜像,最终发布和运行的产品
-
Dockerr 容器:容器就是镜像运行起来提供的服务器
Docker网络
理解docker网络,清空所有镜像
#查看地址
ip addr 看到几个网卡
问题:docker是如何处理容器网络访问的? 比如tomcat要访问数据库,要输什么呢
#启动tomcat
docker run -d -p --name tomcat01 tomcat
#进入容器找到网卡
docker exec -it tomcat01 ip addr
#发现docker会给容器分配一个地址enth,linux可以ping通容器内部,同一个网段是可以ping通的
#我们发现容器带来的网卡,都是一对对的
#evth-pair 就是一堆的虚拟接口设备,他们是承兑出席那,彼此相连,桥接模式,正式因为有这个,evth-pair充当一个桥梁,连接各种设备
#openStac,Docker,ovs容器之间的连接,都是使用的evth-pair技术
--link(容器连接)
#我们编写一个服务,项目不重启,而数据库的ip换掉了,怎么办,
#两个容器之间,不用通过地址和网络,直接ping通
docker run -d -p --name tomcat03 --link tomcat02 tomcat
#这样tomcat03可以ping通tomcat02,但是反向不可以
我们通常不使用docker网桥,我们自定义网络互联
#查看所有的docker网络
docker network ls
#网络模式
bridge :桥接 (docker默认)
none: 不配置网络
host: 和宿主机共享网络
container:容器网络连通
#我们直接启动的命令 --ner bridge 不写也是默认的
##自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
springboot打包docker镜像
#首先构建一个spring boot项目
Dockerflie
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
#写一个服务
Docker Compose
Dockers Compose 来轻松管理容器,定义发布多个容器,容器编排
官方介绍
可以使用yml文件配置你的应用服务,可以使用single command 命令有哪些
使用步骤
-
还是需要有dockerfile
-
写yml文件 docker-compose.yml
-
docker-compose up
自己理解
compose是官方的开源项目,需要安装,dockerfile让程序在任何地方运行,如果有个web服务,tomcat redis nginx。。。
安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#授权
sudo chmod +x /usr/local/bin/docker-compose
#查看安装成功
[root@localhost bin]# docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
docker-compose.yml 需要dockerFile做好所有镜像进行容器编排
示例 部署微服务docker compose
version: "3.8"
networks:
edu:
services:
# 定义服务名字,只要不冲突即可
gateway:
# 镜像名字
image: gateway:1.0
# 自定义容器名字
container_name: gateway
ports:
- "8222:8222"
# 网络模式
networks:
- edu
service_acl:
image: service_acl:1.0
container_name: service_acl
ports:
- "8009:8009"
networks:
- edu
service_cms:
image: service_cms:1.0
container_name: service_cms
ports:
- "8004:8004"
networks:
- edu
service_edu:
image: service_edu:1.0
container_name: service_edu
ports:
- "8001:8001"
networks:
- edu
service_msm:
image: service_msm:1.0
container_name: service_msm
ports:
- "8006:8006"
networks:
- edu
service_order:
image: service_order:1.0
container_name: service_order
ports:
- "8007:8007"
networks:
- edu
service_oss:
image: service_oss:1.0
container_name: service_oss
ports:
- "8002:8002"
networks:
- edu
service_statistics:
image: service_oss:1.0
container_name: service_statistics
ports:
- "8008:8008"
networks:
- edu
service_ucenter:
image: service_ucenter:1.0
container_name: service_ucenter
ports:
- "8160:8160"
networks:
- edu
service_vod:
image: service_vod:1.0
container_name: service_vod
ports:
- "8003:8003"
networks:
- edud
命令总结
#启动docker
systemctl start docker [stop restart]
#######镜像命令
#当前系统镜像列表
docker images
#拉取镜像
docker pull 镜像名[tag]
#删除镜像
docker rmi -f 镜像名||镜像id
#保存加载镜像
docker save 保存镜像jar
docker load 加载刚刚保存的jar
#搜索镜像
doucker search 镜像名
#######容器命令
#创建容器
docker run [可选参数] 镜像名字
--name 给容器取个名字
-d 后台运行
-it 使用交互的方式运行,进入容器查看内容
-P 将容器的端口和主机映射 -p 8080:8088
-p 随机指定端口
-v 主机目录:容器目录
#查看挂载详情
docker inspect 容器id
#进入容器
docker exec -it 容器id /bin/bash
#查看日志
#查看日志
docker logs -f 容器
#删除容器
docker rm 容器id
#重启删除容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
#######自定义镜像
# DockerFile
--------------------------------------------------
FROM centos #镜像以centos为基础
VOLUME ["volume01","volume02"] #镜像挂载
CMD echo "--end--"
CMD /bin/bash #完毕之后打印---end--- 走的是bash
--------------------------------------------------
#dockerfile编写的命令
FROM #这个镜像的基础镜像是谁
MAINTAINER #镜像是谁写的 姓名+邮箱
ADD #步骤 tomcat镜像,这个tomcat压缩包就是要ADD的
WORKDIR #镜像的工作目录
VOLUME #挂载的位置
EXPOSE #暴露端口
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBULID #当构建的时候,就会触发这个指令
ENV #构建的时候设置环境目录
RUN #想让他干点啥
#docker bulid 构建成为一个镜像 docker run 运行镜像 docker push 发布镜像(发布到DockerHub、阿里云镜像仓库!、私服)
#######Docker Compose
#Compose可以多容器快速部署
version: '3'
services:
web:
build: . // 当前目录下的文件构建成一个镜像使用
ports:
- "5000:5000"
redis:
image: "redis:alpine" // 镜像是来自仓库
#运行compose文件
docker-compose up
容器排布请详见本专栏k8s专栏