05_应用容器-Docker

1.初始Docker

1.1.引入

正常情况
图片.png

异常情况:开发环境和测试环境jdk版本不同即环境不同,导致代码出错
图片.png
解决方式:war包和环境一起打包放在一个容器,给测试,给生产
图片.png
这个docker就是这个容器

1.2.概念

图片.png

1.3.安装docker

图片.png
# 1、yum 包更新到最新 
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y 
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
  • yum install -y docker-ce执行此命令可能会安装失败,再次安装即可

1.4.Docker架构

图片.png

安装完docker,他会以守护进程(daemon后台运行)的形式存在,docker内部有两个东西:镜像和容器。镜像是类,容器是实例,host里的镜像来源于远程的仓库,仓库分为官方仓库和私有仓库。客户端发送命令给守护进程。来进行操作。

1.5.配置镜像加速器

图片.png
image.png
图片.png
  • 复制所有命令并执行
  • 阿里云需要登录,每个人的地址不一样 配置完执行cat /etc/docker/daemon.json查看内容

2.Docker命令

2.1.服务相关命令(守护进程相关命令)

图片.png

2.2.操作镜像

  • 查看镜像(本地)
    image.png
  • 搜索镜像(远程仓库)
    image.png
  • 拉取镜像(远程仓库)不指定版本,默认下最新的版本
    image.png
    如果要查看版本需要去https://hub.docker.com/
    image.png
  • 删除镜像(本地)
    image.png

    如果 id重复就会报错,可以通过名称加版本进行删除 docker rmi redis:latest

  • 查询所有镜像的id。docker images -q
  • 删除所有的镜像docker rmi `docker images -q`
  • 总结
    image.png

2.3.操作容器(最重要)

image.png

容器是由镜像这个物理文件运行起来的实例

  • 创建并进入容器
    image.png

    -i表示容器一直运行 -t表示给容器分配一个伪终端(输入完该指令立刻进入容器) --name给容器起个名字 指定镜像以及版本 /bin/bash进入容器的初始化指令

  • --name=c1 --name c1 等号空格都可以
  • 退出容器 exit
  • 查看容器(正在运行以及历史运行的记录)
    image.png
  • 创建容器不进入,后台运行
    image.png

    -d 后台运行 不进入不需要写/bin/bash

  • 查看容器
    image.png
  • 进入容器
    image.png
  • 通过-id方式创建容器 通过exec进入容器,这种方式退出exit,容器不会关闭
  • 小结
    image.png

    进入容器可以加/bin/bash,可以不加,不加默认也是此

  • 启动容器 docker start c4
  • 关闭容器 docker stop c4
  • 删除容器 docker rm c4 (也可以加容器的id)
  • 删除容器 docker rm c1 c2 c3 c4
  • 删除所有容器 docker rm docker ps -aq 不能包含正在运行的容器
  • 查看容器信息 docker inspect c4
  • 小结
    image.png

3.Docker容器数据卷

3.1.数据卷概念及作用

image.png
image.png
image.png

3.2.配置数据卷

image.png
  • docker run -it --name=c1 -v /root/data:/root/data_container centos:7 /bin/bash
  • 容器中的/root/data目录下touch a.txt 宿主机对应目录也可以看到该文件
  • echo hello > a.txt 无论在哪个目录下的文档输入文字 另一个目录下文档都可以查看到内容
  • cat a.txt
  • docker中关闭 删除容器,宿主机目录和内容都存在的
  • 再次挂载宿主机数据卷docker run -it --name=c1 -v ~/data:/root/data_container centos:7
  • 一个容器挂载多个目录docker run -it --name=c2 -v ~/data2:/root/data2 -v ~/data3:/root/data3 centos:7
    图片.png
  • 两个容器挂载同一个数据卷docker run -it --name c3 -v ~/data:/root/data centos:7 docker run -it --name c4 -v ~/data:/root/data centos:7
  • 在一个容器的data目录下创建目录 另一个容器的data目录下能看到目录

3.3.配置数据卷容器

图片.png

c3挂载了一个数据卷,c1 c2分别挂载到c3上 ,相当于c1 c2 c3挂载到同一个数据卷 c1 c2 c3可以进行数据传输和通信 即使c3挂了 c1c2仍然可以通过数据卷通信
图片.png
  • 查看容器绑定目录情况 docker inspect c1
    图片.png
    图片.png

    /volume是容器目录,相当于宿主机目录没有写,docker会自动分配
    图片.png
    docker run -it --name c1 --volumes-from c3 centos:7执行 c1有volume目录
    图片.png
    查看c1,发现c1绑定的数据卷就是c3绑定的数据卷

3.4.小结

图片.png

4.Docker应用部署

4.1.MySQL部署

图片.png
图片.png
docker search mysql
docker pull mysql:5.6
cd /opt
mkdir mysql
cd mysql

docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
图片.png
  • 进入容器docker exec -it c_mysql /bin/bash 输入用户名 密码 就可以输入sql语句了


    图片.png
    图片.png

4.2.Tomcat部署

图片.png
docker search tomcat
docker pull tomcat
mkdir /opt/tomcat
cd /opt/tomcat

docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat 

