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的主要内容,如果未能解决你的问题,请参考以下文章