Docker容器化技术
1.Docker概念
- Docker是一个开源的应用容器引擎
- 基于go语言实现
- Docker可以让开发者们打包他们的应用以及依赖包到一个轻量级的、可移植的容器中,然后发布到任何流行的Linux机器上
- 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低
- Docker从17.03版本开始分为CE和EE
结:docker是一种容器技术,解决软件跨环境迁移的问题
2.docker的安装
shell
#1.yum包更新到最新
yum update
shell
#2.安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
shell
#3.设置yum源
yum-config-manager --add-repo https://download.docker .com/linux/centos/docker-ce.repo
shell
#4.安装docker
yum install -y docker-ce
shell
#5.查看版本
docker -version
报错时:
可在/etc/docker下配置阿里云的镜像加速器
shell
vim daemon.json
{
"registry-mirrors":["https://alzgoonw.mirror.aliyuncs.com"]
}
3.docker架构
4.docker命令
4.1Docker服务相关命令-daemon
-
启动docker服务
-
停止
-
重启
-
查看状态
-
开机自启动
shellsystemctl start docker systemctl stop docker systemctl restart docker systemctl status docker systemctl enable docker
4.2Docker镜像相关命令-image
-
查看本地镜像
shelldocker images docker images -q #镜像ID
-
搜索Docker Hub中镜像
shelldocker search redis
-
从仓库拉取镜像至本地
shelldocker pull redis #(默认最新版本latest) docker pull redis:5.0 #镜像版本从hub.docker.com上查看
-
删除本地镜像
shelldocker rmi {ID} docker rmi `docker images -q` #全部删除
4.3Docker容器相关命令【重】
-
查看容器
shelldocker ps #查看运行中的容器 docker ps -a # 查看所有容器 docker ps -aq # 查看所有容器ID
-
创建容器
shelldocker run -it --name=c1 centos:7 /bin/bash #-it交互式启动容器后,分配一个伪终端进入容器,exit命令退出关闭容器 /bin/bash容器启动后执行 docker run -id --name=c1 centos:7 #-id守护式启动容器,后台运行,使用docker exec进入容器,exit退出后不会关闭容器
-
进入容器
shelldocker exec -it c2 /bin/bash
-
启动容器
shelldocker start c2
-
停止容器
shelldocker stop c2
-
删除容器,需要停止容器
shelldocker rm c2 docker rm `docker ps -aq`
-
查看容器信息
shelldocker inspect
5.数据卷
5.1概念
思考:
- Docker容器删除后,在容器中产生的数据也会随之销毁
- Docker容器和外部机器可以直接交换文件吗?
- 容器之间想要进行数据交互?
数据卷概念:
- 宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器在该目录下修改数据时,数据卷上的数据随之改变,另一个容器的该目录下数据也随之改变
- 一个容器也可以被挂载多个数据卷
数据卷作用:
- 容器数据持久化
- 容器删除后,数据卷上的数据还存在
- 重新创建容器(-v 数据卷),容器依旧可以获得数据卷上的数据
- 外部机器和容器间通信
- 容器之间数据交换
5.2创建数据卷
shell
docker run -it --name=c2 -v /root/data2:/root/data_container2 -v /root/data3:/root/data_container3 centos:7 #-v 参数 宿主机目录:容器目录,目录不存在,自动创建 #数据持久化
5.3数据卷容器
shell
#1.创建启动c3数据卷容器,使用-v参数设置数据卷
docker run -it --name=c3 /volume centos:7
#2.创建启动c1、c2容器,使用--volumes-from参数设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7
docker run -it --name=c2 --volumes-from c3 centos:7
和多容器挂载同一个宿主机目录:
多容器挂载:如果容器多的话,操作麻烦,数据保存、持久化、回复比较麻烦
6.应用部署
6.1MySQL部署
- 容器和外部机器不能够直接通信
- 容器和宿主机通信、宿主机和外部机器通信
- 以宿主机为桥,端口映射
-
搜索mysql镜像
shelldocker search mysql
-
拉取mysql镜像
shelldocker pull mysql:5.6
-
创建容器
shell#宿主机/root/mysql下 docker run -id \ -p 3307:3306 \ #端口映射,使外部机器连上容器c_mysql --name=c_mysql \ -v /root/mysql/conf:/etc/mysql/comf.d \ #目录映射,数据卷 -v /root/mysql/logs:/logs \ -v /root/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
6.2Tomcat部署
-
搜索tomcat镜像
shelldocker search tomcat
-
拉取tomcat镜像
shelldocker pull tomcat
-
创建容器
shellmkdir /root/tomcat cd /root/tomcat
shelldocker run -id --name=c_tomcat \ -p 8080:8080 \ -v $PWD:/usr/local/tomcat/webapps \ #$PWD宿主机的当前目录 tomcat
-
使用外部机器访问tomcat
在宿主机/root/tomcat下
shell[root@localhost tomcat]# mkdir test [root@localhost tomcat]# cd test/ [root@localhost test]# vim index.html
shell#访问路径 http://192.168.202.23:8080/test/index.html
6.3Nginx部署
-
搜索tomcat镜像
shelldocker search nginx
-
拉取tomcat镜像
shelldocker pull nginx:1.18
-
创建容器
shellmkdir /root/nginx cd /root/nginx
shelldocker 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:1.18
-
使用外部机器访问tomcat
6.4Redis部署
-
创建容器c_redis
shelldocker run -id --name=c_redis -p 6379:6379 redis:5.0
-
windows上连接
- 在D:\Redis\Redis-x64-3.2.100>位置
7.Dockerfile
7.1Docker镜像原理
- Docker镜像本质是什么?
- 是一个分层文件系统
- Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的ios文件要几个G?
- centos的ios镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
- Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB
- 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小500多MB
7.2镜像制作
-
容器转镜像
-
Dockerfile
-
案例1
-
自定义centos7镜像,要求:
- 默认登录路径:/usr
- 可以使用vim
-
步骤
- 定义父镜像:FROM centos:7
- 定义作者信息:MAINTAINER yehuda <yehuda@yh.cn>
- 执行安装vim命令:RUN yun install -y vim
- 定义默认的工作目录:WORKDIR/usr
- 定义容器启动执行的命令:CMD/bin/bash
shelldocker build \ -f ./centos_dockerfile \ #dockerfile文件目录 -t yehuda_centos:1 . #新镜像命名:版本号
-
-
案例2
-
复制jar包springboot2-0.0.1-SNAPSHOT.jar
-
编写dockerfile文件
shellFROM java:8 MAINTAINER yehuda <12933787@qq.com> ADD springboot2-0.0.1-SNAPSHOT.jar app.jar CMD java -jar app.jar
-
使用dockerfile文件创建镜像
shelldocker build -f ./java_springboot_dockerfile -t javaapp_jar:5.7 .
-
使用镜像创建容器
shelldocker run -id -p 9000:8058 javaapp_jar:5.7 #省略--name 系统自命名
-
8.Docker服务编排
8.1Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
一、安装docker-compose
shell
#安装,以编译好的二进制包方式安装在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
#设置权限
chmod +x /usr/local/bin/docker-compose
#查看版本信息
docker-compose -version
二、卸载
shell
#二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
三、使用docker-compose编排nginx+springboot项目
1.创建docker-compose目录
shell
mkdir ~/docker-compose
cd ~/docker-compose
2.编写docker-compose.yml文件
shell
version: `3`
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
3.创建./nginx/conf.d目录
shell
mkdir -p ./nginx/conf.d
4.在./nginx/conf.d目录下编写yh.conf文件
shell
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8058;
}
}
5.在~/docker-compose目录下使用docker-compose启动容器
shell
docker-compose up
6.测试访问
shell
http://192.168.202.23/hello
9.Docker私有仓库
9.1私有仓库搭建
shell
#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
{
"registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.202.23:5000"]
}
#5.重启docker
systemctl restart docker
docker start registry
9.2镜像上传到私有仓库
shell
#1.标记镜像为私有仓库的镜像
docker tag centos:7 192.168.202.23:5000/centos:7
#2.上传标记的镜像
docker push 192.168.202.23:5000/centos:7
9.3从私有仓库拉取镜像
shell
#1.拉取镜像
docker pull 192.168.202.23:5000/centos:7