目录
1 初识Docker
1.1 Docker
代码开发涉及不同的环境
ps:开发环境和测试环境不同,会报bug。
Docker: 是一个开源的应用容器引擎。诞生于2013年,基于Go语言。
- 可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到Linux机器上;
- 完全使用沙箱机制,相互隔离;
- 分为CE(社区版)和EE(企业版)
1.2 安装Docker
#yum包更新
yum update
#安装需要的软件包,yum-util提供yum-config-manger功能,另外两个是deviceapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#安装docker,出现输入的界面都按y
yum install -y docker-ce
#查看docker版本,验证是否成功
docker -v
1.3 Docker架构
镜像(Image):相当于一个root文件系统,比如官方镜像ubuntu16.04就是包含了完整的一套ubuntu16.04最小系统的root文件系统;
容器(contrainer):镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器时镜像运行时的实体。容器可以创建、启动、删除、暂定等;
1.4 配置加速器
●USTC:中科大镜像加速器
●阿里云
●网易云
●腾讯云
例如:阿里云,登录账号--左上角的产品与服务--容器镜像服务--镜像加速器文档
根据文档上操作即可。
2 Docker命令
2.1 Docker服务相关命令(daemon)
#1.启动docker服务
systemctl start docker
#2.查看状态
systemctl status docker ##activate(running)显示正在运行中
#3.停止
systemctl stop docker
#4.重启
restart docker
#5.开机启动docker
systemctl enable docker
2.2 Docker镜像相关命令(Image)
#查看镜像
docker images #查看本地
#搜索镜像
docker search redis
#拉取镜像
docker pull redis
#删除
docker rmi id
#id查看用docker images查看
#删除所有的镜像
docker rmi 'docker images -q'
2.3 Docker容器相关命令(container)
#1.查看容器
docker images
#2.创建容器
docker run -it --name=hxf centos:7 /bin/bash
#查看内容
ll
#退出容器
exit
#i:保持容器运行,通常与t同时使用
#3.查看正在运行的容器
docker ps
#全部的
docker ps -a
#进入容器内部 ,退出容器不会关闭
docker exec -it hxf /bin/bash
ll
exit
#t:为容器重新分配一个输入终端,通常于i同时使用
#4.停止容器
docker stop hxf
docker ps -a
#5.启动容器
docker start hxf
#6.删除容器
docker rm hxf
#删除所有的容器
docker ps -aq
docker rm 'docker ps -aq' #ps:不能删除正在运行的容器
#查看容器的信息
docker inspect hxf
3.Docker容器的数据卷
问题引入:
docker的容器删除后,在容器中产生的数据还在吗? 不在了
Docker容器和外部机器可以直接交换文件吗?
容器之间想要进行数据交换?
3.1 数据卷
数据卷是宿主机的一个目录或文件;
当容器目录和数据卷目录绑定后,对方的修改会立即同步;
一个数据卷可以被多个容器同时挂载;
数据卷的作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
3.2 数据卷配置
docker run ... -v 宿主机目录(文件):容器内目录(文件)...
注意:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
docker ps -a
docker images
#创建数据卷
docker run -it --name=hxf1 -v /root/data:/root/data_container centos:7 /bin/bash
##打开新的窗口:文件--克隆会话
##宿主机中
cd data
ll
touch dockerlearning.txt
##切换容器
cd data_container/
ll
#可以看到文件同步
#在容器中
echo itcast > a.txt
ll
#查看文件内容
cat a.txt
##切换至宿主机,发现文件也可以同步
##一个容器可以挂载多个目录
docker run -it --name=hxf \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
##创建两个容器
docker run -it --name-hxf2 -v ~/data:/root/data centos:7
cd ~
ll
##克隆一个会话
docker run -it --name-hxf3 -v ~/data:/root/data centos:7
##在hxf3写些内容
echo itcast > itcast.txt
ll
cat itcast.txt
ps:通过数据卷可以同时挂载到两个容器上。
3.3 数据卷容器
多容器进行数据交换:
- 多个容器挂载同一个数据卷
- 数据卷容器
##配置数据卷容器
docker ps -a
ll
docker inspect
#1.创建启动数据卷容器,使用-v参数 设置数据卷
docker run -it --name=hxf2 -v /volume centos:7 /bin/bash
#2.创建启动hxf hxf1 容器,使用--volume-from参数设置数据卷
docker run -it --name=hxf --volume-from hxf2 centos:7 /bin/bash
docker run -it --name=hxf1 --volume-from hxf2 centos:7 /bin/bash
4.Docker的应用部署
4.1 MySQ部署
案例:在Docker中部署MySQL,并通过外部mysql客户端操作MySQL server
实现步骤:
- 搜索MySQL镜像
- 拉取MySQL镜像
- 创建容器
- 操作容器中MySQL
思考:外部机器和docker是不能直接通信,那怎么办呢?
以上操作被称为端口映射:将宿主机上的3307端口和容器中的3306端口进行映射,然后外部机器访问3307端口即可。
docker images
#查看有无镜像
#搜索镜像
docker search mysql
#拉取镜像
docker pull mysql:5.6
#创建容器,设置端口映射、目录映射
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \ #将容器的3306端口映射为宿主机的3307端口
--name=hxf_mysql \
-v $PWD/conf:/etc/mysql/conf.d \ #将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf配置目录
-v $PWD/logs:/logs \ #将主机当前目录的logs目录挂载到容器的logs
-v $PD/data:var/lib/mysql \ #当主机当前目录下的data目录挂载到容器的/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 \ #初始化用户密码
mysql:5.6
#进入容器内部
docker exec -it hxf_mysql /bin/bash
#登录
mysql -uroot -p
show datdabase;
create database db1;
本机连接:
4.2 Tomcat部署
案例:在Docker中部署Tomcat,并通过外部机器访问Tomcat
实现步骤:
- 搜索Tomcat镜像
- 拉取Tomcat镜像
- 部署项目
- 测试访问
docker search tomcat
docker pull tomcat
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=hxf_tomcat \
-p 8080:8080 \ #将容器的8080端口映射到主机8080端口
-v $PWD:/usr/local/tomcat/webapps \ #将主机中当前目录挂载到容器中的webapps
tomcat
4.3 Nginx部署
案例:在Docker中部署Nginx,并通过外部机器访问Nginx
实现步骤:
- 搜索Nginx镜像
- 拉取Nginx镜像
- 创建容器
- 测试访问
docker search nginx
docker pull nginx
#在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
#在~/nginx/conf下创建nginx.conf文件,粘贴官方文件内容
vim nginx.conf
docker run --id --name=hxf_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
4.4 Redis部署
案例:在Docker中部署Redis,并通过外部机器访问Redis
实现步骤:
- 搜索Redis镜像
- 拉取Redis镜像
- 创建容器
- 测试访问
docker search redis
docker pull redis:5.0
docker run -id --name=hxf_redis -p 6379:6379 redis:5.0
#使用外部机器连接redis
./redis-cli.exe -h 192.168.149.135 -p 6379
5.Dockerfile
5.1 Docker镜像原理
思考:
- docker镜像的本质是什么?--分层的文件系统
- docker中的一个centos镜像为什么只要200Mb,而一个centos操作系统的iso文件要几个G?--centos的iso镜像文件包含了bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层。
- docker中的一个tomcat镜像为什么要500Mb,而一个tomcat安装包只要70Mb?--由于docker中镜像是分层的,tomcat虽然只有70Mb,但他需要依赖于父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小500多Mb.
linux文件系统由bootfs和rootfs两部分组成。
- bootfs包含了bootloader(引导加载程序)和kernel(内核)
- rootfs包含root文件系统,包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目标和文件。
Docker镜像原理:
- Docker镜像是由特殊的文件系统叠加而成;
- 最低端是bootfs,并使用宿主机的bootfs;
- 第二层是root文件系统rootfs,成为base image;
- 然后再往上可以叠加其他镜像文件;
- 统一文件系统技术能够将不同的层整合成一个文件系统,为这些层提供一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统;
- 一个镜像可以放在另一个镜像上面,位于下面的镜像称为父镜像,最底部的镜像成为基础镜像;
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器;
5.2 Docker如何制作
容器转为镜像:
- docker commit 容器id 镜像名称:版本号
- docker save -o 压缩文件名称 镜像名称:版本号
- docker load -i 压缩文件名称
docker ps -a docker commit 3812 hxf_tomcat:1.0 docker images docker rmi 29b624 docker images docker exec -it hxf_tomcat bash docker save -o hxf_tomcat.tar hxf_tomcat:1.0 docker rmi 3ab93al docker load -i hxf_tomcat.tar docker images
dockerfile:
- 是一个文本文件
- 包含了一条条指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接那开发时所构建的镜像或者通过dockerfile文件构建一个新的镜像开始工作
- 对于运维人员:在部署时,可以实现应用的无缝移植
在hub.docker官网上进行查询,按照说明上的命令运行即可
5.3 Dockerfile案例
目标:定义dockerfile,发布boostrap项目
将已有的项目打包:maven projects--package
上传文件:Alt+P---put 包的路径名
cd ~
mv 项目文件 ./docker-files/
cd docker-files
vim springboot_dockerfile.txt
#定义父镜像:from java:8
FROM java:8
#定义作者信息
MAINTAINER hxf <hxf@itcast.cn>
#将jar包添加到容器
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
#定义
docker build -f ./springboot_dockerfile -t app .
docker images
docker run -id -p 9000:8080 app
docker ps -a
6. Docker服务编排
6.1 服务编排
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停
- 要从dockerfile build image 或者去dockerhub拉取image;
- 要创建多个container
- 要管理这些container(启动停止删除)
- 维护的工作量很大
服务编排:按照一定的业务 规则批量管理容器
6.2 Docker Compose
Docker Compose:是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤:
- 利用Dockerfile定义运行环境镜像;
- 使用docker-compose.yml定义组成应用的而各种服务;
- 运行docker-compose up 启动应用;
##安装docker compose
# Compose目前已经完全支持Linux. Mac os和windows,在我们安装Compose之前,需要先安装Docker.下面我们
以编译好的二进制包方式安装在L inux系统中。
Jur1 -L https://github. com/docker /compose/releases/down1oad/1.22.0/docker -compose-' uname -s '-' uname -m ' -o /usr/1ocal/bin/docker-compose
=设置文件可执行权限
chmod +x /usr/1ocal/bin/docker-compose
#查看版本信息
docker-compose -version
##卸载docker compose
#二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
##使用docker compose 编排nginx+springboot项目
#创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker
#编写docker-compose.yml文件
version: " 3"
services:
nginx:
inmage: nginx
ports:
-80:80
1inks :
-app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
-"8080"
vim docker-compose.yml
mkdir p ./nginx/conf.d
cd ./
#创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
#在./nginx/conf.d目录下编写hxf.conf文件
server{
listen 80;
access_1og off;
location / {
proxy_ pass http: //app:8080; #反向代理
}
#启动
docker-compose up
7.Docker的私有仓库
##1.私有仓库搭建
#拉取仓库镜像
docker pull registry
#启动私有仓库容器
docker run -id --name=registery -p 5000:5000 registry
#打开浏览器, 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]}表示私有仓库 搭建成功
#修改daemon.json
vim /etc/docker/daemon.json
#在上述文件中添加一个key,保存退出,此步用于让docker信任私有仓库地址,注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["私有仓库服务器ip:5000"]}
#重启docker服务
systemctl restart docker
docker start registry
##2.将镜像上传至私有仓库
#标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器IP:5000/centos:7
#上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7
以上笔记学习的课程是:黑马程序员 Docker教程!!