docker

Posted xue_yun_xiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker相关的知识,希望对你有一定的参考价值。

一、引入原因

1、环境不一致

小明是一个程序员在开发环境(tomcat,jdk,mysql)编写调试,测试没有问题
现在需要将代码 发布线上(代码 )线上环境(tomcat jdk mysql),发现发布有bug, 不兼容回到开发环境没有问题
代码 和 mysql tomcat 不匹配造成

2、隔离性

一台服务器 可以运行多个 应用 ,应用之间互相影响
应用a (一个程序写一个死循环) 占用 cpu 100%
应用b 不能抢占cpu

3、弹性伸缩

弹性伸缩:一瞬间就可以将服务器集群快速的 扩大并启动 提供服务 (2-3分钟)

示例:
618 活动要来
平时并发量 1000个请求/s qps 2-3 tomcat
618并发 10000个请求/s qps 20台 tomcat (扩大20台 购买服务器 装系统 装jdk tomcat 发布代码 等弄好 620)

4、学习成本

学习MySQL 要安装 学习 redis 要安装 非常麻烦
Oracle 最难安装 卸载
以上问题 都可以使用docker 解决

二、docker概述

Docker 中文 码头工人
Docker:其实是一个虚拟化工具 类似于 vmware,但是更加轻量级 ,dokcer 是进程级别的(使用宿主 cpu 内存 硬盘), vmware 是系统级别,必须有自己的硬盘 内存 cpu

集装箱: 特点就是标准化

在docker 中集装箱就是 封装了 代码需要的环境(jdk tomcat mysql 及代码) 又称为镜像

镜像:就是集装箱

容器: 就是运行起来的镜像 (镜像类似软件 运行行起来 变为 容器)。 一个镜像 可以运行多次 生成多个容器

容器于容器之间是隔离的 不受其他容器影响,具有隔离性

中央仓库|注册中心: 指的码头,存放的都是 集装箱 /镜像(image)

三、安装docker

前提

1、能够访问外网

ping www.baidu.com

2、关闭防火墙

[root@mastera ~]# systemctl status firewalld

1、安装docker 依赖环境

yum -y install yum-utils device-mapper-persistent-data lvm2

2、下载docker 安装源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、安装

yum makecache fast
yum -y install docker-ce

4、启动

[root@mastera ~]# systemctl start docker
[root@mastera ~]# systemctl status docker

5、测试

 docker run hello-world

使用docker 运行 hello-world 镜像,启动为容器
但是本地没有镜像,所以docker 会自动去中央仓库 去拉取镜像,下载下来再运行镜像

四、中央仓库

中央仓库 https://hub.docker.com/ 在国外,访问很慢

需要配置 阿里云镜像 仓库

第一步:

mkdir -p /etc/docker

第二步:

sudo tee /etc/docker/daemon.json <<-'EOF'

"registry-mirrors": ["https://66zydtxx.mirror.aliyuncs.com"]

EOF

效果:

[root@mastera ~]# vim /etc/docker/daemon.json 

第三步:重置docker

[root@mastera ~]# sudo systemctl daemon-reload  # 重置配置
[root@mastera ~]# sudo systemctl restart docker  #重启docker

注意!!!!!!!

1.凡是重启网卡之后(systemctl restart networdk ) 必须重启docker (systemctl restart docker )
2.凡是关闭/开启防火墙 都要必须重启docker (systemctl restart docker )

五、镜像

镜像:就是集装箱 ,环境 (jdk,myslq,tomcat)+ 代码
镜像来源:中央仓库https://hub.docker.com/ 还可以自己制作镜像

1、查看本地镜像列表

[root@mastera ~]# docker image ls  
[root@mastera ~]# docker images

找到本地镜像,两种方式都可以找到
1.镜像名:标签 hello-world:latest
2.镜像id d1165f221234

2、强制删除镜像

[root@mastera ~]# docker rmi -f  d1165f221234 # 镜像id
Untagged: hello-world:latest
Untagged: hello-world@sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
[root@mastera ~]# docker rmi -f hello-world:latest  # 使用-f 强制删除 镜像名:版本号

3、拉取镜像

[root@mastera ~]# docker pull hello-world[root@mastera ~]# docker pull hello-world:latest

4、运行镜像

