Docker

安装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专栏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值