赞
踩
- [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
镜像相当于一个模板,就像java中的class一样
- #查看镜像
- docker images
- #帮助命令
- docker 命令 --help
- #搜索镜像命令
- docker search ..
- #下载镜像
- docker pull ..
- docker pull 镜像名[tag版本]
- #删除镜像
- docker rmi -f 镜像名||镜像id
容器:我们有了镜像之后才可以创建容器,容器就相当于对象,一个镜像可以创建出多个容器
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 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 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镜像是什么,镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含软件的所有东西,就是软件打包之后的轻量级软件包
所有的应用,直接打包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
- #获取镜像
- 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
构建的步骤
编写一个脚本文件
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 #想让他干点啥
- #创建自己的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网络,清空所有镜像
- #查看地址
- 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
- #首先构建一个spring boot项目
- Dockerflie
- FROM java:8
-
- COPY *.jar /app.jar
- CMD ["--server.port=8080"]
-
- EXPOSE 8080
- ENTRYPOINT ["java","-jar","/app.jar"]
- #写一个服务
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
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专栏
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。