docker run 镜像名:版本号
docker run 镜像id

[root@mastera ~]# docker run hello-world:latest   
[root@mastera ~]# docker run d1165f221234

5、导出镜像

docker save -o 路径 镜像id/镜像名:版本号

[root@mastera ~]# docker save -o  /root/hello-world.tar.gz d1165f221234

6、导入镜像

[root@mastera ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@mastera ~]# docker load -i  hello-world.tar.gz 
Loaded image ID: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
[root@mastera ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
<none>       <none>    d1165f221234   2 months ago   13.3kB

7、打标签重命名

[root@mastera ~]# docker tag d1165f221234   hello-world:v1
[root@mastera ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   v1        d1165f221234   2 months ago   13.3kB


六、容器

容器 :镜像运行起来就是容器
容器有 生老病死 运行态 停止态

1、启动容器

docker  run   镜像名:版本号/ 镜像id  

如果docker本地没有对应镜像 ,会先去中央仓库拉取对应镜像

2、查看容器

[root@mastera ~]# docker ps # 查看运行的 容器
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@mastera ~]# docker ps -a  # 查看所有的容器


3、显示所有容器id

[root@mastera ~]# docker ps -aq
8e72afd8fcf4
f1ceab65e157
c6c6a37d9f7d
b4efd9ef018d
159c6c292365
3cba5dfa0f6b
008ba03672df

4、删除容器

[root@mastera ~]# docker rm  f1ceab65e157 # 根据容器的id删除未运行容器
[root@mastera ~]# docker rm vigorous_tu # 根据容器name   删除未运行容器

[root@mastera ~]# docker rm -f  容器名/容器id # 根据容器name强行删除运行中容器

停止容器
docker stop 容器名/容器id
[root@mastera ~]# docker stop tomcat
tomcat
[root@mastera ~]# docker stop mysql
mysql

删除容器
docker rm 容器名/容器id # 删除的都是停止的容器
[root@mastera ~]# docker rm mysql

docker rm -f 容器名/容器id # 强制删除运行的容器
[root@mastera ~]# docker rm -f tomcat

5、启动tomcat

[root@mastera ~]# docker run  --name tomcat  -p 8089:8080     daocloud.io/library/tomcat:8.5.15-jre8

--name  tomecat  指定要启动容器的名字 ,不可以重复
-p    8089:8080   linux端口映射 容器中端口8080(taomcat)


后台运行tomcat

[root@mastera ~]# docker run  --name tomcat  -p 8089:8080  -d   daocloud.io/library/tomcat:8.5.15-jre8

6、查看日志

docker logs -f 容器名/容器

[root@mastera ~]# docker ps
CONTAINER ID   IMAGE                                    COMMAND             CREATED         STATUS         PORTS                                       NAMES
434e86c5df52   daocloud.io/library/tomcat:8.5.15-jre8   "catalina.sh run"   3 seconds ago   Up 2 seconds   0.0.0.0:8089->8080/tcp, :::8089->8080/tcp   tomcat
[root@mastera ~]# docker logs -f tomcat

7、进入容器内部

docker exec -it 容器名/容器id bash

从容器内部退出:exit

root@434e86c5df52:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@434e86c5df52:/usr/local/tomcat/webapps# exit

9、将linux文件拷贝到容器中

docker cp linux 文件 容器id:容器中的路径

[root@mastera ~]# docker cp a1.txt  434e86c5df52:/usr/local/tomcat/webapps

8、将容器中的文件拷贝到linux

docker cp 容器id:/路径 linux 路径

[root@mastera ~]# docker cp   434e86c5df52:/usr/local/tomcat/webapps/a1.txt   /root/test2
[root@mastera ~]# ls /root/test2
a  a1.txt  anaconda-ks.cfg  test1
[root@mastera ~]# 

9、docker安装mysql

1、前提

一定要检查网络
将linux 安装的mysql 停止

[root@mastera ~]# systemctl status mysqld
[root@mastera ~]# systemctl stop  mysqld

2、安装

[root@mastera ~]# docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4

3、进入容器内部,登陆

[root@mastera ~]# docker exec -it mysql  bash
root@a7813ee3d213:/usr/local/mysql# ls
COPYING  INSTALL-BINARY  README  bin  data  docs  include  lib	man  my.cnf  scripts  share  support-files
root@a7813ee3d213:/usr/local/mysql# mysql -uroot -p


10、删除所有容器

[root@mastera ~]# docker rm -f $(docker ps -aq)

七、数据卷

数据卷:其实就是docker存储数据的文件夹 ,就是文件夹
​ 普通文件夹也可以作为数据卷
相当于开了一个后门通道:可以在linux 修改文件,容器可以实时看到,两者实时同步

1、创建数据卷

[root@mastera ~]# docker volume create vdata1  #创建数据卷
vdata1
[root@mastera ~]# docker volume ls   # 显示数据卷列表

2、查看数据卷详细信息

[root@mastera ~]# docker volume inspect vdata1

3、删除数据卷

[root@mastera ~]# docker volume rm  vdata1
vdata1
[root@mastera ~]# docker volume ls
DRIVER    VOLUME NAME
local     7df7314b715be9b7b45f72bcc984f969990f9537912eac01b6c102247eb5f4fd
local     e916a080a00f3d84460e30137e2066b4f9fd4e87e9d1e6c79de31422872ffb53
[root@mastera ~]# ls /var/lib/docker/volumes/vdata1/_data
ls: 无法访问/var/lib/docker/volumes/vdata1/_data: 没有那个文件或目录

4、将数据卷挂载到容器中

前提:停止所要挂载的容器

[root@mastera ~]# docker run -v vdata2:/usr/local/tomcat/conf -d -p 8089:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8



五、Dockerfile

Dockerfile 制作镜像

例子:
创建一个springboot应用,将对应的jar 生成一个 镜像,在docker 中运行,并可以在window 访问

第一步:创建springboot工程,导入依赖

<groupId>com.qfedu</groupId>
    <artifactId>day64_springboot</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--引入父依赖
         当前工程 继承 父类工程  spring-boot-starter-parent pom
    -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>

        <!-- web相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- Spring Boot提供的配置处理器依赖

             作用就是:让自定义属性配置  在编写配置文件时有提示:
                       必须先编译才会有提示
         -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>


    </dependencies>

第二步:创建application.proerties

server.port=8088

第三步:添加打包工具,打包

<!--
        将当前应用达成一个 jar
    -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.0.RELEASE</version>
            </plugin>
        </plugins>
    </build>

第四步:启动应用测试

java -jar day68-docker-sprinboot-1.0-SNAPSHOT.jar


第五步:将jar 变为一个 镜像

[root@mastera ~]# mkdir dockerfile_test
[root@mastera ~]# cd dockerfile_test/

将 生成的jarday68-docker-sprinboot-1.0-SNAPSHOT.jar 上传 linux

[root@mastera dockerfile_test]# ls
day68-docker-sprinboot-1.0-SNAPSHOT.jar

第六步:创建Dockerfile

[root@mastera dockerfile_test]# vim Dockerfile
[root@mastera dockerfile_test]# ls
day68-docker-sprinboot-1.0-SNAPSHOT.jar  Dockerfile
FROM java:8
ADD day68-docker-sprinboot-1.0-SNAPSHOT.jar  app.jar
RUN echo 'test***********'
EXPOSE 8088
VOLUME /data
CMD java -jar app.jar

第七步:构建镜像

[root@mastera dockerfile_test]# docker build -t springboottest:v1 .
Sending build context to Docker daemon  26.89MB

-t  制定镜像的名字 版本
.   构建当前镜像的 Dockerfile  在当前目录

第八步:查看镜像

第九步:启动镜像

[root@mastera dockerfile_test]# docker volume create vdata3
vdata3
[root@mastera dockerfile_test]# docker volume ls
DRIVER    VOLUME NAME
local     7df7314b715be9b7b45f72bcc984f969990f9537912eac01b6c102247eb5f4fd
local     e916a080a00f3d84460e30137e2066b4f9fd4e87e9d1e6c79de31422872ffb53
local     vdata2
local     vdata3
[root@mastera dockerfile_test]# docker run -p 8088:8088  -v vdata3:/data  springboottest:v1

以上是关于docker的主要内容,如果未能解决你的问题,请参考以下文章

docker教程---介绍

Docker介绍

docker简单介绍。

docker思想详解

Docker 是什么

LEADER_NOT_AVAILABLE - 码头集装箱