图片.png
图片.png
手动创建一个项目,编写一个html,浏览器访问http://116.62.133.122:8080/test/index.html

4.3.Nginx部署

图片.png
mkdir /opt/nginx
cd  /opt/nginx
mkdir conf
cd conf
vim nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

docker search nginx
docker pull nginx

启动ngnix 在/opt/nginx启动
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
图片.png

编写html 直接访问http://116.62.133.122/

4.4.Redis部署

图片.png
图片.png
图片.png

5.Dockerfile

5.1.Docker镜像原理

图片.png
图片.png
图片.png
  • docker启动非常快的原因是docker用的宿主机的内核(bootfs)
  • 自己开linux系统就很慢,创建centos容器快,安装centos系统慢,docker做了一个复用。
  • linux系统装一个windows的docker是不行的,因为内核不一样,不能复用。
  • 下载tomcat镜像,首先看有没有jdk镜像,没有的话先下载jdk,jdk又依赖基础镜像,还需要下基础镜像,这三个组合起来称为tomcat镜像,对外暴露的tomcat镜像
  • 文件叠加的好处:如果再下载centos镜像,他也依赖基础镜像,如果基础镜像docker有,就不用下载了,可以复用
  • 叠加的操作叫统一文件系统
  • 只读意思不能改,改了别人就没法复用了


    图片.png
    图片.png

    下载的时候可以看到一层一层下载
    图片.png
    下载完 看详细信息也可以看到分层的信息docker inspect tomcat:latest

5.2.Docker镜像制作

图片.png
  • 容器改了一点东西,可以转换成新的镜像,期望改的东西传给其他人(tomcat部署了应用)
  • 新的镜像如何传给别人(测试人员),需要压缩,压缩文件可以传输
  • 测试人员把压缩文件还原成镜像,运行即可
  • docker里面的id使用的时候不用复制全,复制前几位不重复即可
  • 容器目录挂载的东西(比如 tomcat下 webapps目录有个项目test),转镜像的时候不会写入,通过数据卷的方式传入的东西commit不会写入
  • 容器处理挂载的东西,其他目录新建的文件在转镜像的时候,会写入镜像
docker ps -a
docker commit 1f04cab bj_tomcat:1.0
docker rmi 0c943f

进入容器 在root目录新建文件
docker exec -it c_tomcat bash
cd ~
touch b.txt

docker save -o bj_tomcat.tar bj_tomcat:1.0
当前目录 会有一个tar文件
删除镜像 然后把tar文件还原成镜像
docker load -i bj_tomcat.tar 

5.3.Dockerfile概念及作用

图片.png

5.4.Dockerfile关键字

图片.png
图片.png

5.5.Docker案例1

图片.png

看一下别人写好的镜像创建容器啥样的
图片.png
图片.png
mkdir docker-files
cd docker-files/
vim centos_dockerfile

FROM centos:7
MAINTAINER bj<bj910521@163.com>

RUN yum install -y vim
WORKDIR /usr

cmd /bin/bash

docker build -f ./centos_dockerfile  -t bj_centos:1 .
图片.png
图片.png

每一条指令构建一层
图片.png

5.6.Docker案例2

图片.png
  • 把springboot打成jar包,cmd运行java -jar ./springboot-hello-0.0.1-SNAPSHOT.jar
  • put F:\BaiduNetdiskDownload\5.阶段五-流行框架\6.docker\代码\springboot-hello-0.0.1-SNAPSHOT.jar
  • mv springboot-hello-0.0.1-SNAPSHOT.jar docker-files/
  • docker pull java:8 依赖的父镜像,可以提前下,也可以不下,如果机器没有会自动下的
FROM java:8
MAINTAINER bj<bj910521@163.com>

ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
  • docker build -f ./springboot_dockerfile -t app .
  • docker run -id -p9000:8080 app 因为只要运行 无需进入 所以不起名字 系统默认分配 端口要映射
  • http://116.62.133.122:9000/hello

6.Docker服务编排

6.1.服务编排概念

图片.png

6.2.Docker Compose概述

图片.png

6.3.案例

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

使用docker compose编排nginx+springboot项目

mkdir ~/docker-compose
cd ~/docker-compose
#编写 docker-compose.yml 文件
version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"
#创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
#在./nginx/conf.d目录下 编写itheima.conf文件
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }
   
}
#在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up

7.Docker私有仓库

7.1.搭建私有仓库

# 1、拉取私有仓库镜像 
docker pull registry
# 2、启动私有仓库容器 
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json   
vim /etc/docker/daemon.json    
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip 
{"insecure-registries":["私有仓库服务器ip:5000"]} 
# 5、重启docker 服务 
systemctl restart docker
docker start registry
图片.png

7.2.上传镜像到私有仓库

# 1、标记镜像为私有仓库的镜像     
docker tag centos:7 私有仓库服务器IP:5000/centos:7
 
# 2、上传标记的镜像     
docker push 私有仓库服务器IP:5000/centos:7
图片.png

7.3.从私有仓库拉取镜像

#拉取镜像 
docker pull 私有仓库服务器ip:5000/centos:7

8.Docker相关概念

8.1.Docker容器虚拟化与传统虚拟机比较

图片.png
图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容